[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 z wyprzedzeniem, aby można było podjąć działania wcześniej i zapobiec problemowi lub przynajmniej
zminimalizować jego skutki.

Zabbix oferuje 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 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 zadziałać, gdy oczekuje się, że system będzie w stanie problemowym po upływie „czasu na działanie”. Po drugie: wyzwalacz musi zadziałać, gdy system ma osiągnąć stan problemowy za mniej niż „czas na działanie”. Odpowiednimi funkcjami wyzwalacza do użycia są **forecast** i **timeleft**. Należy zauważyć, że podstawowa analiza statystyczna jest w obu przypadkach zasadniczo identyczna. 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ąć,
niezależnie od tego, czy od góry, czy od dołu. Gdy już 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, 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 jest już w przeszłości, i dlatego 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)|
|-----|--------|
|*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 dla **forecast**)<br>
Za każdym razem, gdy funkcja wyzwalacza jest oceniana, pobiera dane z
określonego okresu historii i dopasowuje do tych danych 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 dla określonego momentu 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*) zwykła 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, za nowy punkt zerowy czasu przyjmujemy znacznik czasu pierwszej wartości w określonym okresie powiększony o 1 ns (bieżący czas epoki ma rząd 10^9^, kwadrat czasu 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 żadnych 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 wybrana funkcja dopasowania
słabo opisuje dostarczone dane lub jeśli danych jest po prostu zbyt mało, aby
uzyskać dokładną prognozę.
:::

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

[comment]: # ({e57d3e18-06e0a230})
#### Przykłady i postępowanie z błędami

Aby otrzymać ostrzeżenie, gdy na Twoim 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 spowodować, że Twój wyzwalacz przejdzie 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ć dlaczego. Czasami jednak jest to złe, ponieważ -1 może po prostu oznaczać, że w ciągu ostatniej godziny nie uzyskano żadnych danych o wolnym miejscu na dysku host. 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, spowodować przejście wyzwalacza w stan problemu, zależnie 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 **=**). Jeśli więc chcesz traktować -1 jako problem lub nie chcesz tego robić, dodaj odpowiednio `... or forecast(/host/item,(...))=-1` albo `... and forecast(/host/item,(...))<>-1`.

#### 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 wrócić do normalnego stanu, gdy wartość X zostanie osiągnięta. 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 wyższych stopni wielomianów [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. wymagany jest *polynomial5*, ale dostępne są tylko 4 punkty, więc zostanie dopasowany *polynomial3*).

^**3**^ Na przykład dopasowywanie funkcji *exponential* lub *power* obejmuje obliczanie log() wartości pozycji. Jeśli dane zawierają zera lub liczby ujemne, wystąpi 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* bez dodatkowych kroków można obliczyć tylko *value*. Obliczanie *avg* obejmuje wyznaczenie antypochodnej 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 wróci ze stanu problemu do normalnego. 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]: # ({/e57d3e18-06e0a230})
