Funzioni predittive dei trigger

Panoramica

A volte ci sono segnali di un problema imminente. Questi segnali possono essere individuati in modo da poter intraprendere azioni in anticipo per prevenire o almeno ridurre al minimo l'impatto del problema.

Zabbix dispone di strumenti per prevedere il comportamento futuro del sistema monitorato sulla base dei dati storici. Questi strumenti sono realizzati tramite funzioni predittive dei trigger.

Funzioni

Prima di impostare un trigger, è necessario definire che cosa sia uno stato di problema e quanto tempo sia necessario per intervenire. Esistono quindi due modi per configurare un trigger che segnali una potenziale situazione indesiderata. Primo: il trigger deve attivarsi quando è previsto che il sistema si trovi in uno stato di problema dopo il "tempo per intervenire". Secondo: il trigger deve attivarsi quando il sistema raggiungerà lo stato di problema in meno del "tempo per intervenire". Le corrispondenti funzioni di trigger da utilizzare sono forecast e timeleft. Si noti che l'analisi statistica sottostante è sostanzialmente identica per entrambe le funzioni. È possibile configurare un trigger nel modo che si preferisce, ottenendo risultati simili.

Parametri

Entrambe le funzioni utilizzano quasi lo stesso insieme di parametri. Utilizzare l'elenco delle funzioni supportate come riferimento.

Intervallo di tempo

Prima di tutto, è necessario specificare il periodo storico che Zabbix deve analizzare per elaborare la previsione. Questo si fa nel modo consueto, tramite il parametro time period e un eventuale spostamento temporale, come avviene con le funzioni avg, count, delta, max, min e sum.

Orizzonte di previsione

(solo forecast)
Il parametro time specifica fino a quanto nel futuro Zabbix deve estrapolare le dipendenze che trova nei dati storici. Indipendentemente dal fatto che si utilizzi time_shift o meno, time viene sempre conteggiato a partire dal momento corrente.

Soglia da raggiungere

(solo timeleft)
Il parametro threshold specifica un valore che l'item analizzato deve raggiungere, indipendentemente dal fatto che lo raggiunga dall'alto o dal basso. Una volta determinata f(t) (vedi sotto), si deve risolvere l'equazione f(t) = threshold e restituire la radice più vicina al momento attuale e situata a destra del momento attuale oppure 1.7976931348623158E+308 se non esiste una tale radice.

Quando i valori dell'item si avvicinano alla soglia e poi la superano, timeleft presume che l'intersezione sia già nel passato e pertanto passa all'intersezione successiva con il livello threshold, se presente. La procedura consigliata è usare le previsioni come complemento alla normale diagnostica dei problemi, non come sostituzione.1

Funzioni di adattamento

La funzione fit predefinita è quella lineare. Ma se il sistema monitorato è più complesso, hai a disposizione più opzioni tra cui scegliere.

fit x = f(t)
linear x = a + b*t
polynomialN2 x = a~0~ + a~1~*t + a~2~*t2 + ... + a~n~*tn
exponential x = a*exp(b*t)
logarithmic x = a + b*log(t)
power x = a*tb
Modalità

(solo forecast)
Ogni volta che una funzione trigger viene valutata, ottiene i dati dal periodo di storico specificato e adatta ai dati una funzione specificata. Quindi, se i dati sono leggermente diversi, anche la funzione adattata sarà leggermente diversa. Se calcoliamo semplicemente il valore della funzione adattata in un momento specificato nel futuro, non saprai nulla su come ci si aspetta che l'item analizzato si comporti tra adesso e quel momento nel futuro. Per alcune opzioni di fit (come polynomial) un semplice valore futuro può essere fuorviante.

mode Risultato di forecast
value f(now + time)
max max~now\ <=\ t\ <=\ now\ +\ time~ f(t)
min min~now\ <=\ t\ <=\ now\ +\ time~ f(t)
delta max - min
avg media di f(t) (now <= t <= now + time) secondo la definizione

Dettagli

Per evitare calcoli con numeri enormi, consideriamo il timestamp del primo valore nel periodo specificato più 1 ns come un nuovo tempo zero corrente (il tempo epoch corrente è dell'ordine di 109, l'epoch al quadrato è 1018, la precisione double è circa 10-16). Viene aggiunto 1 ns per fornire tutti i valori di tempo positivi per gli adattamenti logaritmici e di potenza, che comportano il calcolo di log(t). Lo spostamento temporale non influisce sugli adattamenti lineari, polinomiali ed esponenziali (a parte rendere i calcoli più semplici e precisi), ma modifica la forma delle funzioni logaritmiche e di potenza.

Errori potenziali

Le funzioni restituiscono -1 nelle seguenti situazioni:

  • il periodo di valutazione specificato non contiene dati;
  • il risultato dell'operazione matematica non è definito3;
  • complicazioni numeriche (purtroppo, per alcuni insiemi di dati di input, l'intervallo e la precisione del formato in virgola mobile a doppia precisione diventano insufficienti)4.

Non vengono segnalati avvisi o errori se l'adattamento scelto descrive male i dati forniti oppure se i dati sono semplicemente troppo pochi per una previsione accurata.

Esempi e gestione degli errori

Per ricevere un avviso quando stai per esaurire lo spazio libero su disco del tuo host, puoi usare un'espressione trigger come questa:

timeleft(/host/vfs.fs.size[/,free],1h,0)<1h

Tuttavia, il codice di errore -1 può entrare in gioco e portare il trigger in uno stato di problema. In generale è una buona cosa, perché ricevi un avviso che le tue previsioni non funzionano correttamente e dovresti esaminarle più a fondo per capire il motivo. Ma a volte è un male, perché -1 può semplicemente significare che nell'ultima ora non sono stati ottenuti dati sullo spazio libero su disco dell'host. Se ricevi troppi avvisi di falsi positivi, considera l'uso di un'espressione trigger più complessa 5:

timeleft(/host/vfs.fs.size[/,free],1h,0)<1h and timeleft(/host/vfs.fs.size[/,free],1h,0)<>-1

La situazione è un po' più difficile con forecast. Prima di tutto, -1 può o meno portare il trigger in uno stato di problema a seconda del fatto che tu abbia un'espressione come forecast(/host/item,(...))<... oppure come forecast(/host/item,(...))>...

Inoltre, -1 può essere una previsione valida se è normale che il valore dell'item sia negativo. Ma la probabilità di questa situazione nel mondo reale è trascurabile (vedi come funziona l'operatore =). Quindi aggiungi ... or forecast(/host/item,(...))=-1 oppure ... and forecast(/host/item,(...))<>-1 se vuoi o non vuoi trattare rispettivamente -1 come un problema.

Note

1 Ad esempio, un semplice trigger come timeleft(/host/item,1h,X) < 1h può entrare in stato di problema quando il valore dell'item si avvicina a X e poi improvvisamente riprendersi una volta raggiunto il valore X. Se il problema è che il valore dell'item è inferiore a X, usa: last(/host/item) < X or timeleft(/host/item,1h,X) < 1h Se il problema è che il valore dell'item è superiore a X usa: last(/host/item) > X or timeleft(/host/item,1h,X) < 1h

2 Il grado del polinomio può andare da 1 a 6, polynomial1 è equivalente a linear. Tuttavia, usa polinomi di grado superiore con cautela. Se il periodo di valutazione contiene meno punti di quelli necessari per determinare i coefficienti del polinomio, il grado del polinomio verrà ridotto (ad esempio, viene richiesto polynomial5, ma ci sono solo 4 punti, quindi verrà adattato polynomial3).

3 Ad esempio, l'adattamento di funzioni exponential o power comporta il calcolo di log() dei valori dell'item. Se i dati contengono zeri o numeri negativi, otterrai un errore poiché log() è definito solo per valori positivi.

4 Per gli adattamenti linear, exponential, logarithmic e power tutti i calcoli necessari possono essere scritti esplicitamente. Per polynomial solo value può essere calcolato senza passaggi aggiuntivi. Il calcolo di avg comporta il calcolo della primitiva del polinomio (analiticamente). Il calcolo di max, min e delta comporta il calcolo della derivata del polinomio (analiticamente) e la ricerca delle sue radici (numericamente). La risoluzione di f(t) = 0 comporta la ricerca delle radici del polinomio (numericamente).

5 Ma in questo caso -1 può far sì che il trigger esca dallo stato di problema. Per essere completamente protetti usa: timeleft(/host/vfs.fs.size[/,free],1h,0)<1h and ({TRIGGER.VALUE}=0 and timeleft(/host/vfs.fs.size[/,free],1h,0)<>-1 or {TRIGGER.VALUE}=1)