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 :
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.
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).
Les paramètres de fonction permettent de spécifier :
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.
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'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 |
Les paramètres de fonction peuvent contenir d'autres expressions, comme dans la syntaxe suivante :
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)
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 :
(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 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é.
La charge du processeur est trop élevée sur le serveur Zabbix.
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.
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.
/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.
Quelqu'un télécharge une fichier volumineux sur Internet.
Utilisation de la fonction min :
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.
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.
L'agent Zabbix doit être mis à jour.
Utilisation de la fonction find() :
L'expression est vraie si l'agent Zabbix a la version beta8.
Le serveur est inaccessible.
L'expression est vraie si l'hôte "example.example.com" est inaccessible plus de 5 fois au cours des 30 dernières minutes.
Aucun battement de cœur au cours des 3 dernières minutes.
Utilisation de la fonction nodata() :
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.
Activité du CPU la nuit.
Utilisation de la fonction time() :
Le déclencheur peut changer son statut en 'true' uniquement la nuit (00:00-06:00).
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).
Vérifiez si l'heure locale du client est synchronisée avec l'heure du serveur Zabbix.
Utilisation de la fonction fuzzytime() :
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.
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").
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.
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 %.
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.
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])
Comparaison de deux valeurs de chaîne - les opérandes sont :
Problème : détecter les changements dans la requête DNS
La clé de l'élément est :
avec des macros définies comme
et renvoie normalement :
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.
Comparaison de deux valeurs de chaîne - les opérandes sont :
Problème : détecter si le contenu du fichier /tmp/hello
est égal à :
Option 1) écrire la chaîne directement
Remarquez comment les caractères \ et " sont échappés lorsque la chaîne est comparée directement.
Option 2) utiliser une macro
dans l'expression :
Comparer de longues périodes de temps.
Problème : la charge du serveur Exchange a augmenté de plus de 10 % le mois dernier
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.
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 :
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 !
La température dans la salle des serveurs est trop élevée.
Expression du problème :
Expression de récupération :
L'espace disque libre est trop faible.
Expression du problème : moins de 10 Go pendant les 5 dernières minutes
Expression de récupération : plus de 40 Go pendant les 10 dernières minutes
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 :
nodata()
est évaluée, que l'élément référencé soit pris en charge ou non.1 or some_function(unsupported_item1) or some_function(unsupported_item2) or ...
" peut être évalué à un résultat connu ('1' ou "Problème"),0 and some_function(unsupported_item1) and some_function(unsupported_item2) and ...
" peut être évalué à un résultat connu ('0' ou "OK").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é.