[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 uzvedī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 trigera iestatīšanas ir nepieciešams definēt, kas ir problēmas stāvoklis un cik daudz laika ir nepieciešams, lai veiktu darbības. 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 tiek sagaidīts, ka sistēma pēc "time to act" būs problēmas stāvoklī. Otrais: trigerim jāaktivizējas, kad sistēma nonāks problēmas stāvoklī mazāk nekā "time to act" laikā. Atbilstošās izmantojamās trigeru funkcijas 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ā sev vēlamā veidā, un rezultāti būs līdzīgi.

[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
`time period` parametru un izvēles laika nobīdi, tāpat kā to darāt ar
**avg**, **count**, **delta**, **max**, **min** un **sum**
funkcijām.

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

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

(tikai **prognoze**)<br>
Parametrs `time` nosaka, 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, kuru analizētajam vienumam ir jāsasniedz,
nav nozīmes, vai no augšas vai no apakšas. Kad esam noteikuši f(t)
(skatīt tālāk), mums jāatrisina vienādojums f(t) = `threshold` un jāatgriež
sakne, kas ir tuvāk tagadnei un atrodas 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āriet 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 norādīto funkciju. Tāpēc, ja dati nedaudz atšķiras, pielāgotā funkcija arī būs nedaudz atšķirīga. Ja mēs vienkārši aprēķinām pielāgotās funkcijas vērtību noteiktā laikā nākotnē, jūs neko neuzzināsiet par to, kā analizētais vienums tiek prognozēts uzvesties 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 norādītā perioda pirmās vērtības laika zīmogu plus 1 ns par jaunu nulles laiku (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 visus pozitīvos laika vērtību *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) pielāgojumus, 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 komplikācijas (diemžēl dažiem ievaddatu kopumiem dubultprecizitātes peldošā komata formāta diapazons un precizitāte kļūst nepietiekami)^[4](#footnotes)^.

::: notetip
Brīdinājumi vai kļūdas netiek atzīmēti, 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]: # ({f5dc222d-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 trigeri ar šādu izteiksmi:

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

Tomēr var tikt ņemts vērā kļūdas kods -1, un tas var novest jūsu trigeri
uz 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ļūdainu pozitīvu brīdinājumu, apsveriet
iespēju izmantot sarežģītāku trigeru izteiksmi ^[5](#footnotes)^:

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

Situācija ar **forecast** ir nedaudz sarežģītāka. Pirmkārt,
-1 var vai nu var arī nevar novest trigeri uz 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 ir normāli, ka vienuma vērtība ir
negatīva. 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 attiecīgi vēlaties vai
nevēlaties 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
    vienuma vērtība tuvojas X un pēc tam pēkšņi atjaunoties, tiklīdz X
    tiek sasniegta. Ja problēma ir tāda, ka vienuma vērtība ir zem X,
    izmantojiet:
    `last(/host/item) < X or timeleft(/host/item,1h,X) < 1h` Ja
    problēma ir tāda, ka vienuma 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ēram,
    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
    log() aprēķināšanu no vienumu vērtībām. Ja datos ir nulles vai
    negatīvi skaitļi, tiks saņemta kļūda, jo log() ir definēts tikai
    pozitīvām vērtībām.

^**4**^ *linear*, *exponential*, *logarithmic* un *power* pielāgojumiem
    visus nepieciešamos aprēķinus var uzrakstīt tieši. Savukārt
    *polynomial* gadījumā 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]: # ({/f5dc222d-06e0a230})
