2 Expression du déclencheur
Aperçu
Les expressions utilisées dans les déclencheurs 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 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 simple utile est function(/host/key,parameter)<operator><constant>.
Par exemple :
min(/Zabbix server/net.if.in[eth0,bytes],5m)>100K
déclenchera une alerte si le nombre d'octets reçus au cours des cinq dernières minutes a toujours été supérieur à 100 kilooctets.
Bien que la syntaxe soit exactement la même, d'un point de vue fonctionnel, il existe deux types d'expressions de déclencheur :
- expression de problème - définit les conditions du problème
- expression de récupération (facultative) - définit des conditions supplémentaires de résolution du problème
Lorsqu'une expression de problème est définie seule, cette expression sera utilisée à la fois comme seuil de problème et comme seuil de récupération du problème. Dès que l'expression de problème évalue à TRUE, il y a un problème. Dès que l'expression de problème évalue à FALSE, le problème est résolu.
Lorsque l'expression de problème et l'expression de récupération supplémentaire sont toutes deux définies, la résolution du problème devient plus complexe : non seulement l'expression de problème doit être FALSE, mais l'expression de récupération doit également être TRUE. Cela est utile pour créer une hystérésis et éviter les oscillations du déclencheur.
Il est inutile d'utiliser la macro {TRIGGER.VALUE} dans une expression de récupération, car cette expression n'est évaluée que lorsque le déclencheur est dans l'état "Problem". Par conséquent, {TRIGGER.VALUE} prendra toujours la valeur "1" (qui indique un état "Problem") lors de l'évaluation de l'expression.
Fonctions
Les fonctions permettent de calculer les valeurs collectées (moyenne, minimum, maximum, somme), de rechercher des chaînes, de faire référence à l'heure actuelle et à d'autres facteurs.
Une liste complète des fonctions prises en charge est disponible.
En général, les fonctions renvoient des valeurs numériques pour la comparaison. Lorsqu'elles renvoient des chaînes, la comparaison est possible avec les opérateurs = et <> (voir exemple).
Paramètres de fonction
Les paramètres de fonction permettent de spécifier :
- la clé de l'hôte et de l'élément (fonctions faisant référence uniquement à l'historique de l'élément de l'hôte)
- des 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 autres expressions pour des exemples)
La clé de l'hôte et de l'élément peut être spécifiée sous la forme /host/key.
L'omission du nom d'hôte dans le premier paramètre (c'est-à-dire comme dans function(//key,parameter,...)) n'est prise en charge que dans certains contextes :
- Dans la formule des éléments calculés
- Dans les macros d'expression, qui peuvent être utilisées dans :
- Le champ Nom de l'événement
- Le nom du graphique
- L'étiquette des éléments de carte "Hôte" et "Déclencheur"
Dans ces contextes, vous pouvez également utiliser la macro {HOST.HOST}.
{HOST.HOST<1-9>} peut être utilisée dans le cas du champ Nom de l'événement et de l'élément de carte "Déclencheur" pour faire référence à un élément spécifique dans l'expression du déclencheur.
Lorsque le nom d'hôte est omis ou remplacé par {HOST.HOST} dans ces contextes, la référence pointe vers le premier élément de l'expression du déclencheur ou vers le premier élément du graphique.
En dehors de ces contextes pris en charge, l'omission du nom d'hôte dans les expressions de déclencheur entraînera une erreur.
Voir Exemple 18 pour une illustration de l'utilisation de la double barre oblique dans les macros de Nom de l'événement.
L'élément référencé doit être dans un état pris en charge (sauf pour la fonction nodata(), qui est également calculée pour les éléments non pris en charge).
Bien que les autres expressions de déclencheur en tant que paramètres de fonction soient limitées aux fonctions non liées à l'historique dans les déclencheurs, cette limitation ne s'applique pas aux éléments calculés.
Paramètres spécifiques à la fonction
Les paramètres spécifiques à la fonction sont placés après la clé de l'élément et sont séparés de celle-ci par une virgule. Consultez les fonctions prises en charge pour obtenir la 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 symbole dièse, le paramètre a une signification différente :
| 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 précédés d'un symbole dièse ont une signification différente avec la fonction last - ils désignent la Nième valeur précédente, donc étant donné les valeurs 30, 70, 20, 60, 50 (de la plus récente à la moins récente) :
last(/host/key,#2)renverrait '70'last(/host/key,#5)renverrait '50'
Décalage temporel
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 faire référence à des données d'une période passée.
Le décalage temporel commence par now - qui spécifie l'heure actuelle, puis 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 pour une heure, il y a un jour.
Le décalage temporel spécifié en mois (M) et en années (y) n'est pris en charge que pour les fonctions de tendance. Les autres fonctions prennent en charge les secondes (s), les minutes (m), les heures (h), les jours (d) et les semaines (w).
Décalage temporel avec des périodes absolues
Les périodes absolues sont prises en charge dans le paramètre de décalage temporel, par exemple, de minuit à minuit pour une journée, du lundi au dimanche pour une semaine, du premier au dernier jour du mois pour un mois.
Le décalage temporel pour les périodes absolues commence par now - qui spécifie l'heure actuelle, puis 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, de minuit à minuit pour une journée, +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 de temps est 1.
| Parameter | 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 pris en charge pour les déclencheurs (par ordre décroissant de priorité d'exécution) :
| Priority | Operator | Definition | Notes for unknown values | Force cast operand to float 1 |
|---|---|---|---|---|
| 1 | - | Moins unaire | -Unknown → Unknown | Yes |
| 2 | not | NON logique | not Unknown → Unknown | Yes |
| 3 | * | Multiplication | 0 * Unknown → Unknown (yes, Unknown, not 0 - to not lose Unknown in arithmetic operations) 1.2 * Unknown → Unknown |
Yes |
| / | Division | Unknown / 0 → error Unknown / 1.2 → Unknown 0.0 / Unknown → Unknown |
Yes | |
| 4 | + | Addition arithmétique | 1.2 + Unknown → Unknown | Yes |
| - | Soustraction arithmétique | 1.2 - Unknown → Unknown | Yes | |
| 5 | < | Inférieur à. L'opérateur est défini comme suit : A<B ⇔ (A<B-0.000001) |
1.2 < Unknown → Unknown | Yes |
| <= | Inférieur ou égal à. L'opérateur est défini comme suit : A<=B ⇔ (A≤B+0.000001) |
Unknown <= Unknown → Unknown | Yes | |
| > | Supérieur à. L'opérateur est défini comme suit : A>B ⇔ (A>B+0.000001) |
Yes | ||
| >= | Supérieur ou égal à. L'opérateur est défini comme suit : A>=B ⇔ (A≥B-0.000001) |
Yes | ||
| 6 | = | Égal à. L'opérateur est défini comme suit : A=B ⇔ (A≥B-0.000001) and (A≤B+0.000001) |
No 1 | |
| <> | Différent de. L'opérateur est défini comme suit : A<>B ⇔ (A<B-0.000001) or (A>B+0.000001) |
No 1 | ||
| 7 | and | ET logique | 0 and Unknown → 0 1 and Unknown → Unknown Unknown and Unknown → Unknown |
Yes |
| 8 | or | OU logique | 1 or Unknown → 1 0 or Unknown → Unknown Unknown or Unknown → Unknown |
Yes |
1 L'opérande de type chaîne est toujours converti en valeur numérique si :
- un autre opérande est numérique
- un opérateur autre que = ou <> est utilisé sur un opérande
Pour les opérateurs relationnels (<, <=, >, >=) : si la conversion échoue (par exemple, sur ""), l'expression renvoie Unknown (sans repli sur une comparaison de chaînes).
Pour les opérateurs d'égalité (=, <>) : si la conversion échoue, les opérandes sont comparés comme des chaînes brutes.
Les opérateurs not, and et or sont sensibles à la casse et doivent être en minuscules. Ils doivent également être entourés d'espaces ou de parenthèses.
Tous les opérateurs, à l'exception du moins unaire - et de not, sont associatifs de gauche à droite. Le moins unaire - et not ne sont pas associatifs (ce qui signifie qu'il faut utiliser -(-1) et not (not 1) au lieu de --1 et not not 1).
Résultat de l'évaluation :
- les opérateurs <, <=, >, >=, =, <> renvoient '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 Unknown, le résultat est Unknown ;
- and pour des opérandes connus renvoie '1' si les deux opérandes sont différents de '0' ; sinon, il renvoie '0' ; pour des opérandes inconnus, and renvoie '0' uniquement si un opérande est égal à '0' ; sinon, il renvoie 'Unknown' ;
- or pour des opérandes connus renvoie '1' si l'un des deux opérandes est différent de '0' ; sinon, il renvoie '0' ; pour des opérandes inconnus, or renvoie '1' uniquement si un opérande est différent de '0' ; sinon, il renvoie 'Unknown' ;
- 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 est différente de '0' ; '1' si la valeur de son opérande est égale à '0'. Pour un opérande inconnu, not renvoie 'Unknown'.
Mise en cache des valeurs
Les valeurs requises pour l’évaluation des déclencheurs sont mises en cache par le serveur Zabbix. Pour cette raison, l’évaluation des déclencheurs entraîne une charge plus élevée sur la base de données pendant un certain temps après le redémarrage du serveur.
Le cache des valeurs n’est pas vidé lorsque les valeurs d’historique des éléments sont supprimées (manuellement ou par le housekeeper) ; le serveur utilisera donc les valeurs mises en cache jusqu’à ce qu’elles soient plus anciennes que les périodes définies dans les fonctions de déclencheur ou jusqu’au redémarrage du serveur.
S’il n’y a pas de données récentes dans le cache et qu’aucune période d’interrogation n’est définie dans la fonction, Zabbix remontera par défaut jusqu’à une semaine dans le passé pour interroger la base de données à la recherche de valeurs historiques.
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] fournit un nom court du paramètre surveillé.
Cela indique 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 à l'état PROBLEM chaque fois que la mesure la plus récente de la charge du processeur provenant 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 a été 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)
L'expression est vraie lorsque la valeur précédente de la somme de contrôle de /etc/passwd diffère de la plus récente.
Des expressions similaires peuvent être utiles pour surveiller les modifications apportées à des fichiers importants, tels que /etc/passwd, /etc/inetd.conf, /kernel, etc.
Exemple 4
Quelqu'un télécharge un fichier volumineux depuis 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 hors service.
Notez l'utilisation de deux hôtes différents dans une même 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 hors service sur smtp1.example.com et smtp2.example.com.
Exemple 6
L'agent Zabbix doit être mis à niveau.
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 injoignable.
count(/example.example.com/icmpping,30m,,"0")>5
L'expression est vraie si l'hôte "example.example.com" est injoignable plus de 5 fois au cours des 30 dernières minutes.
Exemple 8
Aucun heartbeat 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 à l'aide de zabbix_sender. Si aucune donnée n'est reçue dans les 180 secondes, la valeur du déclencheur devient PROBLEM.
Note que 'nodata' peut être utilisée pour tout type d'élément.
Exemple 9
Activité du CPU pendant la nuit.
Utilisation de la fonction time() :
min(/Zabbix server/system.cpu.load[all,avg1],5m)>2 and time()<060000
Le déclencheur peut passer à l'état de problème uniquement pendant la nuit (00:00 - 06:00).
Exemple 10
Activité du 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 passer à l'état de problème à tout moment, sauf pendant 2 heures lors du changement de semaine (dimanche, 23:00 - lundi, 01:00).
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 de problème si l'heure locale sur le serveur MySQL_DB et celle du serveur Zabbix diffèrent de plus de 10 secondes. Notez que 'system.localtime' doit être configuré comme une vérification passive pour l'agent Zabbix ; avec Zabbix agent 2, il peut être configuré comme une vérification active.
Exemple 12
Comparaison de la charge moyenne aujourd'hui avec la charge moyenne à la même heure hier (en utilisant le décalage temporel now-1d).
avg(/server/system.cpu.load,1h)/avg(/server/system.cpu.load,1h:now-1d)>2
Le déclencheur se déclenchera si la charge moyenne de la dernière heure dépasse plus de deux fois la charge moyenne de la même heure hier.
Exemple 13
Utilisation de la valeur d'un autre élément pour obtenir un seuil de déclencheur :
last(/Template PfSense/hrStorageFree[{#SNMPVALUE}])<last(/Template PfSense/hrStorageSize[{#SNMPVALUE}])*0.1
Le déclencheur se déclenchera si l'espace de stockage libre descend en dessous de 10 pour cent.
Exemple 14
Utilisation du résultat d'é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 dans un état de problème.
Exemple 15
Comparaison des valeurs de chaîne de deux éléments - les opérandes ici sont 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[192.0.2.1,{$WEBSITE_NAME},{$DNS_RESOURCE_RECORD_TYPE},2,1]
avec les macros définies comme
{$WEBSITE_NAME} = example.com
{$DNS_RESOURCE_RECORD_TYPE} = MX
et renvoie normalement :
example.com MX 0 mail.example.com
Ainsi, notre expression de déclencheur pour détecter si le résultat de la requête DNS s'est écarté du résultat attendu est :
last(/Zabbix server/net.dns.record[192.0.2.1,{$WEBSITE_NAME},{$DNS_RESOURCE_RECORD_TYPE},2,1])<>"{$WEBSITE_NAME} {$DNS_RESOURCE_RECORD_TYPE} 0 mail.{$WEBSITE_NAME}"
Remarquez les guillemets autour du second opérande.
Exemple 17
Comparaison de deux valeurs de chaîne - les opérandes sont :
- une fonction qui renvoie une chaîne
- une constante de chaîne 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
Comparaison de périodes à long terme.
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 construire un message d'alerte pertinent, par exemple afin d'obtenir quelque chose comme
"La charge du serveur Exchange a augmenté de 24 % en juillet (0.69) par rapport à juin (0.56)"
le nom de l'événement doit être défini comme suit :
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.
Vous avez un exemple d'expression de déclencheur qui pourrait être utile à d'autres ? Utilisez le formulaire de suggestion d'exemple pour l'envoyer aux développeurs de Zabbix.
Hystérésis
Parfois, un intervalle est nécessaire entre les états de problème et de récupération, plutôt qu'un simple seuil. Par exemple, si nous voulons définir un déclencheur qui signale un problème lorsque la température de la salle des serveurs dépasse 20°C et que nous voulons qu'il reste à l'état de problème jusqu'à ce que la température descende en dessous de 15°C, un simple seuil de déclencheur à 20°C ne suffira pas.
Nous devons donc d'abord définir une expression de déclencheur pour l'événement de problème (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). Cela se fait en définissant un paramètre supplémentaire Recovery expression lors de la définition d'un déclencheur.
Dans ce cas, la récupération du problème se déroulera en deux étapes :
- Premièrement, l'expression de problème (température supérieure à 20°C) devra être évaluée à FALSE
- Deuxièmement, l'expression de récupération (température inférieure à 15°C) devra être évaluée à TRUE
L'expression de récupération ne sera évaluée que lorsque l'événement de problème aura d'abord été résolu.
Le fait que l'expression de récupération soit TRUE à elle seule ne résout pas un problème si l'expression de problème est toujours TRUE !
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établissement :
last(/server/temp)<=15
Exemple 2
L'espace disque libre est trop faible.
Expression du problème : il est inférieur à 10 Go depuis les 5 dernières minutes
max(/server/vfs.fs.size[/,free],5m)<10G
Expression de rétablissement : il est supérieur à 40 Go depuis les 10 dernières minutes
min(/server/vfs.fs.size[/,free],10m)>40G
Expressions avec opérandes inconnus
En général, un opérande inconnu (tel qu'un élément non pris en charge) dans l'expression rendra immédiatement la valeur du déclencheur à Unknown.
Cependant, dans certains cas, les opérandes inconnus (éléments non pris en charge, erreurs de fonction) sont admis dans l'évaluation de l'expression :
- La fonction
nodata()est évaluée indépendamment du fait 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 "Problem"), - 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 tente d'évaluer de telles expressions logiques en considérant les éléments non pris en charge comme des opérandes inconnus. Dans les deux cas ci-dessus, une valeur connue sera produite ("Problem" ou "OK", respectivement) ; dans tous les autres cas, le déclencheur sera évalué àUnknown.
- Cas 1 : "
- Si l'évaluation de la fonction pour un élément pris en charge aboutit à une erreur, la valeur de la fonction devient
Unknownet elle intervient comme opérande inconnu dans les évaluations ultérieures 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 Unknown (sauf en cas de division par 0).
Une expression qui aboutit à Unknown ne modifie pas l'état du déclencheur ("Problem/OK").
Ainsi, s'il était en état "Problem" (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 alors évaluée à Unknown et cela 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 à Unknown, le message d'erreur dans l'interface fait référence au dernier élément non pris en charge évalué.