2 Expressió de trigger

Vista general

Les expressions emprades a [triggers(/manual/config/triggers) són molt flexibles. Podeu emprar-los per crear proves lògiques complexes de les estadístiques monitorades.

Una expressió senzilla empra una funció que s'aplica a l'element amb alguns paràmetres. La funció retorna un resultat que es compara amb el llindar, emprant un operador i una constant.

La sintaxi d'una expressió útil senzilla és function(/host/key,parameter)<operator><constant>.

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

s'activarà si el nombre d'octets rebuts en els darrers cinc minuts sempre ha estat superior a 100 koctets.

Tot i que la sintaxi és exactament la mateixa, funcionalment hi ha dos tipus d'expressions triggers:

  • expressió del problema - defineix les condicions del problema
  • expressió de recuperació (opcional) - defineix condicions addicionals per resoldre el problema

Quan es defineix una única expressió de problema, aquesta expressió s'emprarà tant com a llindar del problema com a llindar de recuperació del problema. Tan bon punt l'expressió del problema s'avalua com a "VERTADER", hi ha un problema. Tan bon punt l'expressió del problema s'avalua com a "FALS", el problema es resol.

Quan es defineix tant l'expressió del problema com l'expressió de recuperació addicional, la resolució del problema es fa més complexa: no només l'expressió del problema ha d'ésser "FALS", sinó que també l'expressió de recuperació ha de ser "VERTADER". Això és útil per evitar la fluctuació del trigger a la histèresi.

És improductiu emprar la macro {TRIGGER.VALUE} a una expressió de recuperació perquè aquesta expressió només s'avalua quan el trigger es troba en l'estat "Problema". En conseqüència, {TRIGGER.VALUE} sempre es resoldrà a "1" (que indica un estat "Problema") mentre s'avalua l'expressió.

Funcions

Les funcions permeten calcular els valors recollits (mitjana, mínim, màxim, suma), cercar cadenes, fer referència a l'hora actual i altres factors.

Hi ha disponible una llista completa de funcions admeses.

En general, les funcions retornen valors numèrics amb finalitats de comparació. Quan tornen cadenes, la comparació és possible amb els operadors = i <> (veieu l'exemple).

Paràmetres de la funció

Els paràmetres de funció permeten especificar:

  • l'equip i la clau de l'element (funcions referides només a l'historial de l'element de l'equip)
  • Paràmetres específics de la funció
  • altres expressions (no disponible per a funcions que fan referència a l'historial de l'element equip, veieu altres expressions per a exemples)

L'equip i la clau de l'element es poden especificar com a "/host/key". L'element referenciat ha d'estar en un estat compatible (excepte per a la funció nodata(), que també es calcula per als elements no compatibles).

Mentre que altres triggers com a paràmetres de funció es limiten a funcions no històriques en triggers, aquesta limitació no s'aplica als elements calculats.

Paràmetres específics de la funció

Els paràmetres específics de la funció es posen després de la clau d'element i es separen de la clau d'element per una coma. Veieu les funcions compatibles per obtindre una llista completa d'aquests paràmetres.

La majoria de les funcions numèriques accepten el temps com a paràmetre. Podeu emprar segons o sufixos de temps per indicar l'hora. Precedit d'una marca de hash, el paràmetre té un altre significat:

Expressió Descripció
sum(/host/key,10m) Suma dels valors dels darrers 10 minuts.
sum(/host/key,#10) Suma dels darrers deu valors.

Els paràmetres amb una marca de hash tenen un significat diferent amb la funció darrera: denoten l'enèsim valor anterior, de manera que tinguent en compte els valors 3, 7, 2, 6, 5 (del més nou al més antic):

  • last(/host/key,#2) retornaria '7'
  • last(/host/key,#5) retornaria '5'
Desplaçament temporal

S'admet un desplaçament temporal opcional amb temps o nombre de valors com a paràmetre de funció. Empreu aquest paràmetre per fer referència a dades d'un període de temps anterior.

El desplaçament de temps comença amb "ara" - especificant l'hora actual, i va seguit de "+N<unitat de temps>" o "-N<unitat de temps>" - per sumar o restar N unitats de temps.

Per exemple, avg(/host/key,1h:now-1d) retornarà el valor mitjà d'una hora de fa un dia.

Diferència horària amb períodes de temps absoluts

Els períodes de temps absoluts s'admeten a la configuració de compensació horària, per exemple, de mitjanit a mitjanit durant un dia, de dilluns a diumenge durant una setmana, del primer al darrer dia del mes durant un mes.

El desplaçament de temps per a períodes de temps absoluts comença amb "ara" - especificant el l'hora actual, i va seguida de qualsevol nombre d'operacions de temps: /<unitat de temps> - defineix l'inici i el final de la unitat de temps, per exemple, de mitjanit a mitjanit durant un dia, +N<unitat de temps> o -N<unitat de temps> - per sumar o restar N unitats de temps.

Tingueu en compte que el valor de compensació temporal pot ser superior o igual a 0, mentre que el valor del període mínim és 1.

Paràmetre Descripció
1d:now/d Ahir
1d:ara/d+1d Avui
2d:ara/d+1d Darrers 2 dies
1w:now/w La setmana passada
1w:now/w+1w Aquesta setmana
altres expressions

Els paràmetres de funció poden contindre altres expressions, com a la sintaxi següent:

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

Veieu que altres expressions no es poden pas emprar si la funció fa referència a l'històric de l'element. Per exemple, la sintaxi següent no és pas permesa:

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

Operadors

Els triggers admeten els operadors següents (en prioritat d'execució descendent):

Prioritat Operador Definició Notes per a valors desconeguts Forçar l'operand a flotant1
1 - Menys unitari -Desconegut → Desconegut
2 no NO lògic no Desconegut → Desconegut
3 * Multiplicació 0 * Desconegut → Desconegut
(sí, Desconegut, no 0 - per no perdre
Desconegut en operacions aritmètiques) <br >1,2 * Desconegut → Desconegut
/ Divisió Desconegut / 0 → error
Desconegut / 1.2 → Desconegut
0.0 / Desconegut → Desconegut
4 + Signe més aritmètic 1,2 ***** Desconegut → Desconegut
- Signe menys aritmètic 1,2 - Desconegut → Desconegut
5 < L'operador es defineix com a menor de:

A<B ⇔ (A<B-0,000001)
1,2 < Desconegut → Desconegut
<= L'operador es defineix com inferior o igual a:

A<=B ⇔ (A≤B+0,000001)
Desconegut <= Desconegut → Desconegut
> L'operador es defineix com més gran que:

A>B ⇔ (A>B+0,000001)
>= L'operador es defineix com més gran o igual a:

A>=B ⇔ (A≥B-0,000001)
6* = L'operador es defineix com a igual:

A=B ⇔ (A≥B-0,000001) i (A≤B+0,000001)
No 1
<> DL'operador es defineix com a diferent:

A<>B ⇔ (A<B-0,000001) o (A>B+0,000001)
No 1
7 i I lògic 0 i Desconegut → 0
1 i Desconegut → Desconegut
Desconegut i Desconegut → Desconegut
8 o O lògic 1 o Desconegut → 1
0 o Desconegut → Desconegut
Desconegut o Desconegut → Desconegut

1 L'operand de cadena sempre es converteix a numèric si:

  • un altre operand és numèric
  • S'empra un operador diferent de = o <> en un operand

(Si la conversió falla, l'operand numèric es converteix en un operand de cadena i els dos operands es comparen com a cadenes.)

Els operadors no, i i o distingeixen entre majúscules i minúscules i han d'ésser minúscules. També s'han d'envoltar per espais o parèntesis.

Tots els operadors excepte els unaris - i no tenen associativitat d'esquerra a dreta. Els unitaris - i no no són associatius (és a dir, -(-1) i no (no 1) s'han d'emprar en comptes de --1 i no no 1).

Resultat de l'avaluació:

  • Els operadors <, <=, >, >=, =, <> han de donar '1' a l'expressió del trigger si la relació especificada és certa i '0' si és falsa. Si almenys un operand és desconegut, el resultat és Desconegut;
  • i per als operands coneguts ha de retornar '1' si els dos operands no són '0'; en cas contrari, retorna '0'; per a operands desconeguts i retorna '0' només si un operand és '0'; en cas contrari, dóna 'desconegut';
  • o per a operands coneguts, retorna '1' si un dels seus operands no és '0'; en cas contrari, retorna '0'; per a operands desconeguts o només retorna '1' si un operand no és '0'; en cas contrari, dóna "desconegut";
  • El resultat de l'operador de negació lògica no per a un operand conegut és '0' si el valor del seu operand no és igual a '0'; '1' si el valor del seu operand és '0'. Per a l'operand desconegut no dóna 'Desconegut'.

Emmagatzematge en memòria cau de valors

El servidor Zabbix guarda a la memòria cau els valors necessaris per a l'avaluació del trigger. A causa d'aquesta avaluació del trigger, la càrrega de la base de dades és més alta durant un temps després de reiniciar el servidor. La memòria cau de valors no s'esborra quan s'esborren els valors de l'historial d'elements (manualment o mitjançant el procediment de neteja), de manera que el servidor emprarà els valors de la memòria cau fins que siguin més antics en els períodes definits a les funcions de trigger o el servidor es reiniciï.

Exemples de triggers

Exemple 1

La càrrega de la CPU és massa alta al servidor Zabbix.

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

Mitjançant la funció 'last()', ens referim al valor més nou. /Zabbix server/system.cpu.load[all,avg1] dóna un nom curt del paràmetre monitorat. Especifica que l'equip és "servidor Zabbix" i la clau monitorada és "system.cpu.load[all,avg1]". Finalment, ">5" significa que el trigger és en estat PROBLEMA sempre que la mesura de càrrega de CPU més nova del servidor Zabbix sigui superior a 5.

Exemple 2

www.example.com és sobrecarregat.

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

L'expressió és certa quan la càrrega actual de la CPU és superior a 5 o la càrrega de la CPU ha estat superior a 2 en els darrers 10 minuts.

Exemple 3

/etc/passwd ha estat modificat.

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

L'expressió és certa quan el valor de la suma de comprovació /etc/passwd anterior difereix del més recent.

Expressions similars poden ésser útils per monitorar els canvis en fitxers importants, com ara /etc/passwd, /etc/inetd.conf, /kernel, etc.

Exemple 4

Algú baixa un fitxer gran d'Internet.

Emprant la funció min:

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

L'expressió és certa quan el nombre d'octets rebuts a eth0 és superior a 100 Ko en els darrers 5 minuts.

Exemple 5

Els dos nodes del servidor SMTP agrupats són aturats.

Tingueu en compte l'ús de dos equips diferents en una expressió:

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

L'expressió és certa quan els dos servidors SMTP siguin aturats a smtp1.example.com i smtp2.example.com.

Exemple 6

S'ha d'actualitzar l'agent Zabbix.

Emprant la funció find():

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

L'expressió és certa si l'agent de Zabbix és a la versió beta8.

Exemple 7

El servidor és inaccessible.

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

L'expressió és certa si l'equip "example.example.com" no és accessible després de 5 cops durant els darrers 30 minuts.

Exemple 8

Cap heartbeat durant els darrers 3 minuts.

Emprant la funció nodata():

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

Per emprar aquest trigger, "tick" s'ha de definir com un element Zabbix trapper. L'equip hauria d'enviar periòdicament dades d'aquest element mitjançant zabbix_sender. Si no es reben dades en 180 segons, el valor trigger es converteix en PROBLEMA.

Tingueu en compte que "nodata" es pot emprar per a qualsevol tipus d'element.

Exemple 9

Activitat de la CPU a la nit.

Emprant la funció time():

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

El trigger només pot canviar el seu estat a problema en horari nocturn (00:00-06:00).

Exemple 10

Activitat de la CPU en tot moment excepte excepcions.

Emprant la funció time() i l'operador no:

 min(/zabbix/system.cpu.load[all,avg1],5m)>2
        i no (dia de la setmana()=7 i hora()>230000)
        i no (dia de la setmana()=1 i hora()<010000)

El trigger pot canviar el seu estat a problema en qualsevol moment, excepte durant 2 hores durant un canvi de setmana (diumenge, 23:00 - dilluns, 01:00).

Exemple 11

Comproveu si l'hora del client local és sincronitzada amb l'hora del servidor Zabbix.

Emprant la funció fuzzytime():

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

El trigger passarà a l'estat del problema si l'hora local al servidor MySQL_DB i al servidor Zabbix difereixen més de 10 segons. Tingueu en compte que 'system.localtime' s'ha de configurar com a comprovació passiva.

Exemple 12

Comparació de la càrrega mitjana d'avui amb la càrrega mitjana de la mateixa hora d'ahir (emprant el desplaçament de temps com a "ara-1d").

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

Aquest trigger s'activarà si la càrrega mitjana de la darrera hora supera la càrrega mitjana de la mateixa hora d'ahir més del doble.

Exemple 13

Empreu el valor d'un altre element per obtindre un llindar d'activació:

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

El trigger es dispararà si l'espai lliure baixa per sota del 10%.

Exemple 14

Emprant resultat de l'avaluació per obtindre el nombre de triggers per sobre d'un llindar:

 (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

El trigger s'activarà si almenys dos dels triggers de l'expressió són en estat problemàtic.

Exemple 15

Comparant els valors de cadenes de dos elements: els operands aquí són funcions que retornen cadenes.

Problema: creeu una alerta si la versió d'Ubuntu és diferent a diferents equips

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

Comparació de dos valors de cadena. Els operands són:

  • una funció que retorna una cadena
  • una combinació de macros i cadenes

Problema: detectar canvis en la consulta de DNS

La clau de l'element és:

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

amb macros definides com

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

i normalment retorna:

 example.com MX 0 mail.example.com

Per tant, la nostra expressió trigger per detectar si el resultat de la consulta DNS es desvia del resultat esperat és:

 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}"

Observeu les cometes al segon operand.

Exemple 17

Comparació de dos valors de cadena. Els operands són:

  • una funció que retorna una cadena
  • una cadena constant amb caràcters especials \ i "

Problema: detecteu si el contingut del fitxer /tmp/hello és igual a:

 \" //Hola ?\"

Opció 1) escriure la cadena directament

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

Observeu com s'escapen els caràcters \ i " quan es compara directament la cadena.

Opció 2) emprar una macro

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

a l'expressió:

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

Compara llargs períodes de temps.

Problema: la càrrega del servidor Exchange ha pujat més d'un 10% durant el darrer mes

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

També podeu emprar el camp Nom de l'esdeveniment a la configuració del trigger per crear un missatge d'alerta significatiu, per exemple per rebre alguna cosa com ara

"La càrrega del servidor Exchange va pujar un 24% al juliol (0,69) en comparació amb el juny (0,56)"

el nom de l'esdeveniment s'ha de definir com:

 La càrrega del servidor {HOST.HOST} ha pujat un {{?100*trendavg(//system.cpu.load,1M:now/M)/trendavg(//system.cpu.load,1M:now/M-1M) }.fmtnum(0)}% en {{TIME}.fmttime(%B,-1M)} ({{?trendavg(//system.cpu.load,1M:now/M)}.fmtnum(2)}) en comparació amb {{TIME}.fmttime(%B,-2M)} ({{?trendavg(//system.cpu.load,1M:now/M-1M)}.fmtnum(2)})

També és útil permetre el tancament manual de la configuració del trigger per a aquest tipus de problema.

Histèresi

De vegades cal un interval entre els estats de problema i de recuperació, en lloc de només un llindar. Per exemple, si volem establir un trigger per informar d'un problema quan la temperatura de la sala del servidor supera els 20 °C i volem que es mantingui en l'estat de problema fins que la temperatura baixi dels 15 °C, un llindar d'activació simple a 20 °C no serà suficient.

el que hem de fer és, primer, definir un trigger per a l'esdeveniment problemàtic (temperatura superior a 20 °C). Tot seguit, hem de definir una condició de recuperació addicional (temperatura inferior a 15 °C). Per fer-ho, definiu un paràmetre addicional Expressió de recuperació quan definiu el trigger.

En aquest cas, la recuperació del problema es farà en dues passes:

  • En primer lloc, l'expressió del problema (temperatura superior a 20°C) s'ha de valorar com a FALSE
  • En segon lloc, l'expressió de recuperació (temperatura inferior a 15 °C) s'ha de valorar com a TRUE

L'expressió de recuperació s'avaluarà només quan es resolgui primer l'esdeveniment problema.

L'expressió de recuperació per si sola a TRUE no resol el problema si l'expressió problema encara és TRUE!

Exemple 1

La temperatura a la sala de servidors és massa alta.

Expressió del problema:

last(/server/temp)>20

Expressió de recuperació:

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

L'espai lliure de disc és molt baix.

Expressió del problema: menys de 10 Go durant els darrers 5 minuts

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

Expressió de recuperació: més de 40Go durant els 10 darrers minuts

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

Expressions amb operands desconeguts

Normalment, un operand desconegut (com ara un element no admès) a l'expressió estableix immediatament el valor de trigger a "Desconegut".

Tanmateix, en alguns casos es permeten operands desconeguts (elements no admesos, errors de funció) en l'avaluació d'expressions:

  • La funció nodata() s'avalua si l'element referenciat és compatible o no.
  • Les expressions lògiques amb OR i AND es poden avaluar a valors coneguts en dos casos, independentment dels operands desconeguts:
    • Cas 1: "1 o some_function(unsupported_item1) o some_function(unsupported_item2) o ..." es pot avaluar a un resultat conegut ('1' o "Problema"),
    • Cas 2: "0 and some_function(unsupported_item1) i some_function(unsupported_item2) i ..." es poden avaluar en un resultat conegut ('0' o "OK").
      Zabbix mira d'avaluar aquestes expressions lògiques prenent els elements no compatibles com a operands desconeguts. En els dos casos anteriors, es produirà un valor conegut ("Problema" o "OK", respectivament); en tots els altres casos, el trigger s'avaluarà com a "Desconegut".
  • Si l'avaluació de la funció per a un element suportat provoca un error, el valor de la funció esdevé "Desconegut" i participa com a operand desconegut en una avaluació posterior de l'expressió.

Tingueu en compte que els operands desconeguts només poden "desaparèixer" en expressions lògiques tal com es descriu anteriorment. En les expressions aritmètiques, els operands desconeguts sempre condueixen al resultat "Desconegut" (excepte la divisió per 0).

Una expressió el resultat de la qual és "Desconegut" no modifica l'estat del trigger ("Problema/D'acord"). Per tant, si era "Problema" (vegeu el cas 1), roman en el mateix estat encara que la part coneguda es resolgui ('1' es converteix a '0'), perquè l'expressió ara s'avalua com a 'Desconegut' i no canvia l'estat del trigger.

Si un trigger amb diversos elements no admesos s'avalua com a "Desconegut", el missatge d'error de la interfície fa referència al darrer element no admès avaluat.