[comment]: # ({f445d963-f445d963})
# 7 Fonctions prédictives de déclenchement

[comment]: # ({/f445d963-f445d963})

[comment]: # ({9dac6d6d-9dac6d6d})
#### Aperçu

Parfois, il y a des signes du problème à venir. Ces signes peuvent être repérés afin que des actions puissent être prises à l'avance pour prévenir ou au moins minimiser l'impact du problème.

Zabbix dispose d’outils permettant de prédire le comportement futur du système supervisé sur la base de données historiques. Ces outils sont exécutées via des fonctions prédictives de déclenchement.

[comment]: # ({/9dac6d6d-9dac6d6d})

[comment]: # ({827f1d5f-24b155a7})
#### Fonctions

Avant de définir un déclencheur, il est nécessaire de définir ce qu'est un état de problème et combien de temps est nécessaire pour agir. Il existe ensuite deux façons de configurer un déclencheur signalant une situation potentiellement indésirable. Premièrement : le déclencheur doit se déclencher lorsque le système est censé être dans un état de problème après le "temps d'action". Deuxièmement : le déclencheur doit se déclencher lorsque le système va atteindre l'état de problème dans moins de "temps d'action".

Les fonctions de déclencheur correspondantes à utiliser sont **forecast** et **timeleft**. Notez que l'analyse statistique sous-jacente est essentiellement identique pour les deux fonctions. Vous pouvez configurer un déclencheur de l'une ou l'autre manière, avec des résultats similaires.

[comment]: # ({/827f1d5f-24b155a7})

[comment]: # ({cbcb40b7-c80922f6})
#### Paramètres

Les deux fonctions utilisent presque le même ensemble de paramètres. Utilisez la liste des [fonctions prises en charge](/manual/appendix/functions) comme référence.

[comment]: # ({/cbcb40b7-c80922f6})

[comment]: # ({33e199b9-a93b071e})
##### Intervalle de temps

Tout d'abord, vous devez spécifier la période historique que Zabbix doit analyser pour établir la prédiction. Vous le faites de manière habituelle au moyen du paramètre `time period` et d'un décalage temporel facultatif, comme vous le faites avec les fonctions **avg**, **count**, **delta**, **max**, **min** et **sum**.

[comment]: # ({/33e199b9-a93b071e})

[comment]: # ({55d83c24-b922d0f2})
##### Horizon de prévision

(**forecast** uniquement)<br>
Le paramètre `time` spécifie jusqu'à quel point dans le futur Zabbix doit extrapoler les dépendances qu'il trouve dans les données historiques. Que vous utilisiez `time_shift` ou non, `time` est toujours compté à partir du moment actuel.

[comment]: # ({/55d83c24-b922d0f2})

[comment]: # ({1ccaacd1-625c0c85})
##### Seuil à atteindre

(**timeleft** uniquement)<br>
Le paramètre `threshold` spécifie une valeur que l'élément analysé doit atteindre,
peu importe qu'elle soit atteinte par le haut ou par le bas. Une fois que nous avons déterminé f(t)
(voir ci-dessous), nous devons résoudre l'équation f(t) = `threshold` et renvoyer la
racine la plus proche de maintenant et située à droite de maintenant, ou
1.7976931348623158E+308 s'il n'existe pas une telle racine.

::: notetip
Lorsque les valeurs de l'élément approchent le seuil puis le franchissent,
**timeleft** considère que l'intersection appartient déjà au passé et
passe donc à la prochaine intersection avec le niveau `threshold`, s'il y en a une. La bonne pratique consiste à utiliser les prédictions comme complément du diagnostic habituel des problèmes, et non comme substitut.^[1](#footnotes)^
:::

[comment]: # ({/1ccaacd1-625c0c85})

[comment]: # ({4d1deb86-976bd98e})
##### Fonctions d'ajustement

`fit` par défaut est la fonction *linéaire*. Mais si votre système surveillé est plus complexe, vous avez davantage d'options parmi lesquelles choisir.

|`fit`|x = f(t)|
|-----|--------|
|*linéaire*|x = a + b\*t|
|*polynomialN*^[2](#footnotes)^|x = a~0~ + a~1~\*t + a~2~\*t^2^ + ... + a~n~\*t^n^|
|*exponentielle*|x = a\*exp(b\*t)|
|*logarithmique*|x = a + b\*log(t)|
|*puissance*|x = a\*t^b^|

[comment]: # ({/4d1deb86-976bd98e})

[comment]: # ({3c1c1442-add67840})
##### Modes

(**forecast** uniquement)<br>
Chaque fois qu'une fonction de déclencheur est évaluée, elle récupère les données de la période d'historique spécifiée et ajuste une fonction spécifiée aux données. Ainsi, si les données sont légèrement différentes, la fonction ajustée sera légèrement différente. Si nous calculons simplement la valeur de la fonction ajustée à un moment spécifié dans le futur, vous ne saurez rien de la manière dont l'élément analysé est censé se comporter entre maintenant et ce moment futur. Pour certaines options de `fit` (comme *polynomial*), une simple valeur issue du futur peut être trompeuse.

|`mode`|résultat **forecast**|
|------|-------------------|
|*value*|f(now + `time`)|
|*max*|max~now\ <=\ t\ <=\ now\ +\ `time`~ f(t)|
|*min*|min~now\ <=\ t\ <=\ now\ +\ `time`~ f(t)|
|*delta*|*max* - *min*|
|*avg*|moyenne de f(t) (now <= t <= now + `time`) selon la [définition](https://en.wikipedia.org/wiki/Mean_of_a_function)|

[comment]: # ({/3c1c1442-add67840})

[comment]: # ({3f946ebf-5ff2285e})
#### Détails

Pour éviter des calculs avec des nombres énormes, nous considérons l’horodatage de la
première valeur dans la période spécifiée, plus 1 ns, comme un nouveau temps zéro (le temps
d’époque actuel est de l’ordre de 10^9^, le carré de l’époque est 10^18^, la précision
double est d’environ 10^-16^). 1 ns est ajouté afin de fournir toutes les valeurs de temps
positives pour les ajustements *logarithmiques* et *de puissance*, qui impliquent le calcul de
log(t). Le décalage temporel n’affecte pas les ajustements *linéaires*, *polynomiaux*,
*exponentiels* (à part des calculs plus simples et plus précis), mais modifie la forme des
fonctions *logarithmiques* et *de puissance*.

[comment]: # ({/3f946ebf-5ff2285e})

[comment]: # ({d180bad2-660cda6b})
#### Erreurs potentielles

Les fonctions renvoient -1 dans les situations suivantes :

- la période d'évaluation spécifiée ne contient aucune donnée ;
- le résultat de l'opération mathématique n'est pas défini^[3](#footnotes)^ ;
- complications numériques (malheureusement, pour certains ensembles de données d'entrée, la plage et la précision du format à virgule flottante en double précision deviennent insuffisantes)^[4](#footnotes)^.

::: notetip
Aucun avertissement ni erreur n'est signalé si l'ajustement choisi décrit mal les données fournies ou s'il y a simplement trop peu de données pour une prédiction précise.
:::

[comment]: # ({/d180bad2-660cda6b})

[comment]: # ({e57d3e18-06e0a230})
#### Exemples et gestion des erreurs

Pour obtenir un avertissement lorsque vous êtes sur le point de manquer d'espace disque libre sur
votre hôte, vous pouvez utiliser une expression de déclencheur comme celle-ci :

    timeleft(/host/vfs.fs.size[/,free],1h,0)<1h

Cependant, le code d'erreur -1 peut entrer en jeu et mettre votre déclencheur dans un
état de problème. En général, c'est une bonne chose, car vous recevez un avertissement indiquant que
vos prévisions ne fonctionnent pas correctement et que vous devriez les examiner plus
attentivement pour en déterminer la cause. Mais parfois, c'est problématique, car -1 peut simplement
signifier qu'aucune donnée concernant l'espace disque libre de l'hôte n'a été obtenue au cours de la dernière heure. Si vous obtenez trop de fausses alertes positives,
envisagez d'utiliser une expression de déclencheur plus complexe ^[5](#footnotes)^ :

    timeleft(/host/vfs.fs.size[/,free],1h,0)<1h and timeleft(/host/vfs.fs.size[/,free],1h,0)<>-1

La situation est un peu plus difficile avec **forecast**. Tout d'abord,
-1 peut ou non mettre le déclencheur dans un état de problème selon
que vous avez une expression comme `forecast(/host/item,(...))<...` ou
comme `forecast(/host/item,(...))>...`

En outre, -1 peut être une prévision valide si la valeur de l'élément est normalement négative. Mais la probabilité de cette situation dans le monde réel est négligeable (voir
[comment](/manual/config/triggers/expression) l'opérateur **=** fonctionne). Ajoutez donc `... or forecast(/host/item,(...))=-1` ou
`... and forecast(/host/item,(...))<>-1` si vous souhaitez ou non
traiter -1 comme un problème, respectivement.

#### Notes de bas de page

^**1**^ Par exemple, un déclencheur simple comme
    `timeleft(/host/item,1h,X) < 1h` peut passer à l'état de problème lorsque la
    valeur de l'élément approche X, puis se rétablir soudainement une fois la valeur X atteinte. Si le problème est que la valeur de l'élément est inférieure à X, utilisez :
    `last(/host/item) < X or timeleft(/host/item,1h,X) < 1h` Si le
    problème est que la valeur de l'élément est supérieure à X, utilisez :
    `last(/host/item) > X or timeleft(/host/item,1h,X) < 1h`

^**2**^ Le degré du polynôme peut aller de 1 à 6, *polynomial1* est équivalent
    à *linear*. Cependant, utilisez les polynômes de degré supérieur [avec
    prudence](https://en.wikipedia.org/wiki/Runge's_phenomenon). Si la période d'évaluation contient moins de points que nécessaire pour déterminer les coefficients du polynôme, le degré du polynôme sera abaissé (par exemple,
    *polynomial5* est demandé, mais il n'y a que 4 points, donc
    *polynomial3* sera ajusté).

^**3**^ Par exemple, l'ajustement des fonctions *exponential* ou *power* implique
    le calcul de log() des valeurs de l'élément. Si les données contiennent des zéros ou des nombres négatifs, vous obtiendrez une erreur, car log() est défini uniquement pour les valeurs positives.

^**4**^ Pour les ajustements *linear*, *exponential*, *logarithmic* et *power*, tous
    les calculs nécessaires peuvent être écrits explicitement. Pour *polynomial*,
    seule *value* peut être calculée sans étapes supplémentaires.
    Le calcul de *avg* implique le calcul de l'antidérivée du polynôme
    (analytiquement). Le calcul de *max*, *min* et *delta* implique
    le calcul de la dérivée du polynôme (analytiquement) et la recherche de ses racines
    (numériquement). Résoudre f(t) = 0 implique de trouver les racines du polynôme
    (numériquement).

^**5**^ Mais dans ce cas, -1 peut amener votre déclencheur à se rétablir
    de l'état de problème. Pour être totalement protégé, utilisez :
    `timeleft(/host/vfs.fs.size[/,free],1h,0)<1h and ({TRIGGER.VALUE}=0 and timeleft(/host/vfs.fs.size[/,free],1h,0)<>-1 or {TRIGGER.VALUE}=1)`

[comment]: # ({/e57d3e18-06e0a230})
