觸發器中的表達式使用很靈活,咱們能夠建立一個複雜的邏輯測試監控,觸發器表達式形式以下: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)