[comment]: # translation:outdated

[comment]: # ({f445d963-f445d963})
# 7 Предиктивне функције окидача

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

[comment]: # ({9dac6d6d-9dac6d6d})
#### Преглед

Понекад постоје знаци предстојећег проблема. Ови знаци могу бити
уочено тако да се унапред могу предузети радње за спречавање или бар
минимизирајте утицај проблема.

Zabbix има алате за предвиђање будућег понашања надгледаног система
на основу историјских података. Ови алати се реализују кроз предиктивне
функције окидача.

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

[comment]: # ({827f1d5f-24b155a7})
#### Функције

Пре подешавања окидача, потребно је дефинисати шта је проблемско стање и колико
времена је потребно за предузимање акције. Затим, постоје два начина за подешавање
окидача који сигнализира о потенцијалној нежељеној ситуацији. Прво: окидач
мора да се активира када се очекује да ће систем бити
у проблемском стању након "времена за акцију". Друго: окидач мора да се активира када систем
ће достићи проблемско стање за мање од "времена за акцију".
Одговарајуће функције окидача које треба користити су **прогноза** и
**преостало време**. Имајте на уму да је основна статистичка анализа у основи
идентична за обе функције. Можете подесити окидач на било који начин који
желите са сличним резултатима.

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

[comment]: # ({cbcb40b7-c80922f6})
#### Параметри

Обе функције користе скоро исти скуп параметара. Користите листу
[подржаних функција](/manual/appendix/functions) за референцу.

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

[comment]: # ({33e199b9-a93b071e})
##### Временски интервал

Прво, требало би да наведете историјски период који Zabbix треба да анализира да би дошао до предвиђања. То радите на познат начин помоћу параметра `time period` и опционог временског померања као што то радите
са функцијама **avg**, **count**, **delta**, **max**, **min** и **sum**.

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

[comment]: # ({cf6b2333-b922d0f2})
##### Хоризонт прогнозирања

(само **прогноза**)\
Параметар `time` одређује колико далеко у будућности Zabbix треба да
екстраполира зависности које пронађе у историјским подацима. Без обзира да ли користите
`time_shift` или не, `time` се увек рачуна почев од тренутног
тренутка.

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

[comment]: # ({aaed555b-625c0c85})
##### Праг који треба достићи

(само **timeleft**)\
Параметар `threshold` одређује вредност коју анализирана ставка мора да достигне,
без разлике да ли је одозго или одоздо. Када одредимо f(t)
(видети доле), требало би да решимо једначину f(t) = `threshold` и вратимо
корен који је ближи садашњем тренутку и десно од садашњег тренутка или
1.7976931348623158E+308 ако такав корен не постоји.

::: notetip
Када се вредности ставки приближе прагу, а затим га пређу, **timeleft** претпоставља да је пресек већ у прошлости и
стога прелази на следећи пресек са нивоом `threshold`, ако
га има. Најбоља пракса би требало да буде коришћење предвиђања као допуна
обичној дијагностици проблема, а не као замена.^[1](#footnotes)^
:::

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

[comment]: # ({4d1deb86-976bd98e})
##### Функције за подешавање

Подразумевана функција `подешавање` је *линеарна* функција. Али ако је ваш праћени систем
компликованији, имате више опција за избор.

|`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]: # ({b75f1e85-add67840})
##### Режими

(само **прогноза**)\
Сваки пут када се окидачка функција израчунава, она добија податке из
одређеног периода историје и прилагођава одређену функцију подацима. Дакле,
ако су подаци мало другачији, прилагођавање функције ће бити мало
другачије. Ако једноставно израчунамо вредност прилагођавања функције у
одређеном тренутку у будућности, нећете знати ништа о томе како се очекује да ће се
анализирана ставка понашати између садашњег тренутка и тог тренутка у
будућности. За неке опције `прилагођавања` (као што је *полином*) једноставна вредност из
будућности може бити обмањујућа.

|`mode`|**forecast** result|
|------|--------------------|
|*value*|f(now + `time`)|
|*max*|max~now\ <=\ t\ <=\ now\ +\ `time`~ f(t)|
|*min*|min~now\ <=\ t\ <=\ now\ +\ `time`~ f(t)|
|*delta*|*max* - *min*|
|*avg*|average of f(t) (now <= t <= now + `time`) according to [definition](https://en.wikipedia.org/wiki/Mean_of_a_function)|

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

[comment]: # ({3f946ebf-5ff2285e})
#### Детаљи

Да бисмо избегли прорачуне са огромним бројевима, временску ознаку
прве вредности у наведеном периоду плус 1 нс сматрамо новим нултим временом (тренутно
време епохе је реда величине 10^9^, квадрат епохе је 10^18^, двострука прецизност
је око 10^-16^). Додаје се 1 ns да би се обезбедиле све позитивне временске вредности за
*логаритамска* и *степена* подешавања која укључују израчунавање log(t). Временски
помак не утиче на *линеарне*, *полиномске*, *експоненцијалне* (осим
лакших и прецизнијих прорачуна), али мења облик
*логаритамских* и *степених* функција.

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

[comment]: # ({d180bad2-660cda6b})
#### Потенцијалне грешке

Функције враћају -1 у таквим ситуацијама:

-  наведени период евалуације не садржи податке;
-  резултат математичке операције није дефинисан^[3](#фусноте)^;
-  нумеричке компликације (нажалост, за неке скупове улазних података опсег и прецизност формата двоструке прецизности са покретним зарезом постају недовољни)^[4](#фусноте)^.

::: notetip
Нема упозорења или грешака ако изабрани подаци лоше одговарају
описују дате податке или једноставно има премало података за тачно
предвиђање.
:::

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

[comment]: # ({e57d3e18-06e0a230})
#### Примери и поступање са грешкама

Да бисте добили упозорење када вам понестане слободног простора на диску на
вашем домаћина, можете користити израз за окидање попут овог:

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

Међутим, код грешке -1 може се активирати и довести ваш окидач у
проблемно стање. Генерално, то је добро јер добијате упозорење да ваша
предвиђања не функционишу исправно и да би требало да их детаљније погледате
да бисте сазнали зашто. Али понекад је лоше јер -1 може једноставно
значити да није било података о слободном простору на диску хоста добијених у
последњем сату. Ако добијате превише лажно позитивних упозорења,
размислите о коришћењу компликованијег израза за окидање ^[5](#фусноте)^:

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

Ситуација је мало тежа са **forecast**. Пре свега,
-1 може, али и не мора довести окидач у проблематично стање у зависности од тога
да ли имате израз попут `forecast(/host/item,(...))<...` или
као `forecast(/host/item,(...))>...`

Штавише, -1 може бити валидна прогноза ако је нормално да вредност ставке
буде негативна. Али вероватноћа ове ситуације у стварном
свету је занемарљива (погледајте
[како](/manual/config/triggers/expression) ради оператор **=**). Дакле,
додајте `... или forecast(/host/item,(...))=-1` или
`... и forecast(/host/item,(...))<>-1` ако желите или не желите да
третирате -1 као проблем, респективно.

#### Фусноте

^**1**^ На пример, једноставан окидач као што је
`timeleft(/host/item,1h,X) < 1h` може прећи у стање проблема када се вредност ставке приближи X, а затим се изненада опорави када се вредност X достигне. Ако је проблем вредност ставке испод X, користите:
`last(/host/item) < X или timeleft(/host/item,1h,X) < 1h` Ако је проблем вредност ставке изнад X, користите:
`last(/host/item) > X или timeleft(/host/item,1h,X) < 1h`

^**2**^ Степен полинома може бити од 1 до 6, *полином1* је еквивалентан *линеарном*. Међутим, користите полиноме вишег степена [уз опрез](https://en.wikipedia.org/wiki/Runge's_phenomenon). Ако период евалуације садржи мање тачака него што је потребно за одређивање коефицијената полинома, степен полинома ће бити смањен (нпр.,
захтева се *полином5*, али постоје само 4 тачке, стога ће бити прилагођен *полином3*).

^**3**^ На пример, уклапање *експоненцијалних* или *степених* функција укључује
израчунавање log() вредности елемената. Ако подаци садрже нуле или негативне бројеве, добићете грешку јер је log() дефинисан само за позитивне вредности.

^**4**^ За *линеарне*, *експоненцијалне*, *логаритамске* и *степене* функције које уклапају све потребни прорачуни могу се експлицитно написати. За *полином*
само *вредност* може бити израчуната без икаквих додатних корака.
Израчунавање *просека* укључује израчунавање полиномског антидеривата (аналитички). Израчунавање *макса*, *мин* и *делта* укључује израчунавање полиномског извода (аналитички) и проналажење његових корена (нумерички). Решавање f(t) = 0 укључује проналажење полиномских корена (нумерички).

^**5**^ Али у овом случају -1 може проузроковати да се ваш окидач опорави од стања проблема. За потпуну заштиту користите:
`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})
