2 Wyrażenie wyzwalacza

Przegląd

Wyrażenia używane w wyzwalaczach 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:

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 i unikania migotania wyzwalacza.

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.

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.

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).

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, aby poznać przykłady)

Host i klucz pozycji można określić jako /host/key.
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:

W tych kontekstach można również użyć makra {HOST.HOST}. {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, 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.

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.

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

Przesunięcie czasu określone w miesiącach (M) i latach (y) jest obsługiwane tylko przez funkcje trendów. 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ń
Inne wyrażenia

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

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)

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 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
(tak, Nieznane, a nie 0 - aby nie tracić
Nieznane w operacjach arytmetycznych)
1.2 * Nieznane → Nieznane
Tak
/ Dzielenie Nieznane / 0 → błąd
Nieznane / 1.2 → Nieznane
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:

A<B ⇔ (A<B-0.000001)
1.2 < Nieznane → Nieznane Tak
<= Mniejsze lub równe. Operator jest zdefiniowany jako:

A<=B ⇔ (A≤B+0.000001)
Nieznane <= Nieznane → Nieznane Tak
> Większe niż. Operator jest zdefiniowany jako:

A>B ⇔ (A>B+0.000001)
Tak
>= Większe lub równe. Operator jest zdefiniowany jako:

A>=B ⇔ (A≥B-0.000001)
Tak
6 = Równe. Operator jest zdefiniowany jako:

A=B ⇔ (A≥B-0.000001) and (A≤B+0.000001)
Nie 1
<> Różne. Operator jest zdefiniowany jako:

A<>B ⇔ (A<B-0.000001) or (A>B+0.000001)
Nie 1
7 and Logiczne AND 0 and Nieznane → 0
1 and Nieznane → Nieznane
Nieznane and Nieznane → Nieznane
Tak
8 or Logiczne OR 1 or Nieznane → 1
0 or Nieznane → Nieznane
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'.

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.

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.

Przykłady wyzwalaczy

Przykład 1

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

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.

Przykład 2

www.example.com jest przeciążony.

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.

Przykład 3

/etc/passwd został zmieniony.

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.

Przykład 4

Ktoś pobiera duży plik z Internetu.

Użycie funkcji min:

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.

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:

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.

Przykład 6

Agent Zabbix musi zostać zaktualizowany.

Użycie funkcji find():

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

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

Przykład 7

Serwer jest nieosiągalny.

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.

Przykład 8

Brak danych przez ostatnie 3 minuty.

Użycie funkcji nodata():

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

Aby skorzystać z tego wyzwalacza, element 'tick' musi być zdefiniowany jako pozycja Zabbix 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.

Przykład 9

Aktywność CPU w nocy.

Użycie funkcji time():

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).

Przykład 10

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

Użycie funkcji time() i operatora not:

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).

Przykład 11

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

Użycie funkcji fuzzytime():

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 dla agent Zabbix; w agent Zabbix 2 może być skonfigurowany jako check aktywny.

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).

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.

Przykład 13

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

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.

Przykład 14

Użycie wyniku oceny do uzyskania liczby wyzwalaczy przekraczających próg:

(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.

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

last(/NY Zabbix server/vfs.file.contents[/etc/os-release])<>last(/LA Zabbix server/vfs.file.contents[/etc/os-release])
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:

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

z makrami zdefiniowanymi jako

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

i zwykle zwraca:

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ć:

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.

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:

\" //hello ?\"

Opcja 1. Zapisz string bezpośrednio:

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

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

w wyrażeniu:

last(/Zabbix server/vfs.file.contents[/tmp/hello])={$HELLO_MACRO}
Przykład 18

Porównywanie okresów długoterminowych.

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

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 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:

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.

Masz przykład wyrażeń wyzwalacza, który może być przydatny dla innych? Użyj formularza sugestii przykładu, aby przesłać go do deweloperów Zabbix.

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 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.

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

Przykład 1

Temperatura w serwerowni jest zbyt wysoka.

Wyrażenie problemu:

last(/server/temp)>20

Wyrażenie odzyskania:

last(/server/temp)<=15
Przykład 2

Wolne miejsce na dysku jest zbyt małe.

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

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

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

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

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").
      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).

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.