[comment]: # ({f445d963-f445d963})
# 7 Funkcje wyzwalaczy predykcyjnych

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

[comment]: # ({9dac6d6d-9dac6d6d})
#### Przegląd

Czasami pojawiają się oznaki nadchodzącego problemu. Oznaki te można
dostrzec, aby można było podjąć działania z wyprzedzeniem i zapobiec problemowi lub przynajmniej
zminimalizować jego skutki.

Zabbix udostępnia narzędzia do przewidywania przyszłego zachowania monitorowanego systemu
na podstawie danych historycznych. Narzędzia te są realizowane za pomocą predykcyjnych funkcji
wyzwalacza.

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

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

Przed skonfigurowaniem wyzwalacza konieczne jest zdefiniowanie, czym jest stan problemowy i ile czasu potrzeba na podjęcie działania. Następnie istnieją dwa sposoby skonfigurowania wyzwalacza sygnalizującego potencjalnie niepożądaną sytuację. Po pierwsze: wyzwalacz musi się uruchomić, gdy oczekuje się, że system będzie w stanie problemowym po upływie "time to act". Po drugie: wyzwalacz musi się uruchomić, gdy system ma osiągnąć stan problemowy za mniej niż "time to act". Odpowiednie funkcje wyzwalacza do użycia to **forecast** i **timeleft**. Należy zauważyć, że podstawowa analiza statystyczna jest w zasadzie identyczna dla obu funkcji. Możesz skonfigurować wyzwalacz w dowolny preferowany sposób, uzyskując podobne rezultaty.

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

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

Obie funkcje używają niemal tego samego zestawu parametrów. Skorzystaj z listy
[obsługiwanych funkcji](/manual/appendix/functions) jako odniesienia.

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

[comment]: # ({33e199b9-a93b071e})
##### Przedział czasu

Przede wszystkim należy określić historyczny okres, który Zabbix ma
analizować, aby wygenerować prognozę. Robi się to w znany sposób za
pomocą parametru `time period` oraz opcjonalnego przesunięcia czasu,
tak jak w przypadku funkcji **avg**, **count**, **delta**, **max**, **min**
i **sum**.

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

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

(tylko **forecast**)<br>
Parametr `time` określa, jak daleko w przyszłość Zabbix ma
ekstrapolować zależności znalezione w danych historycznych. Niezależnie od tego, czy używasz
`time_shift`, czy nie, `time` jest zawsze liczony od bieżącego momentu.

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

[comment]: # ({1ccaacd1-625c0c85})
##### Próg do osiągnięcia

(tylko **timeleft**)<br>
Parametr `threshold` określa wartość, którą analizowana pozycja musi osiągnąć,
nie ma znaczenia, czy od góry, czy od dołu. Gdy wyznaczymy f(t)
(patrz poniżej), należy rozwiązać równanie f(t) = `threshold` i zwrócić
pierwiastek, który jest bliżej bieżącego momentu i znajduje się na prawo od niego, albo
1.7976931348623158E+308, jeśli taki pierwiastek nie istnieje.

::: notetip
Gdy wartości pozycji zbliżają się do progu, a następnie go przekraczają,
**timeleft** zakłada, że przecięcie już nastąpiło w przeszłości, i
w związku z tym przełącza się na następne przecięcie z poziomem `threshold`, jeśli
istnieje. Najlepszą praktyką jest używanie prognoz jako uzupełnienia
zwykłej diagnostyki problemów, a nie jako jej zastępstwa.^[1](#footnotes)^
:::

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

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

Domyślną funkcją `fit` jest funkcja *liniowa*. Jeśli jednak monitorowany system jest bardziej złożony, masz do wyboru więcej opcji.

|`fit`|x = f(t)|
|-----|--------|
|*liniowa*|x = a + b\*t|
|*wielomianowaN*^[2](#footnotes)^|x = a~0~ + a~1~\*t + a~2~\*t^2^ + ... + a~n~\*t^n^|
|*wykładnicza*|x = a\*exp(b\*t)|
|*logarytmiczna*|x = a + b\*log(t)|
|*potęgowa*|x = a\*t^b^|

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

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

(**tylko** **forecast**)<br>
Za każdym razem, gdy funkcja wyzwalacza jest oceniana, pobiera dane z
określonego okresu historii i dopasowuje do nich określoną funkcję. Jeśli
więc dane są nieco inne, dopasowana funkcja również będzie nieco inna.
Jeśli po prostu obliczymy wartość dopasowanej funkcji w określonym
momencie w przyszłości, nie będziesz wiedzieć nic o tym, jak
analizowana pozycja ma się zachowywać między teraz a tym momentem w
przyszłości. W przypadku niektórych opcji `fit` (na przykład *polynomial*)
prosta wartość z przyszłości może być myląca.

|`mode`|wynik **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*|średnia f(t) (now <= t <= now + `time`) zgodnie z [definicją](https://en.wikipedia.org/wiki/Mean_of_a_function)|

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

[comment]: # ({3f946ebf-5ff2285e})
#### Szczegóły

Aby uniknąć obliczeń z ogromnymi liczbami, przyjmujemy znacznik czasu
pierwszej wartości w określonym okresie plus 1 ns jako nowy czas zerowy
(bieżący czas epoki ma rząd 10^9^, kwadrat epoki to 10^18^, a precyzja
podwójna wynosi około 10^-16^). Dodanie 1 ns ma na celu zapewnienie
wszystkich dodatnich wartości czasu dla dopasowań *logarytmicznych* i
*potęgowych*, które obejmują obliczanie log(t). Przesunięcie czasu nie
wpływa na dopasowania *liniowe*, *wielomianowe* ani *wykładnicze*
(poza łatwiejszymi i dokładniejszymi obliczeniami), ale zmienia kształt
funkcji *logarytmicznych* i *potęgowych*.

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

[comment]: # ({d180bad2-660cda6b})
#### Potencjalne błędy

Funkcje zwracają -1 w następujących sytuacjach:

-   określony okres oceny nie zawiera danych;
-   wynik operacji matematycznej nie jest zdefiniowany^[3](#footnotes)^;
-   komplikacje numeryczne (niestety, dla niektórych zestawów danych wejściowych zakres i precyzja formatu zmiennoprzecinkowego podwójnej precyzji stają się niewystarczające)^[4](#footnotes)^.

::: notetip
Nie są zgłaszane żadne ostrzeżenia ani błędy, jeśli wybrany dopasowany model słabo
opisuje dostarczone dane lub danych jest po prostu zbyt mało, aby uzyskać dokładną
prognozę.
:::

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

[comment]: # ({f5dc222d-06e0a230})
#### Przykłady i radzenie sobie z błędami

Aby otrzymać ostrzeżenie, gdy zbliża się wyczerpanie wolnego miejsca na dysku na
twoim hoście, możesz użyć wyrażenia wyzwalacza takiego jak to:

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

Jednak kod błędu -1 może wejść do gry i wprowadzić twój wyzwalacz w
stan problemu. Zasadniczo jest to dobre, ponieważ otrzymujesz ostrzeżenie, że
twoje prognozy nie działają poprawnie i powinieneś przyjrzeć się im
dokładniej, aby ustalić dlaczego. Ale czasami jest to złe, ponieważ -1 może po prostu
oznaczać, że w ostatniej godzinie nie uzyskano żadnych danych o wolnym miejscu na dysku
na hoście. Jeśli otrzymujesz zbyt wiele fałszywie dodatnich alertów,
rozważ użycie bardziej złożonego wyrażenia wyzwalacza ^[5](#footnotes)^:

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

Sytuacja jest nieco trudniejsza w przypadku **forecast**. Przede wszystkim,
-1 może, ale nie musi, wprowadzić wyzwalacz w stan problemu, w zależności od tego,
czy masz wyrażenie takie jak `forecast(/host/item,(...))<...` czy
takie jak `forecast(/host/item,(...))>...`

Ponadto, -1 może być prawidłową prognozą, jeśli normalne jest, że wartość
pozycji jest ujemna. Jednak prawdopodobieństwo takiej sytuacji w rzeczywistych
warunkach jest znikome (zobacz, jak działa operator **=** [how](/manual/config/triggers/expression)). Dlatego dodaj
`... or forecast(/host/item,(...))=-1` albo
`... and forecast(/host/item,(...))<>-1`, jeśli chcesz lub nie chcesz
odpowiednio traktować -1 jako problem.

#### Przypisy

^**1**^ Na przykład prosty wyzwalacz taki jak
    `timeleft(/host/item,1h,X) < 1h` może przejść w stan problemu, gdy
    wartość pozycji zbliża się do X, a następnie nagle odzyskać stan poprawny, gdy
    zostanie osiągnięta wartość X. Jeśli problemem jest to, że wartość pozycji jest poniżej X, użyj:
    `last(/host/item) < X or timeleft(/host/item,1h,X) < 1h` Jeśli
    problemem jest to, że wartość pozycji jest powyżej X, użyj:
    `last(/host/item) > X or timeleft(/host/item,1h,X) < 1h`

^**2**^ Stopień wielomianu może wynosić od 1 do 6, *polynomial1* jest równoważny
    *linear*. Jednak używaj wielomianów wyższego stopnia [z
    ostrożnością](https://en.wikipedia.org/wiki/Runge's_phenomenon). Jeśli okres oceny zawiera mniej punktów niż potrzeba do wyznaczenia
    współczynników wielomianu, stopień wielomianu zostanie obniżony (np.
    żądany jest *polynomial5*, ale dostępne są tylko 4 punkty, dlatego
    zostanie dopasowany *polynomial3*).

^**3**^ Na przykład dopasowanie funkcji *exponential* lub *power* obejmuje
    obliczanie log() wartości pozycji. Jeśli dane zawierają zera lub liczby ujemne,
    pojawi się błąd, ponieważ log() jest zdefiniowane tylko dla wartości dodatnich.

^**4**^ Dla dopasowań *linear*, *exponential*, *logarithmic* i *power* wszystkie
    niezbędne obliczenia można zapisać jawnie. Dla *polynomial* tylko *value*
    można obliczyć bez dodatkowych kroków. Obliczanie *avg* obejmuje wyznaczenie
    całki nieoznaczonej wielomianu (analitycznie). Obliczanie *max*, *min* i *delta* obejmuje
    wyznaczenie pochodnej wielomianu (analitycznie) i znalezienie jej miejsc zerowych
    (numerycznie). Rozwiązanie f(t) = 0 polega na znalezieniu miejsc zerowych wielomianu
    (numerycznie).

^**5**^ Jednak w tym przypadku -1 może spowodować, że twój wyzwalacz powróci
    ze stanu problemu. Aby być w pełni zabezpieczonym, użyj:
    `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})
