7 Funzioni di trigger predittive

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 il problema o almeno ridurne al minimo l'impatto.

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

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 si prevede che il sistema si trovi in uno stato di problema dopo il "tempo per agire". Secondo: il trigger deve attivarsi quando il sistema sta per raggiungere lo stato di problema in meno del "tempo per agire". Le funzioni di trigger corrispondenti da usare sono forecast e timeleft. Si noti che l'analisi statistica sottostante è sostanzialmente identica per entrambe le funzioni. È possibile configurare un trigger in uno dei due modi, con risultati simili.

Parametri

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

Intervallo di tempo

Innanzitutto, è necessario specificare il periodo storico che Zabbix deve analizzare per elaborare la previsione. Lo si fa in modo familiare tramite il parametro time period e l'eventuale time shift, come si fa con le funzioni avg, count, delta, max, min e sum.

Orizzonte di previsione

(solo forecast)
Il parametro time specifica quanto in avanti 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 provenga dall'alto o dal basso. Una volta determinata f(t) (vedi sotto), è necessario risolvere l'equazione f(t) = threshold e restituire la radice più vicina a ora e alla destra di ora oppure 1.7976931348623158E+308 se non esiste una radice di questo tipo.

Quando i valori dell'item si avvicinano alla soglia e poi la superano, timeleft assume che l'intersezione sia già nel passato e quindi passa alla successiva intersezione con il livello threshold, se presente. La pratica migliore consiste nell'usare le previsioni come complemento alla normale diagnostica dei problemi, non come sostituzione.1

Funzioni di adattamento

Il fit predefinito è la funzione lineare. Tuttavia, se il sistema monitorato è più complesso, hai più opzioni tra cui scegliere.

fit x = f(t)
lineare x = a + b*t
polynomialN2 x = a~0~ + a~1~*t + a~2~*t2 + ... + a~n~*tn
esponenziale x = a*exp(b*t)
logaritmica x = a + b*log(t)
potenza x = a*tb
Modalità

(solo forecast)
Ogni volta che una funzione di trigger viene valutata, riceve i dati dal periodo di cronologia 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 specifico nel futuro, non saprai nulla su come l'item analizzato dovrebbe comportarsi tra adesso e quel momento nel futuro. Per alcune opzioni di fit (come polynomial) un semplice valore futuro può essere fuorviante.

mode risultato 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 (il tempo epoch corrente è dell'ordine di 109, l'epoch al quadrato è 1018, la precisione doppia è circa 10-16). Viene aggiunto 1 ns per fornire tutti i valori di tempo positivi per gli adattamenti logaritmici e power, che comportano il calcolo di log(t). Lo spostamento temporale non influisce su lineare, polinomiale, esponenziale (a parte calcoli più semplici e precisi), ma modifica la forma delle funzioni logaritmiche e power.

Possibili errori

Le funzioni restituiscono -1 in queste 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 floating-point a doppia precisione diventano insufficienti)4.

Non vengono segnalati avvisi o errori se il fit scelto descrive in modo inadeguato i dati forniti oppure se i dati sono semplicemente troppo pochi per una previsione accurata.

Esempi e gestione degli errori

Per ottenere un avviso quando stai per esaurire lo spazio libero su disco sul tuo host, puoi usare un'espressione di 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 tuo trigger in uno stato di problema. In generale è positivo, perché ricevi un avviso che le tue previsioni non funzionano correttamente e dovresti esaminarle più attentamente per capire perché. Ma a volte è negativo, perché -1 può semplicemente significare che non sono stati ottenuti dati sullo spazio libero su disco dell'host nell'ultima ora. Se ricevi troppi falsi positivi, considera l'uso di un'espressione di 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ò mettere o meno il trigger in uno stato di problema a seconda 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 -1 come un problema, rispettivamente.

Note

1 Ad esempio, un semplice trigger come timeleft(/host/item,1h,X) < 1h può entrare nello stato di problema quando il valore dell'item si avvicina a X e poi si ripristina improvvisamente 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ò variare 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 quanti ne servano 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, si otterrà 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 dell'antiderivata 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). Risolvere f(t) = 0 comporta la ricerca delle radici del polinomio (numericamente).

5 Ma in questo caso -1 può causare il ripristino del tuo trigger dallo stato di problema. Per essere completamente protetto 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)