zabbix 一篇很好的講表達式的博文

觸發器中的表達式使用很靈活,咱們能夠建立一個複雜的邏輯測試監控,觸發器表達式形式以下:node

{<server>:<key>.<function>(<parameter>)}<operator><constant>express

{主機:key.函數(參數)}<表達式>常數,具體的例子,請接着往下走,很簡單服務器


Functions函數app


觸發器functions能夠引用檢索到的值,當前時間或者其餘元素。觸發器表達式支持的function完整列表請點擊官網地址 supported functionstcp


Function參數函數


大多數數值functions可使用秒來做爲參數。你可使用前綴「#」來表示它有不一樣的含義測試


FUNCTION CALL 描述spa

sum(600) 600秒內的總和server

sum(#5) 最新5個值的和it

last函數使用不一樣的參數將會獲得不一樣的值,#2表示倒數第二新的數據。例入從老到最新值爲1,2,3,4,5,6,7,8,9,10,last(#2)獲得的值爲9,last(#9)獲得的值爲2。last函數必須包含參數。

AVG,count,last,min和max函數還支持額外的參數,以秒爲單位的參數time_shift(時間偏移量)。例如avg(1h,1d),那麼將會獲取到昨天的1小時內的平均數據。


[warning]備註:觸發器表達式須要使用history歷史數據來計算,若是history不可用(time_shift時間偏移量參數沒法使用),所以history記錄必定要保留長久一點,至少要保留須要用的記錄。[/warning]

觸發器表達式可使用單位符號來替代大數字,例如5m替代300,或者1d替代86400,1k替代1024字節等等。


操做符


優先級 操做 定義

1 /

2 *

3 -

4 +

5 < 小於. 用法以下:

A<B ⇔ (A<=B-0.000001)

6 > 大於. 用法以下:

A>B ⇔ (A>=B+0.000001)

7 # 不等於.用法以下:

A#B ⇔ (A<=B-0.000001) | (A>=B+0.000001)

8 = 等於. T用法以下:

A=B ⇔ (A>B-0.000001) & (A<B+0.000001)

9 & 邏輯與

10 | 邏輯或

 


 


 


觸發器示例


示例一


觸發器名稱:Processor load is too high on www.zabbix.com


{www.zabbix.com:system.cpu.load[all,avg1].last(0)}>5

觸發器說明:


www.zabbix.com:host名稱


system.cpu.load[all,avg1]:item值,一份內cpu平均負載值


last(0):最新值


>5:最新值大於5


如上所示,www.zabbix.com這個主機的監控項,最新的CPU負載值若是大於5,那麼表達式會返回true,這樣一來觸發器狀態就改變爲「problem」了。


示例二


觸發器名稱:www.zabbix.com is overloaded


{www.zabbix.com:system.cpu.load[all,avg1].last(0)}>5|{www.zabbix.com:system.cpu.load[all,avg1].min(10m)}>2

當前cpu負載大於5或者最近10份內的cpu負載大於2,那麼表達式將會返回true.


示例三


觸發器名稱:/etc/passwd has been changed


使用函數 diff():


{www.zabbix.com:vfs.file.cksum[/etc/passwd].diff(0)}>0

/etc/passwd最新的checksum與上一次獲取到的checksum不一樣,表達式將會返回true. 咱們可使用一樣的方法監控系統重要的配置文件,例如/etc/passwd,/etc/inetd.conf等等。這些zabbix通常都會自帶,沒帶的你本身加上吧。


示例四


觸發器名稱:Someone is downloading a large file from the Internet


使用函數 min:


{www.zabbix.com:net.if.in[eth0,bytes].min(5m)}>100K

當前主機網卡eth0最後5分鐘內接收到的流量超過100KB那麼觸發器表達式將會返回true


示例五


觸發器名稱:Both nodes of clustered SMTP server are down


{smtp1.zabbix.com:net.tcp.service[smtp].last(0)}=0&{smtp2.zabbix.com:net.tcp.service[smtp].last(0)}=0

當smtp1.zabbix.com和smtp2.zabbix.com兩臺主機上的SMTP服務器都離線,表達式將會返回true.


示例六


觸發器名稱:Zabbix agent needs to be upgraded


使用函數str():


{zabbix.zabbix.com:agent.version.str("beta8")}=1

若是當前zabbix agent版本包含beta8(假設當前版本爲1.0beta8),這個表達式會返回true.


示例七


觸發器名稱:Server is unreachable


{zabbix.zabbix.com:icmpping.count(30m,0)}>5

如上表達式表示最近30分鐘zabbix.zabbix.com這個主機超過5次不可到達。


示例八


觸發器名稱:No heartbeats within last 3 minutes


使用函數 nodata():


{zabbix.zabbix.com:tick.nodata(3m)}=1

tick爲Zabbix trapper類型,首先咱們要定義一個類型爲Zabbix trapper,key爲tick的item。咱們使用zabbix_sender按期發送數據給tick,若是在3分鐘內還未收到zabbix_sender發送來的數據,那麼表達式返回一個true,與此同時觸發器的值變爲「PROBLEM」。


示例九


觸發器名稱:CPU activity at night time


使用函數 time():


{zabbix:system.cpu.load[all,avg1].min(5m)}>2&{zabbix:system.cpu.load[all,avg1].time(0)}>000000&{zabbix:system.cpu.load[all,avg1].time(0)}<060000

只有在凌晨0點到6點整,最近5分鐘內cpu負載大於2,表達式返回true,觸發器的狀態變動爲「problem」


示例十


觸發器名稱:Check if client local time is in sync with Zabbix server time


使用函數 fuzzytime():


{MySQL_DB:system.localtime.fuzzytime(10)}=0

主機MySQL_DB當前服務器時間若是與zabbix server之間的時間相差10秒以上,表達式返回true,觸發器狀態改變爲「problem」


示例十一


觸發器名稱:Comparing average load today with average load of the same time yesterday (使用 time_shift 時間偏移量參數).


{server:system.cpu.load.avg(1h)}/{server:system.cpu.load.avg(1h,1d)}>2

This expression will fire if the average load of the last hour tops the average load of the same hour yesterday more than two times.


Hysteresis(遲滯,滯後)


簡單的說觸發器狀態轉變爲problem須要一個條件,從problem轉變回來還須要一個條件才行。通常觸發器只須要不知足觸發器爲problem條件便可恢復。明白了麼?不明白就看例子吧。

有時候觸發器須要使用不一樣的條件來表示不一樣的狀態,舉個官網頗有趣的例子:機房溫度正常穩定爲15-20°,當溫度超過20°,觸發器值爲problem,當問題到了15°與20°之間,異常會解除。別整這些沒用的,咱們看實例.


爲了達到這個效果,咱們須要使用以下觸發器表達式:


示例1


觸發器名稱:Temperature in server room is too high


({TRIGGER.VALUE}=0&{server:temp.last(0)}>20)|

 ({TRIGGER.VALUE}=1&{server:temp.last(0)}>15)

如上有兩個小括號,前面一個表示觸發異常的條件,後面一個表達式表示解除異常的條件。


注意:宏變量 {TRIGGER.VALUE}將會返回當前觸發器的值


示例2


觸發器名稱:Free disk space is too low


Problem: 最近5分鐘剩餘磁盤空間小於10GB。(異常)


Recovery: 最近10分鐘磁盤空間大於40GB。(恢復)


簡單說即是一旦剩餘空間小於10G就觸發異常,而後接下來剩餘空間必須大於40G才能解除這個異常,就算你剩餘空間達到了39G(不在報警條件裏)那也是沒用的,有意思不!


({TRIGGER.VALUE}=0&{server:vfs.fs.size[/,free].max(5m)}<10G) |

 ({TRIGGER.VALUE}=1&{server:vfs.fs.size[/,free].min(10m)}<40G)

相關文章
相關標籤/搜索