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

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

[comment]: # ({07d50a02-473bcd5e})
#### Przegląd

Wyrażenia używane w [wyzwalaczach](/manual/config/triggers) są bardzo elastyczne.
Można ich używać do tworzenia złożonych testów logicznych dotyczących monitorowanych statystyk.

Proste wyrażenie używa **funkcji**, która jest stosowana do pozycji z pewnymi parametrami.
Funkcja zwraca wynik, który jest porównywany z progiem za pomocą operatora i stałej.

Składnia prostego, użytecznego wyrażenia to `function(/host/key,parameter)<operator><constant>`.

Na przykład:

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

spowoduje wyzwolenie, jeśli liczba odebranych bajtów w ciągu ostatnich pięciu minut zawsze była większa niż 100 kilobajtów.

Chociaż składnia jest dokładnie taka sama, z funkcjonalnego punktu widzenia istnieją dwa typy wyrażeń wyzwalaczy:

-   wyrażenie problemu - definiuje warunki wystąpienia problemu
-   wyrażenie odzyskania (opcjonalne) - definiuje dodatkowe warunki rozwiązania problemu

Podczas definiowania wyłącznie wyrażenia problemu, będzie ono używane zarówno jako próg problemu, jak i próg odzyskania.
Gdy tylko wyrażenie problemu zostanie ocenione jako TRUE, występuje problem.
Gdy tylko wyrażenie problemu zostanie ocenione jako FALSE, problem zostaje rozwiązany.

Podczas definiowania zarówno wyrażenia problemu, jak i dodatkowego wyrażenia odzyskania, rozwiązanie problemu staje się bardziej złożone: nie tylko wyrażenie problemu musi mieć wartość FALSE, ale także wyrażenie odzyskania musi mieć wartość TRUE.
Jest to przydatne do tworzenia [histerezy](#hysteresis) i unikania migotania wyzwalacza.

:::noteclassic
Nie ma sensu używać makra {TRIGGER.VALUE} w wyrażeniu odzyskania, ponieważ to wyrażenie jest oceniane tylko wtedy, gdy wyzwalacz znajduje się w stanie "Problem". W konsekwencji {TRIGGER.VALUE} zawsze będzie miało wartość "1" (co oznacza stan "Problem") podczas oceny wyrażenia.
:::

[comment]: # ({/07d50a02-473bcd5e})

[comment]: # ({8df5a50f-d4e5ef03})
#### Funkcje

Funkcje umożliwiają obliczanie zebranych wartości (średnia, minimum, maksimum, suma), wyszukiwanie ciągów znaków, odwoływanie się do bieżącego czasu oraz innych czynników.

Dostępna jest pełna lista [obsługiwanych funkcji](/manual/appendix/functions).

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](#example-14)).

[comment]: # ({/8df5a50f-d4e5ef03})

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

Parametry funkcji umożliwiają określenie:

-   hosta i klucza pozycji (funkcje odwołujące się wyłącznie do historii pozycji hosta)
-   parametrów specyficznych dla danej funkcji
-   innych wyrażeń (niedostępne dla funkcji odwołujących się wyłącznie do historii pozycji hosta; zobacz [inne wyrażenia](#other-expressions), aby poznać przykłady)

Host i klucz pozycji można określić jako `/host/key`.<br>
Pomijanie nazwy hosta w pierwszym parametrze (tj. w postaci `function(//key,parameter,...)`) jest obsługiwane tylko w niektórych kontekstach:

-   W formule obliczanych pozycji
-   W makrach wyrażeń, które można stosować 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).
`{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 wyzwalacza spowoduje błąd.
Zobacz [Przykład 18](#example-18), aby zobaczyć ilustrację użycia podwójnego ukośnika w makrach Nazwy zdarzenia.

Odwoływana pozycja musi znajdować się w obsługiwanym stanie (z wyjątkiem funkcji **nodata()**, która jest obliczana również dla nieobsługiwanych pozycji).

Chociaż inne wyrażenia wyzwalacza jako parametry funkcji są ograniczone do funkcji innych niż historyczne w wyzwalaczach, to ograniczenie nie ma zastosowania w [obliczanych pozycjach](/manual/config/items/itemtypes/calculated).

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

[comment]: # ({233dadf7-cf9e09bb})
##### Parametry specyficzne dla funkcji

Parametry specyficzne dla funkcji są umieszczane po kluczu pozycji i oddzielane od klucza pozycji przecinkiem.
Pełną listę tych parametrów można znaleźć w sekcji [obsługiwane funkcje](/manual/appendix/functions).

Większość funkcji numerycznych przyjmuje czas jako parametr.
Do określenia czasu można użyć sekund lub [przyrostków czasu](/manual/appendix/suffixes).
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'

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

[comment]: # ({bf48db7f-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łanie się do danych z okresu w przeszłości.

Przesunięcie czasu zaczyna się od `now` - określenia bieżącego czasu, a następnie wystę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 średnią wartość dla godziny sprzed jednego dnia.

::: noteimportant
Przesunięcie czasu określone w miesiącach (M) i latach (y) jest obsługiwane tylko przez [funkcje trendów](/manual/appendix/functions/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ślenia bieżącego czasu, a następnie występuje dowolna liczba operacji czasu: `/<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|Ostatni tydzień|
|1w:now/w+1w|Ten tydzień|

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

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

Parametry funkcji mogą zawierać inne wyrażenia, jak w następującej składni:

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

Należy pamiętać, że innych wyrażeń nie można używać, jeśli funkcja odwołuje się do historii pozycji.
Na przykład następująca składnia **nie** jest dozwolona:

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

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

[comment]: # ({5aa16694-10bc91a2})
#### Operatory

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

|Priorytet|Operator|Definicja|**Uwagi dla [nieznanych wartości](/manual/config/triggers/expression#expressions-with-unknown-operands)**|Wymuś rzutowanie operandu na float ^**1**^|
|-|-|----|----------------|--|
|**1**|**-**|Minus unarny|**-**Nieznane → Nieznane|Tak|
|**2**|**not**|Logiczne NOT|**not** Nieznane → Nieznane|Tak|
|**3**|**\***|Mnożenie|0 **\*** Nieznane → Nieznane<br>(tak, Nieznane, a nie 0 - aby nie tracić<br>Nieznane w operacjach arytmetycznych)<br>1.2 **\*** Nieznane → Nieznane|Tak|
|<|**/**|Dzielenie|Nieznane **/** 0 → błąd<br>Nieznane **/** 1.2 → Nieznane<br>0.0 **/** Nieznane → Nieznane|Tak|
|**4**|**+**|Dodawanie arytmetyczne|1.2 **+** Nieznane → Nieznane|Tak|
|<|**-**|Odejmowanie arytmetyczne|1.2 **-** Nieznane → Nieznane|Tak|
|**5**|**\<**|Mniejsze niż. Operator jest zdefiniowany jako:<br><br>A<B ⇔ (A<B-0.000001)|1.2 **<** Nieznane → Nieznane|Tak|
|<|**<=**|Mniejsze lub równe. Operator jest zdefiniowany jako:<br><br>A<=B ⇔ (A≤B+0.000001)|Nieznane **<=** Nieznane → Nieznane|Tak|
|<|**>**|Większe niż. Operator jest zdefiniowany jako:<br><br>A>B ⇔ (A>B+0.000001)| |Tak|
|<|**>=**|Większe 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** Nieznane → 0<br>1 **and** Nieznane → Nieznane<br>Nieznane **and** Nieznane → Nieznane|Tak|
|**8**|**or**|Logiczne OR|1 **or** Nieznane → 1<br>0 **or** Nieznane → Nieznane<br>Nieznane **or** Nieznane → Nieznane|Tak|

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

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

W przypadku operatorów relacyjnych (`<`, `<=`, `>`, `>=`): jeśli rzutowanie się nie powiedzie (na przykład dla `""`), wyrażenie zwraca Nieznane (bez alternatywnego porównania jako ciągów znaków).

W przypadku operatorów równości (`=`, `<>`): jeśli rzutowanie się nie powiedzie, operandy są porównywane jako surowe ciągi znaków.

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

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

Wynik ewaluacji:

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

[comment]: # ({/5aa16694-10bc91a2})

[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})

[comment]: # ({abac99e3-abac99e3})
#### Przykłady wyzwalaczy

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

[comment]: # ({56e707cf-17b607dc})
##### Przykład 1

Obciążenie procesora jest zbyt wysokie na serwerze Zabbix.

```default
last(/Zabbix server/system.cpu.load[all,avg1])>5
```

Używając funkcji `last()`, odwołujemy się do najnowszej wartości.
`/Zabbix server/system.cpu.load[all,avg1]` podaje krótką nazwę monitorowanego parametru.
Określa ona, że hostem jest `Zabbix server`, a monitorowanym kluczem jest `system.cpu.load\[all,avg1\]`.
Na koniec `>5` oznacza, że wyzwalacz znajduje się w stanie PROBLEM zawsze wtedy, gdy najnowszy pomiar obciążenia procesora z serwera Zabbix jest większy niż 5.

[comment]: # ({/56e707cf-17b607dc})

[comment]: # ({eb26dc13-9a129732})
##### Przykład 2

www.example.com jest przeciążony.

```default
last(/www.example.com/system.cpu.load[all,avg1])>5 or min(/www.example.com/system.cpu.load[all,avg1],10m)>2 
```

Wyrażenie jest prawdziwe, gdy bieżące obciążenie procesora jest większe niż 5 lub obciążenie procesora było większe niż 2 w ciągu ostatnich 10 minut.

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

[comment]: # ({c3efce1a-49592749})
##### Przykład 3

/etc/passwd został zmieniony.

```default
last(/www.example.com/vfs.file.cksum[/etc/passwd],#1)<>last(/www.example.com/vfs.file.cksum[/etc/passwd],#2)
```

Wyrażenie jest prawdziwe, gdy poprzednia wartość sumy kontrolnej /etc/passwd różni się od najnowszej.

Podobne wyrażenia mogą być przydatne do monitorowania zmian w ważnych plikach, takich jak /etc/passwd, /etc/inetd.conf, /kernel itd.

[comment]: # ({/c3efce1a-49592749})

[comment]: # ({2c152827-46e72843})
##### Przykład 4

Ktoś pobiera duży plik z Internetu.

Użycie funkcji min:

```default
min(/www.example.com/net.if.in[eth0,bytes],5m)>100K
```

Wyrażenie jest prawdziwe, gdy liczba odebranych bajtów na eth0 jest większa niż 100 KB w ciągu ostatnich 5 minut.

[comment]: # ({/2c152827-46e72843})

[comment]: # ({914aa064-7956e04e})
##### Przykład 5

Oba węzły klastrowanego serwera SMTP są niedostępne.

Zwróć uwagę na użycie dwóch różnych hostów w jednym wyrażeniu:

```default
last(/smtp1.example.com/net.tcp.service[smtp])=0 and last(/smtp2.example.com/net.tcp.service[smtp])=0
```

Wyrażenie jest prawdziwe, gdy oba serwery SMTP są niedostępne zarówno na smtp1.example.com, jak i smtp2.example.com.

[comment]: # ({/914aa064-7956e04e})

[comment]: # ({461ff958-62cfb014})
##### Przykład 6

Agent Zabbix musi zostać zaktualizowany.

Użycie funkcji find():

```default
find(/example.example.com/agent.version,,"like","beta8")=1
```

Wyrażenie jest prawdziwe, jeśli agent Zabbix ma wersję beta8.

[comment]: # ({/461ff958-62cfb014})

[comment]: # ({b25c8bb8-567b88a9})
##### Przykład 7

Serwer jest nieosiągalny.

```default
count(/example.example.com/icmpping,30m,,"0")>5
```

Wyrażenie jest prawdziwe, jeśli host "example.example.com" jest nieosiągalny więcej niż 5 razy w ciągu ostatnich 30 minut.

[comment]: # ({/b25c8bb8-567b88a9})

[comment]: # ({c264178f-2f13cb92})
##### Przykład 8

Brak danych przez ostatnie 3 minuty.

Użycie funkcji nodata():

```default
nodata(/example.example.com/tick,3m)=1
```

Aby skorzystać z tego wyzwalacza, element 'tick' musi być zdefiniowany jako pozycja Zabbix [trapper](/manual/config/items/itemtypes/trapper).
Host powinien okresowo wysyłać dane dla tej pozycji za pomocą zabbix\_sender.
Jeśli w ciągu 180 sekund nie zostaną odebrane żadne dane, wartość wyzwalacza zmienia się na PROBLEM.

*Uwaga* Funkcji 'nodata' można używać dla dowolnego typu pozycji.

[comment]: # ({/c264178f-2f13cb92})

[comment]: # ({663a1265-2c48905a})
##### Przykład 9

Aktywność CPU w nocy.

Użycie funkcji time():

```default
min(/Zabbix server/system.cpu.load[all,avg1],5m)>2 and time()<060000
```

Wyzwalacz może zmienić swój stan na problem tylko w nocy (00:00 - 06:00).

[comment]: # ({/663a1265-2c48905a})

[comment]: # ({2a28e303-7e0ba13a})
##### Przykład 10

Aktywność CPU w dowolnym momencie z wyjątkiem.

Użycie funkcji time() i operatora **not**:

```default
min(/zabbix/system.cpu.load[all,avg1],5m)>2
and not (dayofweek()=7 and time()>230000)
and not (dayofweek()=1 and time()<010000)
```

Wyzwalacz może zmienić swój stan na problem w dowolnym momencie, z wyjątkiem 2 godzin podczas zmiany tygodnia (niedziela, 23:00 - poniedziałek, 01:00).

[comment]: # ({/2a28e303-7e0ba13a})

[comment]: # ({dbb498df-0e6bfc51})
##### Przykład 11

Sprawdź, czy czas lokalny klienta jest zsynchronizowany z czasem serwera Zabbix.

Użycie funkcji fuzzytime():

```default
fuzzytime(/MySQL_DB/system.localtime,10s)=0
```

Wyzwalacz przejdzie do stanu problemu w przypadku, gdy czas lokalny na serwerze MySQL\_DB i serwerze Zabbix różni się o więcej niż 10 sekund.
Należy pamiętać, że `system.localtime` musi być skonfigurowany jako [passive check](/manual/appendix/items/activepassive#passive-checks) dla agent Zabbix; w agent Zabbix 2 może być skonfigurowany jako check aktywny.

[comment]: # ({/dbb498df-0e6bfc51})

[comment]: # ({4f63a3b1-47b2e2fd})
##### Przykład 12

Porównanie średniego obciążenia dzisiaj ze średnim obciążeniem z tego samego czasu wczoraj (z użyciem przesunięcia czasu jako `now-1d`).

```default
avg(/server/system.cpu.load,1h)/avg(/server/system.cpu.load,1h:now-1d)>2
```

Wyzwalacz uruchomi się, jeśli średnie obciążenie z ostatniej godziny przekroczy średnie obciążenie z tej samej godziny wczoraj ponad dwa razy.

[comment]: # ({/4f63a3b1-47b2e2fd})

[comment]: # ({536c07d9-bb0f5278})
##### Przykład 13

Użycie wartości innej pozycji do uzyskania progu wyzwalacza:

```default
last(/Template PfSense/hrStorageFree[{#SNMPVALUE}])<last(/Template PfSense/hrStorageSize[{#SNMPVALUE}])*0.1
```

Wyzwalacz zostanie uruchomiony, jeśli wolna przestrzeń dyskowa spadnie poniżej 10 procent.

[comment]: # ({/536c07d9-bb0f5278})

[comment]: # ({e67109f1-0cc34ec7})
##### Przykład 14

Użycie [wyniku oceny](#operators) do uzyskania liczby wyzwalaczy przekraczających próg:

```default
(last(/server1/system.cpu.load[all,avg1])>5) + (last(/server2/system.cpu.load[all,avg1])>5) + (last(/server3/system.cpu.load[all,avg1])>5)>=2
```

Wyzwalacz zostanie uruchomiony, jeśli co najmniej dwa z wyzwalaczy w wyrażeniu znajdują się w stanie problemu.

[comment]: # ({/e67109f1-0cc34ec7})

[comment]: # ({3d70b4b9-adfc6b9d})
##### Przykład 15

Porównywanie wartości tekstowych dwóch pozycji - operandami są tutaj funkcje zwracające ciągi znaków.

Problem: utworzyć alert, jeśli wersja Ubuntu jest inna na różnych hostach

```default
last(/NY Zabbix server/vfs.file.contents[/etc/os-release])<>last(/LA Zabbix server/vfs.file.contents[/etc/os-release])
```

[comment]: # ({/3d70b4b9-adfc6b9d})

[comment]: # ({18b8548e-c2b4949f})
##### Przykład 16

Porównywanie dwóch wartości ciągów znaków - operandami są:

-   funkcja zwracająca ciąg znaków
-   kombinacja makr i ciągów znaków

Problem: wykrywanie zmian w zapytaniu DNS

Klucz pozycji to:

```default
net.dns.record[192.0.2.1,{$WEBSITE_NAME},{$DNS_RESOURCE_RECORD_TYPE},2,1]
```

z makrami zdefiniowanymi jako

```default
{$WEBSITE_NAME} = example.com
{$DNS_RESOURCE_RECORD_TYPE} = MX
```

i zwykle zwraca:

```default
example.com           MX       0 mail.example.com
```

Zatem wyrażenie wyzwalacza służące do wykrycia, czy wynik zapytania DNS odbiega od oczekiwanego wyniku, ma postać:

```default
last(/Zabbix server/net.dns.record[192.0.2.1,{$WEBSITE_NAME},{$DNS_RESOURCE_RECORD_TYPE},2,1])<>"{$WEBSITE_NAME}           {$DNS_RESOURCE_RECORD_TYPE}       0 mail.{$WEBSITE_NAME}"
```

Zwróć uwagę na cudzysłowy wokół drugiego operandu.

[comment]: # ({/18b8548e-c2b4949f})

[comment]: # ({3c7c7fa3-60fad4fc})
##### Przykład 17

Porównywanie dwóch wartości typu string - operandami są:

-   funkcja zwracająca string
-   stała string z znakami specjalnymi \\ i "

Problem: wykryć, czy zawartość pliku `/tmp/hello` jest równa:

```default
\" //hello ?\"
```

Opcja 1. Zapisz string bezpośrednio:

```default
last(/Zabbix server/vfs.file.contents[/tmp/hello])="\\\" //hello ?\\\""
```

Zwróć uwagę, jak znaki \\ i " są escape'owane, gdy string jest porównywany bezpośrednio.

Opcja 2. Użyj makra

```default
{$HELLO_MACRO} = \" //hello ?\"
```

w wyrażeniu:

```default
last(/Zabbix server/vfs.file.contents[/tmp/hello])={$HELLO_MACRO}
```

[comment]: # ({/3c7c7fa3-60fad4fc})

[comment]: # ({9351ce5e-6906462b})
##### Przykład 18

Porównywanie okresów długoterminowych.

Problem: Obciążenie serwera Exchange wzrosło o ponad 10% w ubiegłym miesiącu

```default
trendavg(/Exchange/system.cpu.load,1M:now/M)>1.1*trendavg(/Exchange/system.cpu.load,1M:now/M-1M)
```

Możesz także użyć pola [Nazwa zdarzenia](/manual/config/triggers/trigger#configuration) w konfiguracji wyzwalacza, aby utworzyć sensowny komunikat alarmowy, na przykład otrzymać coś takiego:

`"Obciążenie serwera Exchange wzrosło o 24% w lipcu (0.69) w porównaniu z czerwcem (0.56)"`

nazwa zdarzenia musi być zdefiniowana jako:

```default
Obciążenie serwera {HOST.HOST} wzrosło o {{?100*trendavg(//system.cpu.load,1M:now/M)/trendavg(//system.cpu.load,1M:now/M-1M)}.fmtnum(0)}% w {{TIME}.fmttime(%B,-1M)} ({{?trendavg(//system.cpu.load,1M:now/M)}.fmtnum(2)}) w porównaniu z {{TIME}.fmttime(%B,-2M)} ({{?trendavg(//system.cpu.load,1M:now/M-1M)}.fmtnum(2)})
```

W tego typu problemach przydatne jest również zezwolenie na ręczne zamykanie w konfiguracji wyzwalacza.

[comment]: # ({/9351ce5e-6906462b})

[comment]: # ({0927c71d-contribute})
::: note-contribute
Masz przykład wyrażeń wyzwalacza, który może być przydatny dla innych? Użyj [formularza sugestii przykładu](#report-example), aby przesłać go do deweloperów Zabbix.
:::

[comment]: # ({/0927c71d-contribute})

[comment]: # ({6e5624e6-3f1b1c81})
#### Histereza

Czasami potrzebny jest odstęp między stanem problemu a stanem odzyskania, zamiast prostego progu.
Na przykład, jeśli chcemy zdefiniować wyzwalacz, który zgłasza problem, gdy temperatura w serwerowni przekroczy 20°C, i chcemy, aby pozostawał on w stanie problemu do momentu, gdy temperatura spadnie poniżej 15°C, sam prosty próg wyzwalacza ustawiony na 20°C nie będzie wystarczający.

Zamiast tego musimy najpierw zdefiniować wyrażenie wyzwalacza dla zdarzenia problemu (temperatura powyżej 20°C).
Następnie musimy zdefiniować dodatkowy warunek odzyskania (temperatura poniżej 15°C).
Robi się to przez zdefiniowanie dodatkowego parametru *Wyrażenie odzyskania* podczas [definiowania](/manual/config/triggers/trigger) wyzwalacza.

W tym przypadku odzyskanie po problemie nastąpi w dwóch krokach:

-   Najpierw wyrażenie problemu (temperatura powyżej 20°C) musi zostać ocenione jako FALSE
-   Następnie wyrażenie odzyskania (temperatura poniżej 15°C) musi zostać ocenione jako TRUE

Wyrażenie odzyskania będzie oceniane tylko wtedy, gdy zdarzenie problemu zostanie najpierw rozwiązane.

::: notewarning
Samo to, że wyrażenie odzyskania ma wartość TRUE, nie rozwiązuje problemu, jeśli wyrażenie problemu nadal ma wartość TRUE!
:::

[comment]: # ({/6e5624e6-3f1b1c81})

[comment]: # ({e401ef55-942a7e0e})
##### Przykład 1

Temperatura w serwerowni jest zbyt wysoka.

Wyrażenie problemu:

```default
last(/server/temp)>20
```

Wyrażenie odzyskania:

```default
last(/server/temp)<=15
```

[comment]: # ({/e401ef55-942a7e0e})

[comment]: # ({489d9e1d-bddf0717})
##### Przykład 2

Wolne miejsce na dysku jest zbyt małe.

Wyrażenie problemu: jest mniejsze niż 10 GB przez ostatnie 5 minut

```default
max(/serwer/vfs.fs.size[/,free],5m)<10G
```

Wyrażenie odzyskania: jest większe niż 40 GB przez ostatnie 10 minut

```default
min(/serwer/vfs.fs.size[/,free],10m)>40G
```

[comment]: # ({/489d9e1d-bddf0717})

[comment]: # ({91453a7f-6fc2eb1c})
#### Wyrażenia z nieznanymi operandami

Ogólnie nieznany operand (na przykład nieobsługiwany item) w wyrażeniu natychmiast spowoduje ustawienie wartości wyzwalacza na `Unknown`.

Jednak w niektórych przypadkach nieznane operandy (nieobsługiwane itemy, błędy funkcji) są dopuszczane do oceny wyrażenia:

-   Funkcja `nodata()` jest oceniana niezależnie od tego, czy odwoływany item jest obsługiwany, czy nie.
-   Wyrażenia logiczne z OR i AND mogą zostać ocenione do znanych wartości w dwóch przypadkach, niezależnie od nieznanych operandów:
    -   **Przypadek 1**: "`1 or some_function(unsupported_item1) or some_function(unsupported_item2) or ...`" może zostać ocenione do znanego wyniku ('1' lub "Problem"),
    -   **Przypadek 2**: "`0 and some_function(unsupported_item1) and some_function(unsupported_item2) and ...`" może zostać ocenione do znanego wyniku ('0' lub "OK").<br>
        Zabbix próbuje ocenić takie wyrażenia logiczne, traktując nieobsługiwane itemy jako nieznane operandy.
        W dwóch powyższych przypadkach zostanie wygenerowana znana wartość ("Problem" lub "OK", odpowiednio); we **wszystkich innych** przypadkach wyzwalacz zostanie oceniony jako `Unknown`.
-   Jeśli ocena funkcji dla obsługiwanego itemu zakończy się błędem, wartość funkcji staje się `Unknown` i bierze ona udział jako nieznany operand w dalszej ocenie wyrażenia.

Należy pamiętać, że 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
Wyrażenie, które daje wynik `Unknown`, nie zmienia stanu wyzwalacza ("Problem/OK").
Tak więc, jeśli było "Problem" (zobacz Przypadek 1), pozostaje w tym samym stanie problemu nawet wtedy, gdy znana część zostanie rozwiązana ('1' zmienia się na '0'), ponieważ wyrażenie jest teraz oceniane jako `Unknown`, a to nie zmienia stanu wyzwalacza.
:::

Jeśli wyrażenie wyzwalacza z kilkoma nieobsługiwanymi itemami zostanie ocenione jako `Unknown`, komunikat błędu w frontend odnosi się do ostatniego ocenianego nieobsługiwanego itemu.

[comment]: # ({/91453a7f-6fc2eb1c})
