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

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

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

Dažreiz ir pazīmes, kas liecina par gaidāmu problēmu. Šīs pazīmes var
pamanīt, lai jau iepriekš varētu veikt darbības, kas novērstu problēmu
vai vismaz samazinātu tās ietekmi.

Zabbix piedāvā rīkus, lai prognozētu 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 trigeris iestatīšanas ir nepieciešams noteikt, kas ir problēmas stāvoklis un cik
daudz laika ir nepieciešams, lai rīkotos. Pēc tam ir divi veidi, kā iestatīt
trigeris, kas signalizē par iespējamu nevēlamu situāciju. Pirmais: 
trigeris jānostrādā, kad ir sagaidāms, ka sistēma
nonāks problēmas stāvoklī pēc "laika rīcībai". Otrais: trigeris jānostrādā, kad sistēma
sasniegs problēmas stāvokli mazāk nekā "laikā rīcībai".
Atbilstošās trigeris funkcijas, ko izmantot, ir **forecast** un
**timeleft**. Ņemiet vērā, ka pamatā esošā statistiskā analīze abām
funkcijām būtībā ir identiska. Jūs varat iestatīt trigeris jebkurā no šiem veidiem
pēc savas izvēles, iegūstot līdzīgus rezultātus.

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

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

Abas funkcijas izmanto gandrīz vienu un to pašu parametru kopu. Atsaucei izmantojiet
[atbalstīto funkciju](/manual/config/triggers/expression#functions) sarakstu.

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

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

Vispirms jums jānorāda vēsturiskais periods, kuru Zabbix vajadzētu
analizēt, lai izveidotu prognozi. To var izdarīt ierastajā veidā,
izmantojot parametru `time period` un neobligātu 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 ne, `time` vienmēr tiek skaitīts, sākot no pašreizējā
brīža.

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

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

(tikai **timeleft**)<br>
Parametrs `threshold` norāda vērtību, kuru analizētajam vienumam jāsasniedz,
neatkarīgi no tā, vai no augšas vai no apakšas. Kad ir noteikta f(t)
(skatiet zemāk), jāatrisina vienādojums f(t) = `threshold` un jāatgriež
sakne, kas ir tuvāk pašreizējam brīdim un atrodas pa labi no tā, 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 šis krustpunkts jau ir pagātnē, un
tāpēc pārslēdzas uz nākamo krustpunktu ar `threshold` līmeni, ja
tāds ir. Ieteicamā prakse ir izmantot prognozes kā papildinājumu
parastajai problēmu diagnostikai, nevis kā tās aizstājēju.^[1](#footnotes)^
:::

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

[comment]: # ({4d1deb86-976bd98e})
##### Aproksimācijas funkcijas

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

|`fit`|x = f(t)|
|-----|--------|
|*linear*|x = a + b\*t|
|*polynomialN*^[2](#footnotes)^|x = a~0~ + a~1~\*t + a~2~\*t^2^ + ... + a~n~\*t^n^|
|*exponential*|x = a\*exp(b\*t)|
|*logarithmic*|x = a + b\*log(t)|
|*power*|x = a\*t^b^|

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

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

(tikai **forecast**)<br>
Katru reizi, kad tiek novērtēta trigera funkcija, tā iegūst datus no
norādītā vēstures perioda un pielāgo datiem norādīto funkciju. Tādēļ,
ja dati nedaudz atšķiras, arī pielāgotā funkcija 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ā analizētais vienums, visticamāk,
uzvedīsies laika posmā no šī brīža līdz šim nākotnes brīdim. Dažām `fit`
opcijām (piemēram, *polynomial*) vienkārša vērtība nākotnē 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})
#### Detalizēta informācija

Lai izvairītos no aprēķiniem ar ļoti lieliem skaitļiem, mēs uzskatām pirmās
vērtības laikspiedolu norādītajā periodā plus 1 ns par jaunu nulles laiku (pašreizējais
epoch laiks ir 10^9^ kārtā, epoch kvadrāts ir 10^18^, dubultā precizitāte
ir aptuveni 10^-16^). 1 ns tiek pievienota, lai nodrošinātu visas pozitīvās laika vērtības
*logaritmiskajām* un *pakāpes* aproksimācijām, kurās tiek aprēķināts log(t). Laika
nobīde neietekmē *lineārās*, *polinomiālās*, *eksponenciālās* aproksimācijas (izņemot
to, ka aprēķini kļūst vienkāršāki un precīzāki), bet maina
*logaritmisko* un *pakāpes* funkciju formu.

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

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

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

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

::: notetip
Brīdinājumi vai kļūdas netiek norādītas, ja izvēlētā aproksimācija vāji
apraksta sniegtos datus vai arī precīzai prognozēšanai datu ir vienkārši
pārāk maz.
:::

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

[comment]: # ({e57d3e18-06e0a230})
#### Piemēri un kļūdu apstrāde

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

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

Tomēr kļūdas kods -1 var ietekmēt rezultātu un pārslēgt jūsu trigeri
problēmas stāvoklī. Kopumā tas ir labi, jo saņemat brīdinājumu, ka jūsu
prognozes nedarbojas korekti un tās vajadzētu rūpīgāk pārbaudīt, lai
noskaidrotu iemeslu. Taču dažreiz tas ir slikti, jo -1 var vienkārši
nozīmēt, ka pēdējās stundas laikā netika 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 trigera izteiksmi ^[5](#footnotes)^:

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

Situācija ir nedaudz sarežģītāka ar **forecast**. Pirmkārt,
-1 var vai nevar pārslēgt trigeri problēmas stāvoklī atkarībā no tā,
vai jums ir izteiksme, piemēram, `forecast(/host/item,(...))<...`, vai
izteiksme, piemēram, `forecast(/host/item,(...))>...`

Turklāt -1 var būt derīga prognoze, ja vienuma vērtībai ir normāli būt
negatīvai. Taču šādas situācijas iespējamī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 pāriet problēmas stāvoklī, kad
    vienuma 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āda, ka vienuma vērtība ir
    zemāka par 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 augstāka par 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 periods satur 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
    vienuma vērtību log() aprēķināšanu. Ja dati satur nulles vai
    negatīvus skaitļus, 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. *polynomial*
    gadījumā bez papildu darbībām var aprēķināt tikai *value*.
    *avg* aprēķināšana ietver polinoma pirmatvasinājuma
    (analītisku) aprēķināšanu. *max*, *min* un *delta* aprēķināšana
    ietver polinoma atvasinājuma (analītisku) aprēķināšanu un tā sakņu
    atrašanu (skaitliski). f(t) = 0 atrisināšana ietver polinoma sakņu
    atrašanu (skaitliski).

^**5**^ Taču šajā gadījumā -1 var izraisīt jūsu trigera atjaunošanos no
    problēmas stāvokļa. Lai būtu pilnībā aizsargāts, 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})
