2 Espressione del trigger
Panoramica
Le espressioni utilizzate nei trigger sono molto flessibili. Puoi usarle per creare test logici complessi relativi alle statistiche monitorate.
Una semplice espressione utilizza una funzione applicata all'item con alcuni parametri. La funzione restituisce un risultato che viene confrontato con la soglia, usando un operatore e una costante.
La sintassi di una semplice espressione utile è function(/host/key,parameter)<operator><constant>.
Per esempio:
min(/Zabbix server/net.if.in[eth0,bytes],5m)>100K
attiverà un trigger se il numero di byte ricevuti negli ultimi cinque minuti è stato sempre superiore a 100 kilobyte.
Sebbene la sintassi sia esattamente la stessa, dal punto di vista funzionale esistono due tipi di espressioni di trigger:
- espressione di problema - definisce le condizioni del problema
- espressione di ripristino (opzionale) - definisce condizioni aggiuntive per la risoluzione del problema
Quando si definisce solo un'espressione di problema, questa verrà usata sia come soglia del problema sia come soglia di ripristino del problema. Non appena l'espressione di problema viene valutata come TRUE, si verifica un problema. Non appena l'espressione di problema viene valutata come FALSE, il problema viene risolto.
Quando si definiscono sia l'espressione di problema sia l'espressione di ripristino supplementare, la risoluzione del problema diventa più complessa: non solo l'espressione di problema deve essere FALSE, ma anche l'espressione di ripristino deve essere TRUE. Questo è utile per creare isteresi ed evitare il flapping del trigger.
Non è produttivo usare la macro {TRIGGER.VALUE} in un'espressione di ripristino perché questa espressione viene valutata solo quando il trigger è nello stato "Problem". Di conseguenza, {TRIGGER.VALUE} verrà sempre risolto in "1" (che indica uno stato "Problem") durante la valutazione dell'espressione.
Funzioni
Le funzioni consentono di calcolare i valori raccolti (media, minimo, massimo, somma), trovare stringhe, fare riferimento all'ora corrente e ad altri fattori.
È disponibile un elenco completo delle funzioni supportate.
In genere, le funzioni restituiscono valori numerici per il confronto. Quando restituiscono stringhe, il confronto è possibile con gli operatori = e <> (vedere esempio).
Parametri della funzione
I parametri della funzione consentono di specificare:
- host e chiave dell'item (funzioni che fanno riferimento solo alla cronologia dell'item dell'host)
- parametri specifici della funzione
- altre espressioni (non disponibili per le funzioni che fanno riferimento alla cronologia dell'item dell'host, vedere altre espressioni per esempi)
L'host e la chiave dell'item possono essere specificati come /host/key.
L'omissione del nome dell'host nel primo parametro (cioè come in function(//key,parameter,...)) è supportata solo in determinati contesti:
- Nella formula degli item calcolati
- Nelle macro di espressione, che possono essere usate nei seguenti campi:
- Il campo Nome evento
- Nome del grafico
- L'etichetta degli elementi della mappa “Host” e “Trigger”
In questi contesti, è possibile usare anche la macro {HOST.HOST}.
{HOST.HOST<1-9>} può essere usata nel caso del campo Nome evento e dell'elemento della mappa "Trigger" per fare riferimento a un item specifico nell'espressione del trigger.
Quando il nome dell'host viene omesso o sostituito da {HOST.HOST} in questi contesti, il riferimento punta al primo item nell'espressione del trigger o al primo item nel grafico.
Al di fuori di questi contesti supportati, l'omissione del nome dell'host nelle espressioni del trigger genererà un errore.
Vedere Esempio 18 per un'illustrazione dell'uso di doppio slash nelle macro di Nome evento.
L'item a cui si fa riferimento deve trovarsi in uno stato supportato (tranne per la funzione nodata(), che viene calcolata anche per gli item non supportati).
Sebbene altre espressioni del trigger come parametri di funzione siano limitate alle funzioni non basate sulla cronologia nei trigger, questa limitazione non si applica negli item calcolati.
Parametri specifici della funzione
I parametri specifici della funzione vengono inseriti dopo la chiave dell'item e sono separati dalla chiave dell'item da una virgola. Vedere le funzioni supportate per un elenco completo di questi parametri.
La maggior parte delle funzioni numeriche accetta il tempo come parametro. È possibile usare i secondi o i suffissi di tempo per indicare il tempo. Se preceduto da un cancelletto, il parametro ha un significato diverso:
| Expression | Description |
|---|---|
| sum(/host/key,10m) | Somma dei valori negli ultimi 10 minuti. |
| sum(/host/key,#10) | Somma degli ultimi dieci valori. |
I parametri con un cancelletto hanno un significato diverso con la funzione last: indicano l'N-esimo valore precedente, quindi dati i valori 30, 70, 20, 60, 50 (dal più recente al meno recente):
last(/host/key,#2)restituirebbe '70'last(/host/key,#5)restituirebbe '50'
Spostamento temporale
È supportato uno spostamento temporale opzionale con il tempo o con il conteggio dei valori come parametro della funzione. Questo parametro consente di fare riferimento ai dati di un periodo di tempo nel passato.
Lo spostamento temporale inizia con now - che specifica l'ora corrente, ed è seguito da +N<unità di tempo> o -N<unità di tempo> - per aggiungere o sottrarre N unità di tempo.
Ad esempio, avg(/host/key,1h:now-1d) restituirà il valore medio di un'ora di un giorno fa.
Lo spostamento temporale specificato in mesi (M) e anni (y) è supportato solo per le funzioni di trend. Le altre funzioni supportano secondi (s), minuti (m), ore (h), giorni (d) e settimane (w).
Spostamento temporale con periodi di tempo assoluti
I periodi di tempo assoluti sono supportati nel parametro di spostamento temporale, ad esempio da mezzanotte a mezzanotte per un giorno, da lunedì a domenica per una settimana, dal primo all'ultimo giorno del mese per un mese.
Lo spostamento temporale per i periodi di tempo assoluti inizia con now - che specifica l'ora corrente, ed è seguito da un qualsiasi numero di operazioni temporali: /<unità di tempo> - definisce l'inizio e la fine dell'unità di tempo, ad esempio da mezzanotte a mezzanotte per un giorno, +N<unità di tempo> o -N<unità di tempo> - per aggiungere o sottrarre N unità di tempo.
Si noti che il valore dello spostamento temporale può essere maggiore o uguale a 0, mentre il valore minimo del periodo di tempo è 1.
| Parametro | Descrizione |
|---|---|
| 1d:now/d | Ieri |
| 1d:now/d+1d | Oggi |
| 2d:now/d+1d | Ultimi 2 giorni |
| 1w:now/w | Settimana scorsa |
| 1w:now/w+1w | Questa settimana |
Altre espressioni
I parametri della funzione possono contenere altre espressioni, come nella seguente sintassi:
min(min(/host/key,1h),min(/host2/key2,1h)*10)
Si noti che altre espressioni non possono essere utilizzate se la funzione fa riferimento alla cronologia dell'item. Ad esempio, la seguente sintassi non è consentita:
min(/host/key,#5*10)
Operatori
I seguenti operatori sono supportati per i trigger (in ordine decrescente di priorità di esecuzione):
| Priority | Operator | Definition | Notes for unknown values | Force cast operand to float 1 |
|---|---|---|---|---|
| 1 | - | Meno unario | -Unknown → Unknown | Yes |
| 2 | not | NOT logico | not Unknown → Unknown | Yes |
| 3 | * | Moltiplicazione | 0 * Unknown → Unknown (yes, Unknown, not 0 - to not lose Unknown in arithmetic operations) 1.2 * Unknown → Unknown |
Yes |
| / | Divisione | Unknown / 0 → error Unknown / 1.2 → Unknown 0.0 / Unknown → Unknown |
Yes | |
| 4 | + | Più aritmetico | 1.2 + Unknown → Unknown | Yes |
| - | Meno aritmetico | 1.2 - Unknown → Unknown | Yes | |
| 5 | < | Minore di. L'operatore è definito come: A<B ⇔ (A<B-0.000001) |
1.2 < Unknown → Unknown | Yes |
| <= | Minore o uguale a. L'operatore è definito come: A<=B ⇔ (A≤B+0.000001) |
Unknown <= Unknown → Unknown | Yes | |
| > | Maggiore di. L'operatore è definito come: A>B ⇔ (A>B+0.000001) |
Yes | ||
| >= | Maggiore o uguale a. L'operatore è definito come: A>=B ⇔ (A≥B-0.000001) |
Yes | ||
| 6 | = | Uguale. L'operatore è definito come: A=B ⇔ (A≥B-0.000001) and (A≤B+0.000001) |
No 1 | |
| <> | Diverso. L'operatore è definito come: A<>B ⇔ (A<B-0.000001) or (A>B+0.000001) |
No 1 | ||
| 7 | and | AND logico | 0 and Unknown → 0 1 and Unknown → Unknown Unknown and Unknown → Unknown |
Yes |
| 8 | or | OR logico | 1 or Unknown → 1 0 or Unknown → Unknown Unknown or Unknown → Unknown |
Yes |
1 L'operando stringa viene comunque convertito in numerico se:
- un altro operando è numerico
- viene usato un operatore diverso da = o <> su un operando
Per gli operatori relazionali (<, <=, >, >=): se la conversione fallisce (ad esempio, su ""), l'espressione restituisce Unknown (nessun fallback al confronto tra stringhe).
Per gli operatori di uguaglianza (=, <>): se la conversione fallisce, gli operandi vengono confrontati come stringhe grezze.
Gli operatori not, and e or sono sensibili alle maiuscole/minuscole e devono essere in minuscolo. Devono inoltre essere racchiusi da spazi o parentesi.
Tutti gli operatori, tranne il meno unario - e not, hanno associatività da sinistra a destra. Il meno unario - e not non sono associativi (il che significa che è necessario usare -(-1) e not (not 1) invece di --1 e not not 1).
Risultato della valutazione:
- gli operatori <, <=, >, >=, =, <> devono restituire '1' nell'espressione del trigger se la relazione specificata è vera e '0' se è falsa. Se almeno un operando è Unknown, il risultato è Unknown;
- and per operandi noti deve restituire '1' se entrambi i suoi operandi sono diversi da '0'; altrimenti restituisce '0'; per operandi Unknown, and restituisce '0' solo se uno degli operandi è uguale a '0'; altrimenti restituisce 'Unknown';
- or per operandi noti deve restituire '1' se almeno uno dei suoi operandi è diverso da '0'; altrimenti restituisce '0'; per operandi Unknown, or restituisce '1' solo se uno degli operandi è diverso da '0'; altrimenti restituisce 'Unknown';
- il risultato dell'operatore di negazione logica not per un operando noto è '0' se il valore del suo operando è diverso da '0'; '1' se il valore del suo operando è uguale a '0'. Per un operando Unknown, not restituisce 'Unknown'.
Cache dei valori
I valori richiesti per la valutazione dei trigger vengono memorizzati nella cache dal server Zabbix. Per questo motivo, la valutazione dei trigger provoca un carico più elevato sul database per un certo periodo di tempo dopo il riavvio del server.
La cache dei valori non viene svuotata quando i valori della cronologia degli item vengono rimossi (manualmente o dal processo housekeeper), quindi il server utilizzerà i valori memorizzati nella cache finché non saranno più vecchi dei periodi di tempo definiti nelle funzioni dei trigger o finché il server non verrà riavviato.
Se nella cache non sono presenti dati recenti e nella funzione non è definito alcun periodo di interrogazione, per impostazione predefinita Zabbix risalirà fino a una settimana nel passato per interrogare il database alla ricerca di valori storici.
Esempi di trigger
Esempio 1
Il carico del processore è troppo elevato su Zabbix server.
last(/Zabbix server/system.cpu.load[all,avg1])>5
Usando la funzione 'last()', facciamo riferimento al valore più recente.
/Zabbix server/system.cpu.load[all,avg1] fornisce un nome breve del parametro monitorato.
Specifica che l'host è 'Zabbix server' e che la chiave monitorata è 'system.cpu.load[all,avg1]'.
Infine, >5 significa che il trigger è nello stato PROBLEM ogni volta che l'ultima misurazione del carico del processore da Zabbix server è maggiore di 5.
Esempio 2
www.example.com è sovraccarico.
last(/www.example.com/system.cpu.load[all,avg1])>5 or min(/www.example.com/system.cpu.load[all,avg1],10m)>2
L'espressione è vera quando il carico attuale del processore è superiore a 5 oppure il carico del processore è stato superiore a 2 negli ultimi 10 minuti.
Esempio 3
/etc/passwd è stato modificato.
last(/www.example.com/vfs.file.cksum[/etc/passwd],#1)<>last(/www.example.com/vfs.file.cksum[/etc/passwd],#2)
L'espressione è vera quando il valore precedente del checksum di /etc/passwd differisce da quello più recente.
Espressioni simili potrebbero essere utili per monitorare le modifiche in file importanti, come /etc/passwd, /etc/inetd.conf, /kernel, ecc.
Esempio 4
Qualcuno sta scaricando un file di grandi dimensioni da Internet.
Uso della funzione min:
min(/www.example.com/net.if.in[eth0,bytes],5m)>100K
L'espressione è vera quando il numero di byte ricevuti su eth0 è superiore a 100 KB negli ultimi 5 minuti.
Esempio 5
Entrambi i nodi del server SMTP in cluster sono inattivi.
Si noti l'uso di due host diversi in una sola espressione:
last(/smtp1.example.com/net.tcp.service[smtp])=0 and last(/smtp2.example.com/net.tcp.service[smtp])=0
L'espressione è vera quando entrambi i server SMTP sono inattivi sia su smtp1.example.com sia su smtp2.example.com.
Esempio 6
È necessario aggiornare l'agent di Zabbix.
Uso della funzione find():
find(/example.example.com/agent.version,,"like","beta8")=1
L'espressione è vera se l'agent di Zabbix ha la versione beta8.
Esempio 7
Il server non è raggiungibile.
count(/example.example.com/icmpping,30m,,"0")>5
L'espressione è vera se l'host "example.example.com" non è raggiungibile più di 5 volte negli ultimi 30 minuti.
Esempio 8
Nessun heartbeat negli ultimi 3 minuti.
Uso della funzione nodata():
nodata(/example.example.com/tick,3m)=1
Per utilizzare questo trigger, 'tick' deve essere definito come item Zabbix trapper. L'host deve inviare periodicamente i dati per questo item usando zabbix_sender. Se non vengono ricevuti dati entro 180 secondi, il valore del trigger diventa PROBLEM.
Nota che 'nodata' può essere usato per qualsiasi tipo di item.
Esempio 9
Attività della CPU durante la notte.
Uso della funzione time():
min(/Zabbix server/system.cpu.load[all,avg1],5m)>2 and time()<060000
Il trigger può cambiare il proprio stato in problem solo durante la notte (00:00 - 06:00).
Esempio 10
Attività della CPU in qualsiasi momento con eccezione.
Uso della funzione time() e dell'operatore not:
min(/zabbix/system.cpu.load[all,avg1],5m)>2
and not (dayofweek()=7 and time()>230000)
and not (dayofweek()=1 and time()<010000)
Il trigger può cambiare il proprio stato in problem in qualsiasi momento, tranne per 2 ore al cambio di settimana (domenica, 23:00 - lunedì, 01:00).
Esempio 11
Verifica se l'ora locale del client è sincronizzata con l'ora del server Zabbix.
Uso della funzione fuzzytime():
fuzzytime(/MySQL_DB/system.localtime,10s)=0
Il trigger passerà allo stato di problema nel caso in cui l'ora locale sul server MySQL_DB e l'ora del server Zabbix differiscano di più di 10 secondi. Si noti che 'system.localtime' deve essere configurato come controllo passivo per l'agent Zabbix; su Zabbix agent 2 può essere configurato come controllo attivo.
Esempio 12
Confronto del carico medio di oggi con il carico medio della stessa ora di ieri (usando lo time shift come now-1d).
avg(/server/system.cpu.load,1h)/avg(/server/system.cpu.load,1h:now-1d)>2
Il trigger si attiverà se il carico medio dell'ultima ora supera di più di due volte il carico medio della stessa ora di ieri.
Esempio 13
Utilizzo del valore di un altro item per ottenere una soglia del trigger:
last(/Template PfSense/hrStorageFree[{#SNMPVALUE}])<last(/Template PfSense/hrStorageSize[{#SNMPVALUE}])*0.1
Il trigger si attiverà se lo spazio di archiviazione libero scende sotto il 10 percento.
Esempio 14
Utilizzo del risultato della valutazione per ottenere il numero di trigger oltre una soglia:
(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
Il trigger si attiverà se almeno due dei trigger nell'espressione si trovano in uno stato di problema.
Esempio 15
Confronto dei valori stringa di due item - gli operandi qui sono funzioni che restituiscono stringhe.
Problema: creare un alert se la versione di Ubuntu è diversa su host diversi
last(/NY Zabbix server/vfs.file.contents[/etc/os-release])<>last(/LA Zabbix server/vfs.file.contents[/etc/os-release])
Esempio 16
Confronto di due valori stringa - gli operandi sono:
- una funzione che restituisce una stringa
- una combinazione di macro e stringhe
Problema: rilevare modifiche nella query DNS
La chiave dell'item è:
net.dns.record[192.0.2.1,{$WEBSITE_NAME},{$DNS_RESOURCE_RECORD_TYPE},2,1]
con macro definite come
{$WEBSITE_NAME} = example.com
{$DNS_RESOURCE_RECORD_TYPE} = MX
e normalmente restituisce:
example.com MX 0 mail.example.com
Quindi la nostra espressione di trigger per rilevare se il risultato della query DNS si è discostato dal risultato atteso è:
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}"
Si notino le virgolette attorno al secondo operando.
Esempio 17
Confronto di due valori stringa - gli operandi sono:
- una funzione che restituisce una stringa
- una costante stringa con caratteri speciali \ e "
Problema: rilevare se il contenuto del file /tmp/hello è uguale a:
\" //hello ?\"
Opzione 1. Scrivere la stringa direttamente:
last(/Zabbix server/vfs.file.contents[/tmp/hello])="\\\" //hello ?\\\""
Si noti come i caratteri \ e " vengono escapati quando la stringa viene confrontata direttamente.
Opzione 2. Usare una macro
{$HELLO_MACRO} = \" //hello ?\"
nell'espressione:
last(/Zabbix server/vfs.file.contents[/tmp/hello])={$HELLO_MACRO}
Esempio 18
Confronto di periodi a lungo termine.
Problema: il carico del server Exchange è aumentato di oltre il 10% il mese scorso
trendavg(/Exchange/system.cpu.load,1M:now/M)>1.1*trendavg(/Exchange/system.cpu.load,1M:now/M-1M)
È inoltre possibile usare il campo Nome evento nella configurazione del trigger per creare un messaggio di avviso significativo, ad esempio per ottenere qualcosa come
"Il carico del server Exchange è aumentato del 24% a luglio (0.69) rispetto a giugno (0.56)"
il nome dell'evento deve essere definito come:
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)})
È inoltre utile consentire la chiusura manuale nella configurazione del trigger per questo tipo di problema.
Hai un esempio di espressione di trigger che potrebbe essere utile ad altri? Usa il modulo di suggerimento di esempio per inviarlo agli sviluppatori di Zabbix.
Isteresi
A volte è necessario un intervallo tra gli stati di problema e di ripristino, invece di una semplice soglia. Ad esempio, se vogliamo definire un trigger che segnali un problema quando la temperatura della sala server supera i 20°C e vogliamo che rimanga nello stato di problema finché la temperatura non scende sotto i 15°C, una semplice soglia del trigger a 20°C non sarà sufficiente.
Dobbiamo invece definire prima un'espressione del trigger per l'evento di problema (temperatura superiore a 20°C). Poi dobbiamo definire una condizione di ripristino aggiuntiva (temperatura inferiore a 15°C). Questo si fa definendo un parametro aggiuntivo Recovery expression quando si definisce un trigger.
In questo caso, il ripristino del problema avverrà in due passaggi:
- Prima, l'espressione del problema (temperatura superiore a 20°C) dovrà risultare FALSE
- Secondo, l'espressione di ripristino (temperatura inferiore a 15°C) dovrà risultare TRUE
L'espressione di ripristino verrà valutata solo quando l'evento di problema viene prima risolto.
Il fatto che la recovery expression sia TRUE da sola non risolve un problema se l'espressione del problema è ancora TRUE!
Esempio 1
La temperatura nella sala server è troppo alta.
Espressione del problema:
last(/server/temp)>20
Espressione di ripristino:
last(/server/temp)<=15
Esempio 2
Lo spazio libero su disco è troppo basso.
Espressione del problema: è inferiore a 10 GB negli ultimi 5 minuti
max(/server/vfs.fs.size[/,free],5m)<10G
Espressione di ripristino: è superiore a 40 GB negli ultimi 10 minuti
min(/server/vfs.fs.size[/,free],10m)>40G
Espressioni con operandi sconosciuti
In generale, un operando sconosciuto (ad esempio un item non supportato) nell'espressione renderà immediatamente il valore del trigger Unknown.
Tuttavia, in alcuni casi gli operandi sconosciuti (item non supportati, errori di funzione) sono ammessi nella valutazione dell'espressione:
- La funzione
nodata()viene valutata indipendentemente dal fatto che l'item a cui si fa riferimento sia supportato o meno. - Le espressioni logiche con OR e AND possono essere valutate a valori noti in due casi, indipendentemente dagli operandi sconosciuti:
- Caso 1: "
1 or some_function(unsupported_item1) or some_function(unsupported_item2) or ..." può essere valutato a un risultato noto ('1' o "Problem"), - Caso 2: "
0 and some_function(unsupported_item1) and some_function(unsupported_item2) and ..." può essere valutato a un risultato noto ('0' o "OK").
Zabbix cerca di valutare queste espressioni logiche considerando gli item non supportati come operandi sconosciuti. Nei due casi sopra verrà prodotto un valore noto ("Problem" o "OK", rispettivamente); in tutti gli altri casi il trigger verrà valutato comeUnknown.
- Caso 1: "
- Se la valutazione della funzione per un item supportato genera un errore, il valore della funzione diventa
Unknowne partecipa come operando sconosciuto nelle valutazioni successive dell'espressione.
Si noti che gli operandi sconosciuti possono "scomparire" solo nelle espressioni logiche, come descritto sopra.
Nelle espressioni aritmetiche gli operandi sconosciuti portano sempre al risultato Unknown (tranne la divisione per 0).
Un'espressione che produce Unknown non modifica lo stato del trigger ("Problem/OK").
Quindi, se era "Problem" (vedi Caso 1), rimane nello stesso stato di problema anche se la parte nota viene risolta ('1' diventa '0'), perché l'espressione viene ora valutata come Unknown e questo non modifica lo stato del trigger.
Se un'espressione del trigger con diversi item non supportati viene valutata come Unknown, il messaggio di errore nel frontend fa riferimento all'ultimo item non supportato valutato.