[comment]: # ({f445d963-f445d963})
# 7 Funzioni di trigger predittive

[comment]: # ({/f445d963-f445d963})

[comment]: # ({9dac6d6d-9dac6d6d})
#### 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.

[comment]: # ({/9dac6d6d-9dac6d6d})

[comment]: # ({827f1d5f-24b155a7})
#### 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.

[comment]: # ({/827f1d5f-24b155a7})

[comment]: # ({cbcb40b7-c80922f6})
#### Parametri

Entrambe le funzioni utilizzano quasi lo stesso insieme di parametri. Utilizzare l'elenco delle [funzioni supportate](/manual/appendix/functions) come riferimento.

[comment]: # ({/cbcb40b7-c80922f6})

[comment]: # ({33e199b9-a93b071e})
##### 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**.

[comment]: # ({/33e199b9-a93b071e})

[comment]: # ({55d83c24-b922d0f2})
##### Orizzonte di previsione

(solo **forecast**)<br>
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.

[comment]: # ({/55d83c24-b922d0f2})

[comment]: # ({1ccaacd1-625c0c85})
##### Soglia da raggiungere

(solo **timeleft**)<br>
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.

::: notetip
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](#footnotes)^
:::

[comment]: # ({/1ccaacd1-625c0c85})

[comment]: # ({4d1deb86-976bd98e})
##### 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|
|*polynomialN*^[2](#footnotes)^|x = a~0~ + a~1~\*t + a~2~\*t^2^ + ... + a~n~\*t^n^|
|*esponenziale*|x = a\*exp(b\*t)|
|*logaritmica*|x = a + b\*log(t)|
|*potenza*|x = a\*t^b^|

[comment]: # ({/4d1deb86-976bd98e})

[comment]: # ({3c1c1442-add67840})
##### Modalità

(solo **forecast**)<br>
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](https://en.wikipedia.org/wiki/Mean_of_a_function)|

[comment]: # ({/3c1c1442-add67840})

[comment]: # ({3f946ebf-5ff2285e})
#### 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 10^9^, l'epoch al quadrato è 10^18^,
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*.

[comment]: # ({/3f946ebf-5ff2285e})

[comment]: # ({d180bad2-660cda6b})
#### Possibili errori

Le funzioni restituiscono -1 in queste situazioni:

-   il periodo di valutazione specificato non contiene dati;
-   il risultato dell'operazione matematica non è definito^[3](#footnotes)^;
-   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](#footnotes)^.

::: notetip
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.
:::

[comment]: # ({/d180bad2-660cda6b})

[comment]: # ({e57d3e18-06e0a230})
#### 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](#footnotes)^:

    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](/manual/config/triggers/expression) 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](https://en.wikipedia.org/wiki/Runge's_phenomenon). 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)`

[comment]: # ({/e57d3e18-06e0a230})
