[comment]: # translation:outdated

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

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

[comment]: # ({56d990c3-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]: # ({/56d990c3-9dac6d6d})

[comment]: # ({1acb31e7-d35706b9})
#### - Fonctions

Il faut savoir comment définir un problème et combien de temps il faut
pour agir. Ensuite, il existe deux manières de configurer un déclencheur
signalant une situation potentiellement indésirable. Premièrement : le
déclencheur doit se déclencher lorsque le système après "temps pour
agir" est censé être en état de problème. Deuxièmement : le déclencheur
doit être déclenché lorsque le système va atteindre l'état problématique
en moins de "temps pour agir". Les fonctions de déclenchement
correspondantes à utiliser sont **forecast** et **timeleft**. Notez que
l'analyse statistique sous-jacente est fondamentalement identique pour
les deux fonctions. Vous pouvez configurer un déclencheur de la manière
que vous préférez avec des résultats similaires.

[comment]: # ({/1acb31e7-d35706b9})

[comment]: # ({d4d8083f-723c0c91})
#### - Paramètres

Les deux fonctions utilisent presque le même jeu de paramètres. Utilisez
la liste des [fonctions
supportées](/fr/manual/appendix/triggers/functions) comme référence.

[comment]: # ({/d4d8083f-723c0c91})

[comment]: # ({d2c1f272-83efb6ce})
##### - Intervalle de temps

Tout d’abord, vous devez spécifier la période historique que Zabbix doit
analyser pour établir une prédiction. Vous le faites de manière
familière au moyen du paramètre `sec` ou `#num` et de l'option
facultative `time_shift` comme vous le faites avec les fonctions
**avg**, **count**, **delta**, **max**, **min** et **sum**.

[comment]: # ({/d2c1f272-83efb6ce})

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

(**forecast** seulement)\
Le paramètre `time` spécifie combien de temps dans le futur Zabbix doit
extrapoler les dépendances trouvées dans les données historiques. Peu
importe si vous utilisez `time_shift` ou non, `time` est toujours compté
à partir du moment présent.

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

[comment]: # ({6acba6d4-625c0c85})
##### - Seuil à atteindre

(**timeleft** seulement)\
Le paramètre `threshold` spécifie une valeur que l'élément analysé doit
atteindre, aucune différence si elle est au dessus ou en dessous. Après
avoir déterminé f(t) (voir ci-dessous), nous devons résoudre l’équation
f(t) = `threshold` et renvoyer la racine la plus proche du moment
actuel, situé à droite du moment actuel, ou renvoyer 999999999999.9999
s’il n’existe pas de telles racines.

::: notetip
Lorsque les valeurs d'éléments s'approchent du seuil
puis le dépassent, **timeleft** suppose que l'intersection est déjà
passée et passe donc à la prochaine intersection avec le niveau de
`threshold`, le cas échéant. La meilleure pratique consiste à utiliser
les prévisions en complément des diagnostics de problèmes ordinaires, et
non en tant que substitution.[^1]
:::

[comment]: # ({/6acba6d4-625c0c85})

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

Par défaut, `fit` est une fonction *linéaire*. Mais si votre système
supervisé est plus compliqué, vous aurez plus d'options à choisir.

|`fit`|x = f(t)|
|-----|--------|
|*linéaire*|x = a + b\*t|
|*polynômeN*[^2]|x = a~0~ + a~1~\*t + a~2~\*t^2^ + ... + a~n~\*t^n^|
|*exponentiel*|x = a\*exp(b\*t)|
|*logarithmique*|x = a + b\*log(t)|
|*puissance*|x = a\*t^b^|

[comment]: # ({/404ad1f0-976bd98e})

[comment]: # ({13b9bb0b-add67840})
##### - Modes

(**forecast** seulement)\
Chaque fois qu'une fonction de déclenchement est évaluée, elle obtient
des données de la période d'historique spécifiée et adapte une fonction
spécifiée aux données. Donc, 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 à une heure future
spécifiée, vous ne saurez rien sur le comportement attendu de l'élément
analysé d'ici à ce moment-là.

Pour certaines options de `fit` (comme *polynôme*), une simple valeur
future peut être trompeuse.

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

[comment]: # ({/13b9bb0b-add67840})

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

Pour éviter les calculs avec de grands nombres, considérons l'horodatage
de la première valeur de la période spécifiée plus 1 ns comme une
nouvelle heure nulle (l'heure actuelle est de l'ordre de 10^9^, l'époque
au carré est de 10^18^, la double précision est d'environ 10^-16^). 1 ns
est ajoutée pour fournir toutes les valeurs de temps positives pour les
ajustements *logarithmiques* et les ajustements de *puissance*
impliquant le calcul de log(t). Le décalage temporel n'affecte pas les
calculs *linéaires*, *polynomiaux*, *exponentiels* (à l'exception des
calculs plus faciles et plus précis), mais modifie la forme des
fonctions *logarithmiques* et de *puissance*.

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

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

Les fonctions retournent -1 dans de telles situations :

-   la période d'évaluation spécifiée ne contient aucune donnée ;

```{=html}
<!-- -->
```
-   le résultat de l'opération mathématique n'est pas défini [^3] ;

```{=html}
<!-- -->
```
-   complications numériques (malheureusement, pour certains ensembles
    de données en entrée, la double précision et la virgule flottante
    sont insuffisantes) [^4].

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

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

[comment]: # ({8a6103e3-733d5140})
#### - Exemples et traitement des erreurs

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

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

Cependant, le code d'erreur -1 peut survenir et placer votre déclencheur
dans un état probléme. Généralement, c’est bien parce que vous recevez
un avertissement que vos prédictions ne fonctionnent pas correctement et
que vous devriez les examiner de plus près pour savoir pourquoi. Mais
parfois, c'est mauvais parce que -1 peut simplement signifier qu'il n'y
avait aucune donnée obtenue concernant l'espace disque disponible de
l'hôte au cours de la dernière heure. Si trop de faux positifs se
produisent, envisagez d'utiliser une expression de déclencheur plus
complexe [^5] :

    {host:vfs.fs.size[/,free].timeleft(1h,,0)}<1h and {host:vfs.fs.size[/,free].timeleft(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 probléme en fonction
de votre expression, telle que : `{host:item.forecast(...)}<...` ou
`{host:item.forecast(...)}>...`

De plus, -1 peut être une prévision valide s'il est normal que la valeur
de l'élément soit négative. Mais la probabilité de cette situation dans
la situation réelle est négligeable (voir [comment
fonctionne](/fr/manual/config/triggers/expression) l'opérateur **=**).
Ajoutez donc `... ou {host:item.forecast(...)}=-1` ou
`... et {host:item.forecast(...)}<>-1` si vous voulez ou ne voulez pas
traiter -1 comme un problème, respectivement.

#### Voir aussi

1.  [Fonctions prédictives de déclenchement
    (pdf)](http://zabbix.org/mw/images/1/18/Prediction_docs.pdf) sur
    zabbix.org

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

[^2]: Le degrès de polynôme peut aller de 1 à 6, *polynome1* est
    équivalent à *linéaire*. 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 polynomiaux, le degrès polynomial est
    abaissé (par exemple, le *polynôme5* est demandé, mais il n'y a que
    4 points, donc le *polynôme 3* sera ajusté).

[^3]: par exemple, l'ajustement des *fonctions exponentielles* ou des
    *puissances* implique le calcul de log() des valeurs d'é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 *linéaire*, *exponentiel*, *logarithmique* et *puissance*
    l'ajustement de tous les calculs nécessaires pouvent être écrits
    explicitement. Pour *polynôme* seule la *valeur* peut être calculée
    sans étape supplémentaire. Le calcul *avg* implique le calcul d'un
    antidérivatif polynomial (analytique). Le calcul de *max*, *min* et
    *delta* implique le calcul analytique de la dérivée polynomiale et
    la recherche de ses racines (numérique). La résolution de f(t) = 0
    implique la recherche de racines polynomiales (numérique).

[^5]: dans ce cas, -1 peut entraîner la récupération de votre
    déclencheur à partir de l'état problème. Pour être entièrement
    protégé, utilisez :
    `{host:vfs.fs.size[/,free].timeleft(1h,,0)}<1h and ({TRIGGER.VALUE}=0 and {host:vfs.fs.size[/,free].timeleft(1h,,0)}<>-1 or {TRIGGER.VALUE}=1)`

[comment]: # ({/8a6103e3-733d5140})
