[comment]: # ({f445d963-f445d963})
# 7 Prognozējošās trigeru funkcijas

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

[comment]: # ({9dac6d6d-9dac6d6d})
#### Pārskats

Dažkārt ir pazīmes, kas liecina par gaidāmu problēmu. Šīs pazīmes var
pamanīt, lai savlaicīgi varētu veikt darbības un novērst problēmu vai vismaz
samazināt tās ietekmi.

Zabbix ir rīki, kas ļauj prognozēt uzraudzītās sistēmas turpmāko darbību,
pamatojoties uz vēsturiskajiem datiem. Šie rīki ir realizēti, izmantojot
prognozējošās trigeru funkcijas.

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

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

Pirms iestatīt trigeri, ir nepieciešams definēt, kas ir problēmas stāvoklis un cik daudz laika ir nepieciešams, lai veiktu darbību. Pēc tam ir divi veidi, kā iestatīt trigeri, kas signalizē par iespējamu nevēlamu situāciju. Pirmais: trigerim jāaktivizējas, kad ir sagaidāms, ka sistēma būs problēmas stāvoklī pēc "time to act". Otrais: trigerim jāaktivizējas, kad sistēma nonāks problēmas stāvoklī mazāk nekā "time to act" laikā. Atbilstošās trigeru funkcijas, ko izmantot, ir **forecast** un **timeleft**. Ņemiet vērā, ka pamatā esošā statistiskā analīze abām funkcijām ir būtībā identiska. Jūs varat iestatīt trigeri jebkurā no šiem veidiem ar līdzīgiem rezultātiem.

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

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

Abas funkcijas izmanto gandrīz vienu un to pašu parametru kopu. Atsaucei izmantojiet
[supported functions](/manual/appendix/functions) sarakstu.

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

[comment]: # ({33e199b9-a93b071e})
##### Laika intervāls

Vispirms jums jānorāda vēsturiskais periods, ko Zabbix vajadzētu analizēt, lai iegūtu prognozi. To var izdarīt ierastā veidā, izmantojot parametru `time period` un, ja nepieciešams, laika nobīdi, tāpat kā tas tiek darīts ar funkcijām **avg**, **count**, **delta**, **max**, **min** un **sum**.

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

[comment]: # ({55d83c24-b922d0f2})
##### Prognozēšanas horizonts

(tikai **forecast**)<br>
Parametrs `time` norāda, cik tālu nākotnē Zabbix vajadzētu ekstrapolēt atkarības, ko tas atrod vēsturiskajos datos. Neatkarīgi no tā, vai izmantojat `time_shift` vai nē, `time` vienmēr tiek skaitīts, sākot no pašreizējā brīža.

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

[comment]: # ({1ccaacd1-625c0c85})
##### Slieksnis, kas jāsasniedz

(tikai **timeleft**)<br>
Parametrs `threshold` norāda vērtību, ko analizētais vienums ir jāsasniedz,
nav nozīmes, vai no augšas vai no apakšas. Kad ir noteikta f(t)
(sk. tālāk), jāatrisina vienādojums f(t) = `threshold` un jāatgriež
sakne, kas ir tuvāk tagadnei un pa labi no tagadnes, vai
1.7976931348623158E+308, ja šādas saknes nav.

::: notetip
Kad vienuma vērtības tuvojas slieksnim un pēc tam to šķērso,
**timeleft** pieņem, ka krustpunkts jau ir pagātnē, un
tāpēc pārslēdzas uz nākamo krustpunktu ar `threshold` līmeni, ja
tāds ir. Labākā prakse ir izmantot prognozes kā papildinājumu
parastai problēmu diagnostikai, nevis kā aizstājēju.^[1](#footnotes)^
:::

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

[comment]: # ({4d1deb86-976bd98e})
##### Pielāgošanas funkcijas

Noklusējuma `fit` ir *lineārā* funkcija. Taču, ja jūsu uzraudzītā sistēma ir
sarežģītāka, jums ir pieejamas citas izvēles iespējas.

|`fit`|x = f(t)|
|-----|--------|
|*lineārā*|x = a + b\*t|
|*polinomiālāN*^[2](#footnotes)^|x = a~0~ + a~1~\*t + a~2~\*t^2^ + ... + a~n~\*t^n^|
|*eksponenciālā*|x = a\*exp(b\*t)|
|*logaritmiskā*|x = a + b\*log(t)|
|*pakāpes*|x = a\*t^b^|

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

[comment]: # ({3c1c1442-add67840})
##### Režīmi

(tikai **forecast**)<br>
Katru reizi, kad tiek novērtēta trigeris funkcija, tā iegūst datus no norādītā vēstures perioda un pielāgo datiem noteiktu funkciju. Tāpēc, ja dati nedaudz atšķiras, pielāgotā funkcija arī nedaudz atšķirsies. Ja mēs vienkārši aprēķinām pielāgotās funkcijas vērtību noteiktā brīdī nākotnē, jūs neko neuzzināsiet par to, kā paredzams, ka analizētais vienums uzvedīsies starp tagadni un šo nākotnes brīdi. Dažām `fit` opcijām (piemēram, *polynomial*) vienkārša vērtība no nākotnes var būt maldinoša.

|`mode`|**forecast** rezultāts|
|------|-------------------|
|*value*|f(now + `time`)|
|*max*|max~now\ <=\ t\ <=\ now\ +\ `time`~ f(t)|
|*min*|min~now\ <=\ t\ <=\ now\ +\ `time`~ f(t)|
|*delta*|*max* - *min*|
|*avg*|f(t) vidējā vērtība (now <= t <= now + `time`) saskaņā ar [definīciju](https://en.wikipedia.org/wiki/Mean_of_a_function)|

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

[comment]: # ({3f946ebf-5ff2285e})
#### Detaļas

Lai izvairītos no aprēķiniem ar ļoti lieliem skaitļiem, mēs uzskatām, ka norādītā perioda pirmās vērtības laikspiedols plus 1 ns ir jauns nulles laiks (pašreizējais epoch laiks ir aptuveni 10^9^, epoch kvadrāts ir 10^18^, dubultprecizitāte ir aptuveni 10^-16^). 1 ns tiek pievienots, lai nodrošinātu visas pozitīvās laika vērtības *logaritmiskajām* un *pakāpes* pielāgošanām, kas ietver log(t) aprēķināšanu. Laika nobīde neietekmē *lineāro*, *polinomiālo*, *eksponenciālo* (izņemot vienkāršākus un precīzākus aprēķinus), taču maina *logaritmisko* un *pakāpes* funkciju formu.

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

[comment]: # ({d180bad2-660cda6b})
#### Iespējamās kļūdas

Funkcijas šādās situācijās atgriež -1:

-   norādītais novērtēšanas periods nesatur datus;
-   matemātiskās darbības rezultāts nav definēts^[3](#footnotes)^;
-   skaitliskas problēmas (diemžēl dažiem ievades datu kopumiem dubultprecizitātes peldošā komata formāta diapazons un precizitāte kļūst nepietiekami)^[4](#footnotes)^.

::: notetip
Netiek parādīti brīdinājumi vai kļūdas, ja izvēlētais pielāgojums slikti
raksturo sniegtos datus vai arī datu ir pārāk maz precīzai
prognozei.
:::

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

[comment]: # ({e57d3e18-06e0a230})
#### Piemēri un darbs ar kļūdām

Lai saņemtu brīdinājumu, kad jūsu hostā drīz beigsies brīvā diska vieta, varat izmantot trigeris izteiksmi, piemēram, šādu:

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

Tomēr kļūdas kods -1 var tikt ņemts vērā un pārvērst jūsu trigeris par problēmas stāvokli. Kopumā tas ir labi, jo jūs saņemat brīdinājumu, ka jūsu prognozes nedarbojas pareizi un tās vajadzētu rūpīgāk pārskatīt, lai noskaidrotu iemeslu. Taču dažkārt tas ir slikti, jo -1 var vienkārši nozīmēt, ka pēdējās stundas laikā nav iegūti dati par hosta brīvo diska vietu. Ja saņemat pārāk daudz kļūdaini pozitīvu brīdinājumu, apsveriet iespēju izmantot sarežģītāku trigeris izteiksmi ^[5](#footnotes)^:

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

Ar **forecast** situācija ir nedaudz sarežģītāka. Pirmkārt,
-1 var arī nevar pārvērst trigeris par problēmas stāvokli atkarībā no tā, vai jums ir izteiksme `forecast(/host/item,(...))<...` vai
`forecast(/host/item,(...))>...`

Turklāt -1 var būt derīga prognoze, ja vienums vērtībai ir normāli būt negatīvai. Taču šādas situācijas varbūtība reālajā pasaulē ir niecīga (skatiet
[kā](/manual/config/triggers/expression) darbojas operators **=**). Tāpēc pievienojiet `... or forecast(/host/item,(...))=-1` vai
`... and forecast(/host/item,(...))<>-1`, ja vēlaties vai nevēlaties attiecīgi uzskatīt -1 par problēmu.

#### Piezīmes

^**1**^ Piemēram, vienkāršs trigeris, piemēram,
    `timeleft(/host/item,1h,X) < 1h`, var nonākt problēmas stāvoklī, kad
    vienums vērtība tuvojas X un pēc tam pēkšņi atjaunoties, tiklīdz tiek sasniegta vērtība X. Ja
    problēma ir tā, ka vienums vērtība ir zem X, izmantojiet:
    `last(/host/item) < X or timeleft(/host/item,1h,X) < 1h` Ja
    problēma ir tā, ka vienums vērtība ir virs X, izmantojiet:
    `last(/host/item) > X or timeleft(/host/item,1h,X) < 1h`

^**2**^ Polinoma pakāpe var būt no 1 līdz 6, *polynomial1* ir ekvivalents
    *linear*. Tomēr augstākas pakāpes polinomus izmantojiet [piesardzīgi](https://en.wikipedia.org/wiki/Runge's_phenomenon). Ja
    novērtēšanas periodā ir mazāk punktu, nekā nepieciešams polinoma koeficientu noteikšanai, polinoma pakāpe
    tiks samazināta (piem., tiek pieprasīts *polynomial5*, bet ir tikai 4 punkti, tāpēc
    tiks pielāgots *polynomial3*).

^**3**^ Piemēram, *exponential* vai *power* funkciju pielāgošana ietver
    item vērtību log() aprēķināšanu. Ja datos ir nulles vai negatīvi
    skaitļi, tiks parādīta kļūda, jo log() ir definēts tikai pozitīvām vērtībām.

^**4**^ *linear*, *exponential*, *logarithmic* un *power* pielāgojumiem visi
    nepieciešamie aprēķini var tikt uzrakstīti tieši. Savukārt *polynomial*
    bez papildu soļiem var aprēķināt tikai *value*.
    *avg* aprēķināšana ietver polinoma primitīvās funkcijas aprēķināšanu
    (analītiski). *max*, *min* un *delta* aprēķināšana ietver
    polinoma atvasinājuma aprēķināšanu (analītiski) un tā sakņu atrašanu
    (skaitliski). Atrisinot f(t) = 0, tiek meklētas polinoma saknes
    (skaitliski).

^**5**^ Taču šajā gadījumā -1 var izraisīt to, ka jūsu trigeris atjaunojas no
    problēmas stāvokļa. Lai būtu pilnībā aizsargāti, izmantojiet:
    `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})
