Wyrażenie wyzwalacza i funkcje

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 z jej parametrami 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. 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:

Funkcje

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

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

Grupa funkcji Funkcje
Funkcje agregujące avg, bucket_percentile, count, histogram_quantile, item_count, kurtosis, mad, max, min, skewness, stddevpop, stddevsamp, sum, sumofsquares, varpop, varsamp
Funkcje Foreach avg_foreach, bucket_rate_foreach, count_foreach, exists_foreach, last_foreach, max_foreach, min_foreach, sum_foreach
Funkcje bitowe bitand, bitlshift, bitnot, bitor, bitrshift, bitxor
Funkcje daty i czasu date, dayofmonth, dayofweek, now, time
Funkcje historii change, changecount, count, countunique, find, first, firstclock, fuzzytime, jsonpath, last, lastclock, logeventid, logseverity, logsource, logtimestamp, monodec, monoinc, nodata, percentile, rate, xmlxpath
Funkcje trendów baselinedev, baselinewma, trendavg, trendcount, trendmax, trendmin, trendstl, trendsum
Funkcje matematyczne 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 between, in
Funkcje predykcyjne forecast, timeleft
Funkcje ciągów znaków ascii, bitlength, bytelength, char, concat, contains, insert, jsonpath, left, length, ltrim, mid, repeat, replace, right, rtrim, substring, trim, xmlxpath

O ile nie określono inaczej, funkcje te są obsługiwane w:

Funkcje Foreach są obsługiwane tylko w przypadku obliczeń agregujących.

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 niepasującego oprogramowania na różnych hostach).

Parametry funkcji

Parametry funkcji umożliwiają określenie:

  • klucza pozycji (w postaci /host/key) dla funkcji odwołujących się do historii pozycji hosta
  • okresu (oraz innych parametrów specyficznych dla funkcji)
  • innych wyrażeń
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:

W tych kontekstach można również użyć makra {HOST.HOST}. 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, aby zobaczyć ilustrację użycia podwójnego ukośnika w makrach Nazwy zdarzenia.

Okres

Parametry specyficzne dla funkcji umieszcza się za kluczem pozycji i oddziela od niego przecinkiem.

Większość funkcji numerycznych przyjmuje okres jako parametr. Umożliwia on określenie interesującego nas przedziału. Można go określić jako okres (30s, 10m, 1h) lub zakres wartości (#5 - pięć najnowszych wartości).

Do wskazania okresu można użyć sekund lub przyrostków czasu. Jeśli parametr jest poprzedzony znakiem hash, ma inne znaczenie:

Expression Description
sum(/host/key,10m) Suma wartości z ostatnich 10 minut.
sum(/host/key,#10) Suma dziesięciu ostatnich 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 jest mierzony do chwili „teraz” - gdzie „teraz” oznacza czas ostatniego przeliczenia wyzwalacza (zobacz Częstotliwość obliczeń); „teraz” nie oznacza bieżącego czasu serwera.

Okres określa:

  • Wszystkie wartości między „teraz - okres” a „teraz” (lub, po zastosowaniu przesunięcia czasowego, między „teraz - przesunięcie czasowe - okres” a „teraz - przesunięcie czasowe”).
  • Określoną liczbę wartości z przeszłości, do chwili „teraz”.

Jeśli w określonym okresie oceny nie istnieją żadne dane, wyzwalacz lub obliczana pozycja używająca 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” zawsze oznacza czas otrzymania najnowszej wartości. Na przykład jeśli ostatnia wartość została otrzymana godzinę temu, okres będzie liczony do najnowszej wartości sprzed godziny.
  • Nowy wyzwalacz jest obliczany natychmiast po otrzymaniu pierwszej wartości (funkcje historii); w przypadku funkcji daty i czasu oraz nodata() zostanie obliczony w ciągu 30 sekund. Oznacza to, że wyzwalacz zostanie obliczony, nawet jeśli od jego utworzenia nie upłynął jeszcze określony okres (na przykład godzina). 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.
Przesunięcie czasowe

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

Przesunięcie czasowe rozpoczyna się od now - określającego bieżący czas, po którym następuje +N<jednostka czasu> lub -N<jednostka czasu> - w celu dodania lub odjęcia N jednostek czasu.

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

Przesunięcie czasowe 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 czasowe z bezwzględnymi okresami

W parametrze przesunięcia czasowego obsługiwane są bezwzględne okresy, 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 czasowe dla bezwzględnych okresów rozpoczyna się od now - określającego bieżący czas, po którym może następować dowolna liczba operacji czasu: /<jednostka czasu> - definiuje początek i koniec jednostki czasu, na przykład od północy do północy dla dnia, +N<jednostka czasu> lub -N<jednostka czasu> - w celu dodania lub odjęcia N jednostek czasu.

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

Parametr Opis
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 poniższej składni:

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.

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 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
(tak, Unknown, a nie 0 - aby nie utracić
Unknown w operacjach arytmetycznych)
1.2 * Unknown → Unknown
Tak
/ Dzielenie Unknown / 0 → error
Unknown / 1.2 → Unknown
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:

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

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

A>B ⇔ (A>B+0.000001)
Tak
>= Większe niż 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 Unknown → 0
1 and Unknown → Unknown
Unknown and Unknown → Unknown
Tak
8 or Logiczne OR 1 or Unknown → 1
0 or Unknown → Unknown
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'.

Nieznany stan wyrażenia

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

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

W takim przypadku wyrażenie wyzwalacza zazwyczaj jest oceniane jako Unknown (ponieważ nie można go ocenić)

Możliwe jest otrzymywanie powiadomień o nieznanych wyzwalaczach.

Wyjątki

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

  • Funkcja nodata() jest oceniana niezależnie od tego, czy odwoływana pozycja jest obsługiwana, czy nie.
  • Wyrażenia z AND/OR mogą zostać ocenione do znanego wyniku w dwóch przypadkach:
    • Przypadek 1: "1 or some_function(unsupported_item1) or some_function(unsupported_item2) or ..." jest oceniane do znanego wyniku ('1' lub "Problem"),
    • Przypadek 2: "0 and some_function(unsupported_item1) and some_function(unsupported_item2) and ..." jest oceniane do znanego wyniku ('0' lub "OK").
  • Jeśli ocena funkcji dla obsługiwanej pozycji kończy się błędem, wartość funkcji staje się Unknown i bierze ona udział jako nieznany operand w dalszej ocenie wyrażenia.

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

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' staje się '0'), ponieważ wyrażenie jest teraz oceniane jako Unknown, a to nie zmienia stanu wyzwalacza.

Jeśli wyrażenie wyzwalacza z kilkoma nieobsługiwanymi pozycjami zostanie ocenione jako Unknown, komunikat błędu w frontend odnosi się do ostatniej ocenionej nieobsługiwanej pozycji.

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.