2 Wyrażenie wyzwalacza
Przegląd
Wyrażenia używane w wyzwalaczach są bardzo elastyczne. Można ich użyć do tworzenia złożonych testów logicznych zależących od monitorowanych statystyk.
Proste wyrażenie może wyglądać następująco:
{<serwer>:<klucz>.<funkcja>(<parametr>)}<operator><stała>
- Funkcje
Funkcje wyzwalaczy pozwalają odwołać się do zebranych danych, aktualnego czasu i innych informacji.
Dostępna jest kompletna lista wspieranych funkcji.
- Parametry funkcji
Większość funkcji numerycznych traktuje parametr jako liczbę sekund.
Żeby zaznaczyć, że parametr ma inne znaczenie, należy użyć prefiksu #:
| WYWOŁANIE FUNKCJI | ZNACZENIE |
|---|---|
| sum(600) | Suma wszystkich wartości z 600 sekund |
| sum(#5) | Suma ostatnich pięciu wartości |
Funkcja last inaczej traktuje wartości z prefiksem # - wybiera n-tą poprzednią wartość, zatem mając wartości 3, 7, 2, 6, 5 (od najnowszej do najstarszej), last(#2) zwróci 7 a last(#5) powinno zwrócić 5.
Funkcje avg, count, last, min i max obsługują
dodatkowy, drugi parametr przesunięcie_czasu. Parametr ten pozwala
odwołać się do okresu czasu w przeszłości. Na przykład, avg(1h,1d)
zwróci wartość średnią z godziny, z poprzedniego dnia.
Wyzwalacze przetwarzają tylko informacje z historii. Jeżeli historia nie jest dostępna (szczególnie ważne przy przesunięciu czasu), nie będą używane dane trendów, zatem historia powinna być przechowywana przynajmniej dla okresu, jakiego oczekują funkcje wyzwalaczy.
W wyrażeniach wyzwalaczy można używać wspieranych jednostek miary, na przykład '5m' (minut) zamiast '300' sekund lub '1d' (dzień) zamiast '86400' sekund. '1K' oznaczać będzie '1024' bajty.
- Operatory
Następujące operatory są obsługiwane przez wyzwalacze (w kolejności priorytetu wykonania):
| PRIORYTET | OPERATOR | DEFINICJA | |
|---|---|---|---|
| 1 | / | Dzielenie | |
| 2 | *** |Mnożenie | |3** | - | Minus arytmetyczny |
| 4 | + | Plus arytmetyczny | |
| 5 | < | Mniejsze niż. Operator zdefiniowany jest jako: A<B <=> (A<=B-0.000001) |
|
| 6 | > | Większe niż. Operator zdefiniowany jest jako: A>B <=> (A>=B+0.000001) |
|
| 7 | # | Różne. Operator zdefiniowany jest jako: A#B <=> (A<=B-0.000001) | (A>=B+0.000001) |
|
| 8 | = | Równe. Operator zdefiniowany jest jako: A=B <=> (A>B-0.000001) & (A<B+0.000001) |
|
| 9 | & | Logiczne I | |
| 10 | | | Logiczne LUB | |
- Przykłady wyzwalaczy
Przykład 1
Obciążenie procesora jest zbyt duże na www.zabbix.com
{www.zabbix.com:system.cpu.load[all,avg1].last()}>5
'www.zabbix.com:system.cpu.load[all,avg1]' to nazwa skrócona monitorowanego parametru. Określa, że serwerem jest 'www.zabbix.com' a monitorowanym kluczem jest 'system.cpu.load[all,avg1]'. Używając funkcji 'last()', odwołujemy się do ostatniej wartości. Na koniec, '>5' oznacza, że wyzwalacz znajdzie się w stanie PROBLEM za każdym razem, gdy pomiar obciążenia procesora z www.zabbix.com przekroczy 5.
Przykład 2
www.zabbix.com jest przeciążony
{www.zabbix.com:system.cpu.load[all,avg1].last()}>5|{www.zabbix.com:system.cpu.load[all,avg1].min(10m)}>2
Wyrażenie to jest prawdziwe, gdy obciążenie procesora jest większe od 5 lub gdy obciążenie procesora było większe od 2 przez 10 ostatnich minut.
Przykład 3
Zmieniono /etc/passwd
Użyjemy funkcji diff:
{www.zabbix.com:vfs.file.cksum[/etc/passwd].diff()}>0
Wyrażenie jest prawdziwe, gdy poprzednia wartość sumy kontrolnej /etc/passwd będzie różna od aktualnej.
Podobnych wyrażeń można używać do monitorowania zmian w ważnych plikach, takich jak /etc/passwd, /etc/inetd.conf, /kernel, itp.
Przykład 4
Ktoś ściąga duże pliki z internetu
Użyjemy funkcji min:
{www.zabbix.com:net.if.in[eth0,bytes].min(5m)}>100K
Wyrażenie jest prawdziwe, gdy liczba otrzymanych bajtów na eth0 jest większa od 100 KB w przeciągu ostatnich 5 minut.
Przykład 5
Oba węzły klastrowego serwera SMTP nie działają
Zauważ, że używamy dwóch różnych hostów w jednym wyrażeniu:
{smtp1.zabbix.com:net.tcp.service[smtp].last()}=0&{smtp2.zabbix.com:net.tcp.service[smtp].last()}=0
Wyrażenie jest prawdziwe, gdy oba serwery SMTP smtp1.zabbix.com i smtp2.zabbix.com, nie działają.
Przykład 6
Należy zaktualizować agenta Zabbix
Użyjemy funkcji str():
{zabbix.zabbix.com:agent.version.str("beta8")}=1
Wyrażenie jest prawdziwe, gdy agent Zabbix jest w wersji beta8 (na przykład 1.0beta8).
Przykład 7
Serwer jest niedostępny
{zabbix.zabbix.com:icmpping.count(30m,0)}>5
Wyrażenie jest prawdziwe, gdy host "zabbix.zabbix.com" jest niedostępny dłużej niż 5 minut w przeciągu ostatnich 30 minut.
Przykład 8
Brak pulsu w ostatnich 3 minutach
Użyjemy funkcji nodata():
{zabbix.zabbix.com:tick.nodata(3m)}=1
'tick' musi być typu 'Zabbix trapper'. Żeby ten wyzwalacz zadziałał, należy zdefiniować pozycję 'tick'. Host powinien wysyłać okresowo dane dla tego parametru przy użyciu zabbix_sender. Jeżeli w przeciągu 180 sekund nie zostaną odebrane żadne dane, stan wyzwalacza zmieni się na PROBLEM.
Przykład 9
Aktywność CPU w godzinach nocnych
Użyjemy funkcji time():
{zabbix:system.cpu.load[all,avg1].min(5m)}>2&{zabbix:system.cpu.load[all,avg1].time()}>000000&{zabbix:system.cpu.load[all,avg1].time()}<060000
Wyzwalacz może zmienić swój stan jedynie w godzinach nocnych (00:00-06:00).
Przykład 10
Sprawdzenie, czy czas klienta jest zsynchronizowany z czasem serwera Zabbix
Użyjemy funkcji fuzzytime():
{MySQL_DB:system.localtime.fuzzytime(10)}=0
Wyzwalacz zmieni swój stan na problem w przypadku, gdy lokalny czas serwera MySQL_DB i czas serwera Zabbix różnią się więcej niż 10 sekund.
Przykład 11
Porównanie dzisiejszego średniego obciążenia z obciążeniem wczorajszym o
tej samej porze (przy użyciu drugiego parametru przesunięcia_czasu).
{server:system.cpu.load.avg(1h)}/{server:system.cpu.load.avg(1h,1d)}>2
Wyrażenie zadziała jeżeli średnie obciążenie z ostatniej godziny przekroczy dwukrotne średnie obciążenie z godziny z poprzedniego dnia.
- Histereza
Czasami wyzwalacz musi mieć różne warunki dla różnych stanów. Na przykład, chcemy zdefiniować wyzwalacz, który zmieni stan na PROBLEM, gdy temperatura w pokoju serwera przekroczy 20C i powinien w nim pozostać aż temperatura obniży się poniżej 15C.
Żeby to zrobić definiujemy następujący wyzwalacz:
Przykład 1
Temperatura w pokoju serwera jest zbyt wysoka
({TRIGGER.VALUE}=0&{server:temp.last()}>20)|
({TRIGGER.VALUE}=1&{server:temp.last()}>15)
Zauważ, że używamy makra {TRIGGER.VALUE}. Makro zwraca aktualną wartość wyzwalacza.
Przykład 2
Zbyt mało wolnej przestrzeni na dysku
Problem: jest mniej niż 10GB wolnej przestrzeni w ciągu ostatnich 5 minut
Odzyskanie: jest więcej niż 40GB wolnej przestrzeni w ciągu ostatnich 10 minut
({TRIGGER.VALUE}=0&{server:vfs.fs.size[/,free].max(5m)}<10G) |
({TRIGGER.VALUE}=1&{server:vfs.fs.size[/,free].min(10m)}<40G)
Zauważ, że używamy makra {TRIGGER.VALUE}. Makro zwraca aktualną wartość wyzwalacza.