[comment]: # ({731aa9c5-510ac9cc})
# 3 Wyrażenie wyzwalacza

[comment]: # ({/731aa9c5-510ac9cc})

[comment]: # ({3a919b3c-473bcd5e})
#### Przegląd

Ta strona opisuje składnię wyrażeń wyzwalaczy oraz szczegóły ich obliczania.

Składnia prostego wyrażenia jest następująca:

**`function`**(`/host/item`,`time_period`)<**`operator`**><**`constant`**>

W tym wyrażeniu pierwszy operand (po lewej stronie operatora) to [funkcja](#functions) z jej [parametrami](#function-parameters) w nawiasach (zwykle pozycja danych i okres czasu). 

Funkcja służy do analizowania odebranych danych w ustawionym okresie czasu, czego wynikiem jest obliczona wartość.

Ta wartość jest następnie porównywana z drugim operandem przy użyciu [operatora](#operators). W tym przykładzie drugi operand jest stałą, ale może to być również inna funkcja. 

Na przykład:

```
min(/Zabbix server/net.if.in[eth0,bytes],5m)>100K
```

Ten wyzwalacz uruchamia się, jeśli liczba odebranych bajtów na `eth0` w ciągu ostatnich pięciu minut była cały czas większa niż 100 kilobajtów. W takim przypadku wyrażenie ma wartość prawda i tworzony jest problem.

Wyrażenia wyzwalaczy są niezwykle elastyczne. W bardziej złożonych wyrażeniach można łączyć wiele funkcji, operatorów i stałych.

Zobacz także:

-   [Przykłady wyzwalaczy](/manual/config/triggers/trigger_examples)
-   [Wykrywanie problemów za pomocą wyzwalaczy](/manual/config/triggers) (ogólne wprowadzenie)

[comment]: # ({/3a919b3c-473bcd5e})

[comment]: # ({856cad55-d4e5ef03})
#### Funkcje

Funkcje umożliwiają analizę zebranych wartości, na przykład obliczenie średniej lub znalezienie określonego ciągu znaków.

Kliknij odpowiednią grupę funkcji, aby zobaczyć więcej szczegółów.

|Grupa funkcji|<|Funkcje|
|-|----------|----------------------------------------|
|[Funkcje agregujące](/manual/config/triggers/expression/aggregate/)|<|avg, bucket\_percentile, count, histogram\_quantile, item\_count, kurtosis, mad, max, min, skewness, stddevpop, stddevsamp, sum, sumofsquares, varpop, varsamp|
| |[Funkcje foreach](/manual/config/triggers/expression/aggregate/foreach)|avg\_foreach, bucket\_rate\_foreach, count\_foreach, exists\_foreach, last\_foreach, max\_foreach, min\_foreach, sum\_foreach|
|[Funkcje bitowe](/manual/config/triggers/expression/bitwise)|<|bitand, bitlshift, bitnot, bitor, bitrshift, bitxor|
|[Funkcje daty i czasu](/manual/config/triggers/expression/time)|<|date, dayofmonth, dayofweek, now, time|
|[Funkcje historii](/manual/config/triggers/expression/history)|<|change, changecount, count, countunique, find, first, firstclock, fuzzytime, last, lastclock, logeventid, logseverity, logsource, logtimestamp, monodec, monoinc, nodata, percentile, rate|
|[Funkcje trendów](/manual/config/triggers/expression/trends)|<|baselinedev, baselinewma, trendavg, trendcount, trendmax, trendmin, trendstl, trendsum|
|[Funkcje matematyczne](/manual/config/triggers/expression/math)|<|abs, acos, asin, atan, atan2, avg, cbrt, ceil, cos, cosh, cot, degrees, e, exp, expm1, floor, log, log10, max, min, mod, pi, power, radians, rand, round, signum, sin, sinh, sqrt, sum, tan, truncate|
|[Funkcje operatorów](/manual/config/triggers/expression/operator)|<|between, in|
|[Funkcje predykcyjne](/manual/config/triggers/expression/predictive)|<|forecast, timeleft|
|[Funkcje tekstowe](/manual/config/triggers/expression/string)|<|ascii, bitlength, bytelength, char, concat, insert, jsonpath, left, length, ltrim, mid, repeat, replace, right, rtrim, trim, xmlxpath|

O ile nie zaznaczono inaczej, te funkcje są obsługiwane w:

-   [Wyrażeniach wyzwalaczy](/manual/config/triggers/expression)
-   [Pozycjach obliczanych](/manual/config/items/itemtypes/calculated)
-   [Makrach wyrażeń](/manual/config/macros/expression_macros)

Funkcje foreach są obsługiwane tylko dla [obliczeń agregujących](/manual/config/items/itemtypes/calculated/aggregate).

Zazwyczaj funkcje zwracają wartości liczbowe do porównania.
W przypadku zwracania ciągów znaków porównanie jest możliwe za pomocą operatorów **=** i **<>** (zobacz przykład [Wykrywanie niezgodnego oprogramowania na różnych hostach](/manual/config/triggers/trigger_examples#detect-non-matching-software-on-different-hosts)).

[comment]: # ({/856cad55-d4e5ef03})

[comment]: # ({f1c0b59d-b255de16})
#### Parametry funkcji

Parametry funkcji pozwalają określić:

-   klucz pozycji (jako `/host/key`) dla funkcji odwołujących się do historii pozycji hosta
-   okres czasu (oraz inne parametry specyficzne dla funkcji)
-   [inne wyrażenia](#other-expressions)

[comment]: # ({/f1c0b59d-b255de16})

[comment]: # ({c59d025d-7ea76dfe})
##### Klucz pozycji

Pozycja, do której następuje odwołanie, musi być w obsługiwanym stanie (z wyjątkiem funkcji **nodata()**, która jest obliczana również dla nieobsługiwanych pozycji).

Pominięcie nazwy hosta w pierwszym parametrze (tj. jak w `function(//key,parameter,...)`) jest obsługiwane tylko w określonych kontekstach:

-   W formule pozycji obliczanych
-   W makrach wyrażeń, które mogą być używane w:
    -   polu [*Nazwa zdarzenia*](/manual/config/triggers/trigger#configuration)
    -   nazwie wykresu
    -   etykiecie elementów mapy „Host” i „Trigger” [map elements](/manual/config/visualization/maps/map#adding-elements)

W tych kontekstach można również użyć makra [`{HOST.HOST}`](/manual/appendix/macros/supported_by_location#hosthost).
Makro `{HOST.HOST<1-9>}` może być użyte w przypadku pola *Nazwa zdarzenia* oraz elementu mapy „Trigger”, aby odwołać się do określonej pozycji w wyrażeniu wyzwalacza.
Gdy nazwa hosta jest pominięta lub zastąpiona przez `{HOST.HOST}` w tych kontekstach, odwołanie wskazuje na pierwszą pozycję w wyrażeniu wyzwalacza lub na pierwszą pozycję na wykresie.
Poza tymi obsługiwanymi kontekstami pominięcie nazwy hosta w wyrażeniach wyzwalaczy spowoduje błąd.
Zobacz przykład [Compare long-term CPU loads](/manual/config/triggers/trigger_examples#compare-long-term-cpu-loads), aby zobaczyć ilustrację użycia podwójnego ukośnika w makrach Nazwy zdarzenia.

[comment]: # ({/c59d025d-7ea76dfe})

[comment]: # ({85352379-cf9e09bb})
##### Okres czasu

Parametry specyficzne dla funkcji są umieszczane po kluczu pozycji i są oddzielane od klucza pozycji przecinkiem.

Większość funkcji numerycznych przyjmuje **okres czasu** jako parametr.
Pozwala on określić interesujący nas przedział.
Może być podany jako okres czasu (30s, 10m, 1h) lub jako zakres wartości (\#5 - dla pięciu najnowszych wartości).

Można użyć sekund lub [sufiksów czasu](/manual/appendix/suffixes), aby wskazać okres czasu.
Jeśli parametr jest poprzedzony znakiem hash, ma on inne znaczenie:

|Expression|Description|
|----------|-----------|
|**sum**(/host/key,**10m)**|Suma wartości z ostatnich 10 minut.|
|**sum**(/host/key,**\#10)**|Suma ostatnich dziesięciu wartości.|

Parametry ze znakiem hash mają inne znaczenie w przypadku funkcji **last** - oznaczają N-tą poprzednią wartość, więc dla wartości 30, 70, 20, 60, 50 (od najnowszej do najstarszej):

-   `last(/host/key,#2)` zwróci '70'
-   `last(/host/key,#5)` zwróci '50'

Okres czasu jest liczony do "teraz" - gdzie "teraz" oznacza najnowszy czas ponownego obliczenia wyzwalacza (zobacz [Częstotliwość obliczeń](/manual/config/triggers#calculation-frequency)); "teraz" nie jest czasem "teraz" serwera.

Okres czasu określa:

-   Wszystkie wartości między "teraz - okres czasu" a "teraz" (lub, po zastosowaniu przesunięcia czasu, między "teraz - przesunięcie czasu - okres czasu" a "teraz - przesunięcie czasu").
-   Określoną liczbę wartości z przeszłości, aż do "teraz".

Jeśli dla określonego okresu oceny nie istnieją żadne dane, wyzwalacz lub pozycja obliczana korzystająca z tej funkcji staje się nieobsługiwana.

Należy pamiętać, że:

-   Jeśli w wyzwalaczu używana jest tylko jedna funkcja (odwołująca się do historii danych), "teraz" jest zawsze najnowszą otrzymaną wartością. Na przykład, jeśli ostatnia wartość została odebrana godzinę temu, okres czasu będzie traktowany jako sięgający do najnowszej wartości sprzed godziny.
-   Nowy wyzwalacz jest obliczany natychmiast po otrzymaniu pierwszej wartości (funkcje historii); zostanie obliczony w ciągu 30 sekund dla funkcji [data i czas](/manual/config/triggers/expression/time) oraz [nodata()](/manual/config/triggers/expression/history#nodata). W związku z tym wyzwalacz zostanie obliczony nawet wtedy, gdy ustawiony okres czasu (na przykład jedna godzina) jeszcze nie upłynął od utworzenia wyzwalacza. Wyzwalacz zostanie również obliczony po otrzymaniu pierwszej wartości, nawet jeśli zakres czasu został ustawiony na przykład na dziesięć najnowszych wartości.

[comment]: # ({/85352379-cf9e09bb})

[comment]: # ({da3613bd-6699e631})
##### Przesunięcie czasu

Opcjonalne przesunięcie czasu jest obsługiwane przy użyciu czasu lub liczby wartości jako parametru funkcji.
Ten parametr umożliwia odwoływanie się do danych z okresu czasu w przeszłości.

Przesunięcie czasu zaczyna się od `now` — określającego bieżący czas, po którym następuje `+N<time unit>` lub `-N<time unit>` — aby dodać lub odjąć N jednostek czasu.

Na przykład `avg(/host/key,1h:now-1d)` zwróci wartość średnią dla jednej godziny sprzed jednego dnia.

::: noteimportant
Przesunięcie czasu określone w miesiącach (M) i latach (y) jest obsługiwane tylko dla [funkcji trendów](/manual/config/triggers/expression/trends). Inne funkcje obsługują sekundy (s), minuty (m), godziny (h), dni (d) i tygodnie (w).
:::

**Przesunięcie czasu z bezwzględnymi okresami czasu**

Bezwzględne okresy czasu są obsługiwane w parametrze przesunięcia czasu, na przykład od północy do północy dla dnia, od poniedziałku do niedzieli dla tygodnia, od pierwszego do ostatniego dnia
miesiąca dla miesiąca.

Przesunięcie czasu dla bezwzględnych okresów czasu zaczyna się od `now` — określającego bieżący czas, po którym może następować dowolna liczba operacji na czasie: `/<time unit>` — definiuje początek i koniec jednostki czasu, na przykład od północy do północy dla dnia, `+N<time unit>` lub `-N<time unit>` — aby dodać lub odjąć N jednostek czasu.

Należy pamiętać, że wartość przesunięcia czasu może być większa lub równa 0, podczas gdy minimalna wartość okresu czasu wynosi 1.

|Parameter|Description|
|--|--------|
|1d:now/d|Wczoraj|
|1d:now/d+1d|Dzisiaj|
|2d:now/d+1d|Ostatnie 2 dni|
|1w:now/w|Poprzedni tydzień|
|1w:now/w+1w|Bieżący tydzień|

[comment]: # ({/da3613bd-6699e631})

[comment]: # ({7fc33108-c5d3ec54})
##### Inne wyrażenia

Parametry funkcji mogą zawierać inne wyrażenia, jak w poniższej składni:

```default
min(min(/host/key,1h),min(/host2/key2,1h)*10)
```

Należy pamiętać, że inne wyrażenia nie mogą być używane, jeśli funkcja odwołuje się do historii pozycji.
Na przykład poniższa składnia **nie** jest dozwolona:

~~`min(/host/key,#5*10)`~~

Chociaż inne wyrażenia wyzwalaczy jako parametry funkcji są w wyzwalaczach ograniczone do funkcji nieodwołujących się do historii, to ograniczenie nie ma zastosowania w [pozycjach obliczanych](/manual/config/items/itemtypes/calculated).

[comment]: # ({/7fc33108-c5d3ec54})

[comment]: # ({2ef1f03c-10bc91a2})
#### Operatory

Następujące operatory są obsługiwane dla wyzwalaczy **(w malejącej kolejności priorytetu wykonywania)**:

|Priorytet|Operator|Definicja|**Uwagi dotyczące [wartości nieznanych](/manual/config/triggers/expression#unknown-expression-state)**|Wymuś rzutowanie operandu na float ^**1**^|
|-|-|----|----------------|--|
|**1**|**-**|Jednoargumentowy minus|**-**Unknown → Unknown|Tak|
|**2**|**not**|Logiczne NOT|**not** Unknown → Unknown|Tak|
|**3**|**\***|Mnożenie|0 **\*** Unknown → Unknown<br>(tak, Unknown, a nie 0 - aby nie utracić<br>Unknown w operacjach arytmetycznych)<br>1.2 **\*** Unknown → Unknown|Tak|
|<|**/**|Dzielenie|Unknown **/** 0 → error<br>Unknown **/** 1.2 → Unknown<br>0.0 **/** Unknown → Unknown|Tak|
|**4**|**+**|Dodawanie arytmetyczne|1.2 **+** Unknown → Unknown|Tak|
|<|**-**|Odejmowanie arytmetyczne|1.2 **-** Unknown → Unknown|Tak|
|**5**|**\<**|Mniejsze niż. Operator jest zdefiniowany jako:<br><br>A<B ⇔ (A<B-0.000001)|1.2 **<** Unknown → Unknown|Tak|
|<|**<=**|Mniejsze niż lub równe. Operator jest zdefiniowany jako:<br><br>A<=B ⇔ (A≤B+0.000001)|Unknown **<=** Unknown → Unknown|Tak|
|<|**>**|Większe niż. Operator jest zdefiniowany jako:<br><br>A>B ⇔ (A>B+0.000001)| |Tak|
|<|**>=**|Większe niż lub równe. Operator jest zdefiniowany jako:<br><br>A>=B ⇔ (A≥B-0.000001)| |Tak|
|**6**|**=**|Równe. Operator jest zdefiniowany jako:<br><br>A=B ⇔ (A≥B-0.000001) and (A≤B+0.000001)| |Nie ^**1**^|
|<|**<>**|Różne. Operator jest zdefiniowany jako:<br><br>A<>B ⇔ (A<B-0.000001) or (A>B+0.000001)| |Nie ^**1**^|
|**7**|**and**|Logiczne AND|0 **and** Unknown → 0<br>1 **and** Unknown → Unknown<br>Unknown **and** Unknown → Unknown|Tak|
|**8**|**or**|Logiczne OR|1 **or** Unknown → 1<br>0 **or** Unknown → Unknown<br>Unknown **or** Unknown → Unknown|Tak|

^**1**^ Operand typu string jest nadal rzutowany na wartość numeryczną, jeśli:

-   drugi operand jest numeryczny
-   na operandzie użyto operatora innego niż **=** lub **<>**

(Jeśli rzutowanie się nie powiedzie - operand numeryczny jest rzutowany na operand typu string i oba operandy są porównywane jako stringi.)

Operatory **not**, **and** i **or** rozróżniają wielkość liter i muszą być zapisane małymi literami.
Muszą też być otoczone spacjami lub nawiasami.

Wszystkie operatory, z wyjątkiem jednoargumentowego **-** i **not**, mają lewostronną łączność.
Jednoargumentowe **-** i **not** nie są łączne (co oznacza, że należy używać **-(-1)** i **not (not 1)** zamiast **--1** i **not not 1**).

Wynik obliczenia:

-   operatory **<**, **<=**, **>**, **>=**, **=**, **<>** zwracają '1' w wyrażeniu wyzwalacza, jeśli określona relacja jest prawdziwa, oraz '0', jeśli jest fałszywa.
Jeśli co najmniej jeden operand ma wartość Unknown, wynikiem jest Unknown;
-   **and** dla znanych operandów zwraca '1', jeśli oba jego operandy są różne od '0'; w przeciwnym razie zwraca '0'; dla nieznanych operandów **and** zwraca '0' tylko wtedy, gdy jeden operand jest równy '0'; w przeciwnym razie zwraca 'Unknown';
-   **or** dla znanych operandów zwraca '1', jeśli którykolwiek z jego operandów jest różny od '0'; w przeciwnym razie zwraca '0'; dla nieznanych operandów **or** zwraca '1' tylko wtedy, gdy jeden operand jest różny od '0'; w przeciwnym razie zwraca 'Unknown';
-   wynik operatora negacji logicznej **not** dla znanego operandu wynosi '0', jeśli wartość jego operandu jest różna od '0'; '1', jeśli wartość jego operandu jest równa '0'.
Dla nieznanego operandu **not** zwraca 'Unknown'.

[comment]: # ({/2ef1f03c-10bc91a2})

[comment]: # ({a5181770-cad1df72})
#### Nieznany stan wyrażenia

Możliwe jest, że w wyrażeniu wyzwalacza pojawi się nieznany operand, gdy:

-   używana jest nieobsługiwana pozycja
-   obliczenie funkcji dla obsługiwanej pozycji kończy się błędem

W takim przypadku wyrażenie wyzwalacza jest zazwyczaj obliczane jako `Unknown` (ponieważ nie może zostać obliczone)

Możliwe jest [otrzymywanie powiadomień](/manual/config/events/sources#internal-events) o wyzwalaczach w stanie nieznanym.

**Wyjątki**

Pomimo obecności nieznanego operandu, wyrażenia wyzwalacza mogą w niektórych przypadkach zostać obliczone do znanego wyniku (Problem/OK):

-   Funkcja [`nodata()`](/manual/config/triggers/trigger/expression/history#nodata) jest obliczana niezależnie od tego, czy wskazana pozycja jest obsługiwana, czy nie.
-   Wyrażenia z AND/OR mogą zostać obliczone do znanego wyniku w dwóch przypadkach:
    -   **Przypadek 1**: „`1 or some_function(unsupported_item1) or some_function(unsupported_item2) or ...`” jest obliczane do znanego wyniku ('1' lub „Problem”),
    -   **Przypadek 2**: „`0 and some_function(unsupported_item1) and some_function(unsupported_item2) and ...`” jest obliczane do znanego wyniku ('0' lub „OK”).
-   Jeśli obliczenie funkcji dla obsługiwanej pozycji kończy się błędem, wartość funkcji staje się `Unknown` i bierze udział jako nieznany operand w dalszym obliczaniu wyrażenia.

Nieznane operandy mogą „zniknąć” tylko w wyrażeniach logicznych, jak opisano powyżej.
W wyrażeniach arytmetycznych nieznane operandy zawsze prowadzą do wyniku `Unknown` (z wyjątkiem dzielenia przez 0).

::: noteimportant
Nieznany stan wyrażenia nie zmienia stanu wyzwalacza (Problem/OK).
Dlatego jeśli stan wyzwalacza był „Problem” (zobacz Przypadek 1), pozostaje on w stanie problemu nawet wtedy, gdy znana część zostanie rozwiązana ('1' zmieni się na '0'), ponieważ wyrażenie jest teraz obliczane jako `Unknown`, a to nie zmienia stanu wyzwalacza.
:::

Jeśli wyrażenie wyzwalacza z kilkoma nieobsługiwanymi pozycjami zostanie obliczone jako `Unknown`, komunikat o błędzie w frontend odnosi się do ostatniej obliczanej nieobsługiwanej pozycji.

[comment]: # ({/a5181770-cad1df72})

[comment]: # ({0e2466bf-195c3f4f})
#### Buforowanie wartości

Wartości wymagane do obliczania wyzwalaczy są buforowane przez serwer Zabbix.
Z tego powodu obliczanie wyzwalaczy przez pewien czas po ponownym uruchomieniu serwera powoduje większe obciążenie bazy danych.

Bufor wartości nie jest czyszczony po usunięciu wartości historii pozycja (ręcznie lub przez housekeeper), dlatego serwer będzie używać wartości z pamięci podręcznej, dopóki nie będą one starsze niż okresy czasu zdefiniowane w funkcjach wyzwalaczy lub dopóki serwer nie zostanie ponownie uruchomiony.

::: noteclassic
Jeśli w pamięci podręcznej nie ma aktualnych danych i w funkcji nie zdefiniowano okresu odpytywania, Zabbix domyślnie cofnie się maksymalnie o tydzień, aby odpytać bazę danych o wartości historyczne.
:::

[comment]: # ({/0e2466bf-195c3f4f})
