[comment]: # ({c34725dc-f445d963})
# Predykcyjne funkcje wyzwalaczy

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

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

Czasami pojawiają się oznaki nadchodzącego problemu. Oznaki te można
wykryć, aby z wyprzedzeniem podjąć działania zapobiegające problemowi
lub przynajmniej zminimalizować jego wpływ.

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 ustawieniem wyzwalacza należy określić, czym jest stan problemowy i ile
czasu potrzeba na podjęcie działania. Następnie są dwa sposoby skonfigurowania
wyzwalacza sygnalizującego potencjalną niepożądaną sytuację. Po pierwsze:
wyzwalacz musi zostać uruchomiony, gdy oczekuje się, że system będzie
w stanie problemowym po upływie „czasu na działanie”. Po drugie: wyzwalacz musi zostać uruchomiony, gdy system
osiągnie stan problemowy w czasie krótszym niż „czas na działanie”.
Odpowiadające funkcje wyzwalacza, których należy użyć, to **forecast** oraz
**timeleft**. Należy pamiętać, że podstawowa analiza statystyczna jest zasadniczo
identyczna dla obu funkcji. Możesz skonfigurować wyzwalacz w dowolny
preferowany sposób, uzyskując podobne wyniki.

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

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

Obie funkcje używają niemal tego samego zestawu parametrów. Aby uzyskać informacje, skorzystaj z listy
[obsługiwanych funkcji](/manual/config/triggers/expression#functions).

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

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

Przede wszystkim należy określić historyczny okres, który Zabbix ma analizować, aby przygotować 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 powinien
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 ma osiągnąć,
bez względu na to, 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 chwili obecnej i znajduje się na prawo od niej, lub
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 punkt przecięcia znajduje się już w przeszłości, i
dlatego przełącza się na następne przecięcie z poziomem `threshold`, jeśli
takie istnieje. Zalecaną praktyką jest używanie prognoz jako uzupełnienia
zwykłej diagnostyki problemów, a nie jako jej zamiennika.^[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)|
|-----|--------|
|*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})
##### Tryby

(tylko **forecast**)<br>
Za każdym razem, gdy funkcja wyzwalacza jest obliczana, pobiera dane z
określonego okresu historii i dopasowuje do nich wskazaną funkcję. Tak
więc, jeśli 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ć od teraz do tego momentu w
przyszłości. Dla niektórych opcji `fit` (takich jak *polynomial*)
prosta wartość z przyszłości może być myląca.

|`mode`|wynik **forecast**|
|------|-------------------|
|*value*|f(teraz + `time`)|
|*max*|max~teraz\ <=\ t\ <=\ teraz\ +\ `time`~ f(t)|
|*min*|min~teraz\ <=\ t\ <=\ teraz\ +\ `time`~ f(t)|
|*delta*|*max* - *min*|
|*avg*|średnia z f(t) (teraz <= t <= teraz + `time`) zgodnie z [definicją](https://en.wikipedia.org/wiki/Mean_of_a_function)|

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

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

Aby uniknąć obliczeń na bardzo dużych liczbach, traktujemy znacznik czasu
pierwszej wartości w określonym okresie plus 1 ns jako nowy czas zerowy
(aktualny czas epoki jest rzędu 10^9^, kwadrat epoki to 10^18^, precyzja
podwójna wynosi około 10^-16^). 1 ns dodaje się, aby zapewnić wyłącznie dodatnie wartości czasu dla dopasowań *logarytmicznych* i *potęgowych*, które obejmują obliczanie log(t). Przesunięcie czasu nie wpływa na funkcje *liniowe*, *wielomianowe*, *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 liczb zmiennoprzecinkowych podwójnej precyzji okazują się
    niewystarczające)^[4](#footnotes)^.

::: notetip
Nie są zgłaszane żadne ostrzeżenia ani błędy, jeśli wybrane dopasowanie słabo
opisuje dostarczone dane lub jeśli danych jest po prostu zbyt mało do dokładnego
przewidywania.
:::

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

[comment]: # ({e57d3e18-06e0a230})
#### Przykłady i obsługa błędów

Aby otrzymać ostrzeżenie, gdy na host zaczyna brakować wolnego miejsca na dysku,
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ść w grę i wprowadzić wyzwalacz w stan
problemu. Ogólnie jest to dobre, ponieważ otrzymujesz ostrzeżenie, że
Twoje prognozy nie działają poprawnie i powinieneś przyjrzeć się im
dokładniej, aby ustalić przyczynę. Czasami jednak jest to niepożądane,
ponieważ -1 może po prostu oznaczać, że w ciągu ostatniej godziny nie
uzyskano danych o wolnym miejscu na dysku hosta. 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 ujemna wartość pozycji
jest czymś normalnym. Jednak prawdopodobieństwo takiej sytuacji w
rzeczywistych warunkach jest znikome (zobacz,
[jak](/manual/config/triggers/expression) działa operator **=**). Dlatego
dodaj `... or forecast(/host/item,(...))=-1` lub
`... and forecast(/host/item,(...))<>-1`, jeśli odpowiednio chcesz lub
nie chcesz traktować -1 jako problemu.

#### 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 powrócić do stanu
    OK po osiągnięciu wartości X. Jeśli problem polega na tym, że
    wartość pozycji jest poniżej X, użyj:
    `last(/host/item) < X or timeleft(/host/item,1h,X) < 1h` Jeśli
    problem polega na tym, ż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 wielomianów wyższego stopnia należy
    używać [ostrożnie](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 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, otrzymasz błąd, ponieważ log() jest
    zdefiniowany tylko dla wartości dodatnich.

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

^**5**^ Jednak w tym przypadku -1 może spowodować, że wyzwalacz wyjdzie
    ze stanu problemu. Aby zapewnić pełną ochronę, 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]: # ({/e57d3e18-06e0a230})
