3 Wyrażenie wyzwalacza
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:
- Przykłady wyzwalaczy
- Wykrywanie problemów za pomocą wyzwalaczy (ogólne wprowadzenie)
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 | 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, last, lastclock, logeventid, logseverity, logsource, logtimestamp, monodec, monoinc, nodata, percentile, rate | |
| 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, insert, jsonpath, left, length, ltrim, mid, repeat, replace, right, rtrim, trim, xmlxpath | |
O ile nie określono inaczej, te funkcje są obsługiwane w:
Funkcje foreach są obsługiwane tylko dla obliczeń agregujących.
Zazwyczaj funkcje zwracają wartości liczbowe do porównania. Jeśli zwracają ciągi znaków, porównanie jest możliwe za pomocą operatorów = i <> (zobacz przykład Wykrywanie niezgodnego oprogramowania na różnych hostach).
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
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
- nazwie wykresu
- etykiecie elementów mapy „Host” i „Trigger” map elements
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 czasu
Parametry specyficzne dla funkcji są umieszczane po kluczu pozycji i oddzielane od klucza pozycji przecinkiem.
Większość funkcji numerycznych akceptuje 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żesz użyć sekund lub sufiksów czasu, aby wskazać okres czasu. Jeśli parametr jest poprzedzony znakiem kratki, ma 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 kratki mają inne znaczenie w przypadku funkcji last — oznaczają N-tą poprzednią wartość, więc przy wartościach 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 mierzony do chwili „teraz” — gdzie „teraz” oznacza czas ostatniego przeliczenia wyzwalacza (zobacz Częstotliwość obliczania); „teraz” nie jest czasem „teraz” serwera.
Okres czasu określa jedno z poniższych:
- Uwzględnienie wszystkich wartości pomiędzy „teraz-okres czasu” a „teraz” (lub, przy przesunięciu czasu, pomiędzy „teraz-przesunięcie czasu-okres czasu” a „teraz-przesunięcie_czasu”)
- Uwzględnienie nie więcej niż liczby wartości określonej przez num z przeszłości, aż
do „teraz”
- Jeśli dla określonego okresu czasu lub liczby num dostępnych jest 0 wartości — wówczas wyzwalacz lub obliczana pozycja korzystająca z tej funkcji staje się nieobsługiwana
Zwróć uwagę, że:
- Jeśli w wyzwalaczu używana jest tylko jedna funkcja (odwołująca się do historii danych), „teraz” zawsze oznacza ostatnio otrzymaną wartość. Na przykład, jeśli ostatnia wartość została odebrana godzinę temu, okres czasu będzie traktowany jako kończący się na tej ostatniej wartości sprzed godziny.
- Nowy wyzwalacz jest obliczany natychmiast po odebraniu pierwszej wartości (funkcje historii); dla funkcji date and time oraz nodata() zostanie obliczony w ciągu 30 sekund. W ten sposób wyzwalacz zostanie obliczony, nawet jeśli od jego utworzenia być może nie upłynął jeszcze ustawiony okres czasu (na przykład jedna godzina). Wyzwalacz zostanie również obliczony po pierwszej wartości, nawet jeśli zakres czasu został ustawiony, na przykład, na dziesięć najnowszych wartości.
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.
Przesunięcie czasu określone w miesiącach (M) i latach (y) jest obsługiwane tylko dla funkcji 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ś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ń |
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
- 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ń 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()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”).
- Przypadek 1: „
- Jeśli obliczenie funkcji dla obsługiwanej pozycji kończy się błędem, wartość funkcji staje się
Unknowni 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).
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.
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.