Sidebar

Zabbix Summit 2022
Register for Zabbix Summit 2022

2 Expression de déclenchement

Aperçu

Les expressions utilisées dans les [déclencheurs(/manual/config/triggers) sont très flexibles. Vous pouvez les utiliser pour créer des tests logiques complexes concernant les statistiques surveillées.

Une expression simple utilise une fonction qui est appliquée à l'élément avec certains paramètres. La fonction renvoie un résultat qui est comparé au seuil, à l'aide d'un opérateur et d'une constante.

La syntaxe d'une expression utile simple est function(/host/key,parameter)<operator><constant>.

Par exemple : min(/Zabbix server/net.if.in[eth0,bytes],5m)>100K

se déclenchera si le nombre d'octets reçus au cours des cinq derniers minutes était toujours supérieure à 100 kilo-octets.

Bien que la syntaxe soit exactement la même, du point de vue fonctionnel, il existe deux types d'expressions de déclencheur :

  • expression du problème - définit les conditions du problème
  • expression de récupération (facultatif) - définit des conditions supplémentaires pour la résolution du problème

Lors de la définition d'une seule expression problématique, cette expression sera utilisée à la fois comme seuil de problème et seuil de récupération du problème. Dès que l'expression problème a pour résultat "VRAI", il y a un problème. Dès que l'expression du problème est évaluée à "FAUX", le problème est résolu.

Lors de la définition à la fois de l'expression du problème et de l'expression de récupération supplémentaire, la résolution du problème devient plus complexe : non seulement l'expression du problème doit être "FAUX", mais également l'expression de récupération doit être "VRAI". Ceci est utile pour éviter le bagotage de déclenchement dans l'hystérésis.

Les fonctions

Des fonctions permettent de calculer les valeurs collectées (moyenne, minimum, maximum, somme), rechercher des chaînes, référencer l'heure actuelle et d'autres facteurs.

Une liste complète des fonctions prises en charge est disponible.

Généralement, les fonctions renvoient des valeurs numériques à des fins de comparaison. Lorsqu'elles renvoient des chaînes, la comparaison est possible avec les opérateurs = et <> (voir l'exemple).

Paramètres de la fonction

Les paramètres de fonction permettent de spécifier :

  • l'hôte et la clé de l'élément (fonctions se référant uniquement à l'historique de l'élément de l'hôte)
  • paramètres spécifiques à la fonction
  • d'autres expressions (non disponibles pour les fonctions faisant référence l'historique de l'élément de l'hôte, voir les autres expressions pourexemples)

L'hôte et la clé de l'élément peuvent être spécifiés comme /host/key. L'élément référencé doit être dans un état pris en charge (sauf pour la fonction nodata(), qui est également calculé pour les éléments non pris en charge).

Alors que d'autres expressions de déclenchement en tant que paramètres de fonction sont limitées à fonctions non historiques dans les déclencheurs, cette limitation ne s'applique pas dans les éléments calculés.

Paramètres spécifiques à la fonction

Les paramètres spécifiques à la fonction sont placés après la clé d'élément et sont séparés de la clé de l'élément par une virgule. Voir les fonctions prises en charge pour une liste complète de ces paramètres.

La plupart des fonctions numériques acceptent le temps comme paramètre. Vous pouvez utiliser des secondes ou des suffixes de temps pour indiquer le temps. Précédé d'un hashtag, le paramètre a une autre signification :

Expression Description
sum(/host/key,10m) Somme des valeurs des 10 dernières minutes.
sum(/host/key,#10) Somme des dix dernières valeurs.

Les paramètres avec un hashtag ont une signification différente avec la fonction last - ils désignent la Nième valeur précédente, donc étant donné les valeurs 3, 7, 2, 6, 5 (du plus récent au moins récent) :

  • last(/host/key,#2) renverrait '7'
  • last(/host/key,#5) renverrait '5'
Décalage dans le temps

Un décalage temporel facultatif est pris en charge avec le temps ou le nombre de valeurs comme paramètre de fonction. Ce paramètre permet de référencer les données d'une période de temps dans le passé.

Le décalage horaire commence par now - spécifiant l'heure actuelle, et est suivi de +N<unité de temps> ou -N<unité de temps> - pour ajouter ou soustraire N unités de temps.

Par exemple, avg(/host/key,1h:now-1d) renverra la valeur moyenne pendant une heure il y a un jour.

Décalage horaire avec des périodes de temps absolues

Les périodes de temps absolues sont prises en charge dans le paramètre de décalage horaire, par exemple, minuit à minuit pour une journée, du lundi au dimanche pour une semaine, du premier au dernier jour du mois pendant un mois.

Le décalage temporel pour les périodes de temps absolu commence par now - en spécifiant le l'heure actuelle, et est suivi d'un nombre quelconque d'opérations temporelles : /<unité de temps> - définit le début et la fin de l'unité de temps, par exemple, minuit à minuit pour un jour, +N<unité de temps> ou -N<unité de temps> - pour ajouter ou soustraire N unités de temps.

Veuillez noter que la valeur du décalage temporel peut être supérieure ou égale à 0, tandis que la valeur minimale de la période est 1.

Paramètre Description
1d:now/d Hier
1d:now/d+1d Aujourd'hui
2d:now/d+1d Les 2 derniers jours
1w:now/w La semaine dernière
1w:now/w+1w Cette semaine
Autres expressions

Les paramètres de fonction peuvent contenir d'autres expressions, comme dans la syntaxe suivante :

min(min(/host/key,1h),min(/host2/key2,1h)*10)

Notez que d'autres expressions ne peuvent pas être utilisées si la fonction fait référence à l'historique de l'élément. Par exemple, la syntaxe suivante n'est pas autorisée :

min(/host/key,#5*10)

Opérateurs

Les opérateurs suivants sont supportés pour les déclencheurs (en priorité descendante d'exécution) :

Priorité Opérateur Définition Notes pour les valeurs inconnues Forcer l'opérande à float1
1 - Moins unaire -Inconnu → Inconnu Oui
2 not NON logique not Inconnu → Inconnu Oui
3 * Multiplication 0 * Inconnu → Inconnu
(oui, Inconnu, pas 0 - pour ne pas perdre
Inconnu dans les opérations arithmétiques)
1.2 * Inconnu → Inconnu
Oui
/ Division Inconnu / 0 → erreur
Inconnu / 1.2 → Inconnu
0.0 / Inconnu → Inconnu
Oui
4 + Signe plus arithmétique 1.2 + Inconnu → Inconnu Oui
- Signe moins arithmétique 1.2 - Inconnu → Inconnu Oui
5 < Inférieur à. L'opérateur est défini comme :

A<B ⇔ (A<B-0.000001)
1.2 < Inconnu → Inconnu Oui
<= Inférieur ou égal à. L'opérateur est défini comme :

A<=B ⇔ (A≤B+0.000001)
Inconnu <= Inconnu → Inconnu Oui
> Supérieur à. L'opérateur est défini comme :

A>B ⇔ (A>B+0.000001)
Oui
>= Supérieur ou égal à. L'opérateur est défini comme :

A>=B ⇔ (A≥B-0.000001)
Oui
6 = Est égal. L'opérateur est défini comme :

A=B ⇔ (A≥B-0.000001) et (A≤B+0.000001)
Non 1
<> Différent. L'opérateur est défini comme :

A<>B ⇔ (A<B-0.000001) ou (A>B+0.000001)
Non 1
7 and ET logique 0 and Inconnu → 0
1 and Inconnu → Inconnu
Inconnu and Inconnu → Inconnu
Oui
8 or OU logique 1 or Inconnu → 1
0 or Inconnu → Inconnu
Inconnu or Inconnu → Inconnu
Oui

1 L'opérande de chaîne est toujours converti en numérique si :

  • un autre opérande est numérique
  • un opérateur autre que = ou <> est utilisé sur un opérande

(Si la conversion échoue, l'opérande numérique est converti en opérande de chaîne et les deux opérandes sont comparés en tant que chaînes.)

Les opérateurs not, and et or sont sensibles à la casse et doivent être en minuscules. Ils doivent également être entourés par des espaces ou des parenthèses.

Tous les opérateurs, sauf le - unaire et not, ont une associativité de gauche à droite. Le - unaire et not sont non-associatif (signifiant -(-1) et not(not 1) devraient être utilisé à la place de --1 et not not 1).

Résultat de l'évaluation :

  • Les opérateurs <, <=, >, >=, =, <> doivent donner '1' dans l'expression du déclencheur si la relation spécifiée est vraie et '0' si elle est fausse. Si au moins un opérande est inconnu, le résultat est Inconnu ;
  • and pour les opérandes connus doit donner '1' si les deux opérandes ne valent pas '0' ; sinon, il donne '0' ; pour les opérandes inconnus and ne donne '0' que si un opérande vaut '0' ; dans le cas contraire, il donne 'inconnu' ;
  • or pour des opérandes connus, donne '1' si l'un de ses opérandes ne vaut pas '0' ; sinon, il donne '0' ; pour les opérandes inconnus or donne '1' seulement si un opérande ne vaut pas '0' ; dans le cas contraire, il donne "inconnu" ;
  • Le résultat de l'opérateur de négation logique not pour un opérande connu est '0' si la valeur de son opérande ne vaut pas '0' ; '1' si la valeur de son opérande est égale à '0'. Pour l'opérande inconnu not donne 'Inconnu'.

Mise en cache des valeurs

Les valeurs requises pour l'évaluation du déclencheur sont mises en cache par le serveur Zabbix. En raison de cette évaluation du déclencheur, la charge de la base de données est plus élevée pendant un certain temps après le redémarrage du serveur. Le cache des valeurs n'est pas effacé lorsque les valeurs de l'historique des éléments sont supprimées (manuellement ou par la procédure de nettoyage), de sorte que le serveur utilisera les valeurs mises en cache jusqu'à ce qu'elles soient antérieures aux périodes définies dans les fonctions de déclenchement ou que le serveur soit redémarré.

Exemples de déclencheurs

Exemple 1

La charge du processeur est trop élevée sur le serveur Zabbix.

last(/Zabbix server/system.cpu.load[all,avg1])>5

En utilisant la fonction 'last()', nous faisons référence à la valeur la plus récente. /Zabbix server/system.cpu.load[all,avg1] donne un nom court du paramètre surveillé. Il spécifie que l'hôte est 'Zabbix server' et que la clé surveillée est 'system.cpu.load[all,avg1]'. Enfin, >5 signifie que le déclencheur est dans l'état PROBLÈME chaque fois que la mesure de la charge du processeur la plus récente du serveur Zabbix est supérieure à 5.

Exemple 2

www.example.com est surchargé.

last(/www.example.com/system.cpu.load[all,avg1])>5 or min(/www.example.com/system.cpu.load[all,avg1],10m)>2 

L'expression est vraie lorsque la charge actuelle du processeur est supérieure à 5 ou que la charge du processeur était supérieure à 2 au cours des 10 dernières minutes.

Exemple 3

/etc/passwd a été modifié.

(last(/www.example.com/vfs.file.cksum[/etc/passwd],#1)<>last(/www.example.com/vfs.file.cksum[/etc/passwd],#2))=1

L'expression est vraie lorsque la valeur précédente de la somme de contrôle (checksum) /etc/passwd diffère de la plus récente.

Des expressions similaires peuvent être utiles pour surveiller les changements dans des fichiers importants, tels que /etc/passwd, /etc/inetd.conf, /kernel, etc.

Exemple 4

Quelqu'un télécharge une fichier volumineux sur Internet.

Utilisation de la fonction min :

min(/www.example.com/net.if.in[eth0,bytes],5m)>100K

L'expression est vraie lorsque le nombre d'octets reçus sur eth0 est supérieur à 100 Ko au cours des 5 dernières minutes.

Exemple 5

Les deux nœuds du serveur SMTP en cluster sont arrêtés.

Notez l'utilisation de deux hôtes différents dans une expression :

last(/smtp1.example.com/net.tcp.service[smtp])=0 and last(/smtp2.example.com/net.tcp.service[smtp])=0

L'expression est vraie lorsque les deux serveurs SMTP sont en panne sur smtp1.example.com et smtp2.example.com.

Exemple 6

L'agent Zabbix doit être mis à jour.

Utilisation de la fonction find() :

find(/example.example.com/agent.version,,"like","beta8")=1

L'expression est vraie si l'agent Zabbix a la version beta8.

Exemple 7

Le serveur est inaccessible.

count(/example.example.com/icmpping,30m,,"0")>5

L'expression est vraie si l'hôte "example.example.com" est inaccessible plus de 5 fois au cours des 30 dernières minutes.

Exemple 8

Aucun battement de cœur au cours des 3 dernières minutes.

Utilisation de la fonction nodata() :

nodata(/example.example.com/tick,3m)=1

Pour utiliser ce déclencheur, 'tick' doit être défini comme un élément Zabbix trapper. L'hôte doit envoyer périodiquement des données pour cet élément en utilisant zabbix_sender. Si aucune donnée n'est reçue dans les 180 secondes, la valeur de déclenchement devient PROBLÈME.

Notez que 'nodata' peut être utilisé pour n'importe quel type d'élément.

Exemple 9

Activité du CPU la nuit.

Utilisation de la fonction time() :

min(/Zabbix server/system.cpu.load[all,avg1],5m)>2 and time()>000000 and time()<060000

Le déclencheur peut changer son statut en 'true' uniquement la nuit (00:00-06:00).

Exemple 10

Activité CPU à tout moment sauf exception.

Utilisation de la fonction time() et de l'opérateur not :

min(/zabbix/system.cpu.load[all,avg1],5m)>2
       and not (dayofweek()=7 and time()>230000)
       and not (dayofweek()=1 and time()<010000)

Le déclencheur peut changer son état à vrai à tout moment, sauf pendant 2 heures lors d'un changement de semaine (dimanche, 23h00 - lundi, 01h00).

Exemple 11

Vérifiez si l'heure locale du client est synchronisée avec l'heure du serveur Zabbix.

Utilisation de la fonction fuzzytime() :

fuzzytime(/MySQL_DB/system.localtime,10s)=0

Le déclencheur passera à l'état problème si l'heure locale sur le serveur MySQL_DB et le serveur Zabbix diffère de plus de 10 secondes. Notez que 'system.localtime' doit être configuré en tant que contrôle passif.

Exemple 12

Comparaison de la charge moyenne d'aujourd'hui avec la charge moyenne de la même heure hier (en utilisant le décalage horaire comme "maintenant-1j").

 avg(/server/system.cpu.load,1h)/avg(/server/system.cpu.load,1h:now-1d)>2

Cette expression se déclenchera si la charge moyenne de la dernière heure dépasse la charge moyenne de la même heure hier de plus de deux fois.

Exemple 13

Utiliser la valeur d'un autre élément pour obtenir un seuil de déclenchement :

last(/Template PfSense/hrStorageFree[{#SNMPVALUE}])<last(/Template PfSense/hrStorageSize[{#SNMPVALUE}])*0.1

Le déclencheur se déclenchera si l'espace libre tombe en dessous de 10 %.

Exemple 14

Utilisation de résultat de l'évaluation pour obtenir le nombre de déclencheurs au-dessus d'un seuil :

(last(/server1/system.cpu.load[all,avg1])>5) + (last(/server2/system.cpu.load[all,avg1])>5) + (last(/server3/system.cpu.load[all,avg1])>5)>=2

Le déclencheur se déclenchera si au moins deux des déclencheurs de l'expression sont supérieurs à 5.

Exemple 15

Comparaison des valeurs de chaîne de deux éléments - les opérandes sont ici des fonctions qui renvoient des chaînes.

Problème : créer une alerte si la version d'Ubuntu est différente sur différents hôtes

last(/NY Zabbix server/vfs.file.contents[/etc/os-release])<>last(/LA Zabbix server/vfs.file.contents[/etc/os-release])
Exemple 16

Comparaison de deux valeurs de chaîne - les opérandes sont :

  • une fonction qui renvoie une chaîne
  • une combinaison de macros et de chaînes

Problème : détecter les changements dans la requête DNS

La clé de l'élément est :

net.dns.record[8.8.8.8,{$WEBSITE_NAME},{$DNS_RESOURCE_RECORD_TYPE},2,1]

avec des macros définies comme

{$WEBSITE_NAME} = example.com
       {$DNS_RESOURCE_RECORD_TYPE} = MX

et renvoie normalement :

example.com           MX       0 mail.example.com

Donc, notre expression de déclenchement pour détecter si le résultat de la requête DNS s'écarte du résultat attendu est :

last(/Zabbix server/net.dns.record[8.8.8.8,{$WEBSITE_NAME},{$DNS_RESOURCE_RECORD_TYPE},2,1])<>"{$WEBSITE_NAME}           {$DNS_RESOURCE_RECORD_TYPE}       0 mail.{$WEBSITE_NAME}"

Remarquez les guillemets autour du deuxième opérande.

Exemple 17

Comparaison de deux valeurs de chaîne - les opérandes sont :

  • une fonction qui renvoie une chaîne
  • une chaîne constante avec des caractères spéciaux \ et "

Problème : détecter si le contenu du fichier /tmp/hello est égal à :

\" //hello ?\"

Option 1) écrire la chaîne directement

last(/Zabbix server/vfs.file.contents[/tmp/hello])="\\\" //hello ?\\\""

Remarquez comment les caractères \ et " sont échappés lorsque la chaîne est comparée directement.

Option 2) utiliser une macro

{$HELLO_MACRO} = \" //hello ?\"

dans l'expression :

last(/Zabbix server/vfs.file.contents[/tmp/hello])={$HELLO_MACRO}
Exemple 18

Comparer de longues périodes de temps.

Problème : la charge du serveur Exchange a augmenté de plus de 10 % le mois dernier

trendavg(/Exchange/system.cpu.load,1M:now/M)>1.1*trendavg(/Exchange/system.cpu.load,1M:now/M-1M)

Vous pouvez également utiliser le champ Nom de l'événement dans la configuration du déclencheur pour créer un message d'alerte significatif, par exemple pour recevoir quelque chose comme

"Load of Exchange server increased by 24% in July (0.69) comparing to June (0.56)"

le nom de l'événement doit être défini comme :

Load of {HOST.HOST} server increased by {{?100*trendavg(//system.cpu.load,1M:now/M)/trendavg(//system.cpu.load,1M:now/M-1M)}.fmtnum(0)}% in {{TIME}.fmttime(%B,-1M)} ({{?trendavg(//system.cpu.load,1M:now/M)}.fmtnum(2)}) comparing to {{TIME}.fmttime(%B,-2M)} ({{?trendavg(//system.cpu.load,1M:now/M-1M)}.fmtnum(2)})

Il est également utile d'autoriser la fermeture manuelle dans la configuration du déclencheur pour ce type de problème.

Hystérésis

Parfois, un intervalle est nécessaire entre les états problème et récupération, plutôt qu'un simple seuil. Par exemple, si nous voulons définir un déclencheur signalant un problème lorsque la température de la salle des serveurs dépasse 20°C et que nous souhaitons qu'il reste dans l'état du problème jusqu'à ce que la température descende sous 15°C, un seuil de déclenchement simple à 20°C ne suffira pas.

Au lieu de cela, nous devons d'abord définir une expression de déclenchement pour l'événement problématique (température supérieure à 20°C). Ensuite, nous devons définir une condition de récupération supplémentaire (température inférieure à 15°C). Pour ce faire, vous définissez un paramètre Expression de récupération supplémentaire lors de la définition du déclencheur.

Dans ce cas, la récupération du problème se fera en deux étapes :

  • Tout d’abord, l’expression du problème (température supérieure à 20°C) devra être évaluée à FAUX
  • Deuxièmement, l'expression de récupération (température inférieure à 15°C) devra être évaluée à VRAI

L'expression de récupération sera évaluée uniquement lorsque l'événement posant problème est résolu en premier.

L'expression de récupération seule à VRAI ne résout pas le problème si l'expression du problème est toujours VRAI !

Exemple 1

La température dans la salle des serveurs est trop élevée.

Expression du problème :

last(/server/temp)>20

Expression de récupération :

last(/server/temp)<=15
Exemple 2

L'espace disque libre est trop faible.

Expression du problème : moins de 10 Go pendant les 5 dernières minutes

max(/server/vfs.fs.size[/,free],5m)<10G

Expression de récupération : plus de 40 Go pendant les 10 dernières minutes

min(/server/vfs.fs.size[/,free],10m)>40G

Expressions avec des opérandes inconnus

En règle générale, un opérande inconnu (tel qu'un élément non pris en charge) dans l'expression rend immédiatement la valeur de déclenchement « Inconnu ».

Cependant, dans certains cas, des opérandes inconnus (éléments non pris en charge, erreurs de fonction) sont admis dans l'évaluation d'expression :

  • La fonction nodata() est évaluée, que l'élément référencé soit pris en charge ou non.
  • Les expressions logiques avec OR et AND peuvent être évaluées à des valeurs connues dans deux cas, indépendamment des opérandes inconnus :
    • Cas 1: "1 or some_function(unsupported_item1) or some_function(unsupported_item2) or ..." peut être évalué à un résultat connu ('1' ou "Problème"),
    • Cas 2: "0 and some_function(unsupported_item1) and some_function(unsupported_item2) and ..." peut être évalué à un résultat connu ('0' ou "OK").
      Zabbix essaie d'évaluer ces expressions logiques en prenant les éléments non pris en charge comme des opérandes inconnus. Dans les deux cas ci-dessus, une valeur connue sera produite ("Problème" ou "OK", respectivement) ; dans tous les autres cas, le déclencheur sera évalué sur "Inconnu".
  • Si l'évaluation de la fonction pour un élément pris en charge entraîne une erreur, la valeur de la fonction devient "Inconnu" et elle participe en tant qu'opérande inconnu à une évaluation ultérieure de l'expression.

Notez que les opérandes inconnus peuvent "disparaître" uniquement dans les expressions logiques comme décrit ci-dessus. Dans les expressions arithmétiques, les opérandes inconnus conduisent toujours au résultat Inconnu (sauf division par 0).

Une expression dont le résultat est Inconnu ne modifie pas l'état du déclencheur ("Problème/OK"). Donc, si c'était "Problème" (voir Cas 1), il reste dans le même état de problème même si la partie connue est résolue ('1' devient '0'), car l'expression est maintenant évaluée à Inconnu et elle ne modifie pas l'état du déclencheur.

Si une expression de déclencheur avec plusieurs éléments non pris en charge est évaluée comme Inconnu, le message d'erreur dans l'interface fait référence au dernier élément non pris en charge évalué.