Zabbix提供強大的觸發器(Trigger)函數以方便進行更為靈活的報警及后續動作,具體觸發器函數可以訪問https://www.zabbix.com/documentation/2.0/manual/appendix/triggers/functions, 之前也有翻譯本文章,地址為: http://pengyao.org/zabbix-triggers-functions.html
今天用實例來說明常見的監控需求,應該如何來編寫Trigger表達式. 主人公就暫且叫做"綠肥"吧.
前奏
"綠肥,別整天就知道聊QQ,也關注下服務器運行情況吧." 老大頗不滿意的說.
"哦",綠肥只好先應承下來
“關注服務器? 咋關注?” 絞盡腦汁,聽說有個監控神器叫zabbix, 按照手冊里邊說的部署上了zabbix、將"test-01"服務器也安裝了agent, 添加了"agent.ping" item用來測試agent是否可以連通; "system.uptime" item用來收集主機運行時間; “system.cpu.util[,idle]” item用來收集CPU空閑百分比.
收集完這些值,通過simple graph能看到運行狀況,老大似乎很滿意. 但接下來的一天, 主機不知道什么時候重啟了,老大劈頭蓋臉的說“機器重啟了都不知道?要這個監控有什么用?”
看來是時候學習下zabbix trigger了,看下什么情況下觸發報警.
Zabbix Trigger實例
"得,還是先學習下怎么判斷機器是否重啟了吧",綠肥喃喃的說
system.uptime映入眼簾,這個item是采集主機運行時間的,一直累加的計數器,如果當前采集值小於上一次的采集值,那就意味着機器重啟了
怎么判斷當前值小於上一次哪? 查詢手冊發現change函數, 看來對應的Trigger表達式是:
{test-01:system.uptime.change(0)}<0
表達式加上后,配合上默認的Action規則,手動重啟了下服務器,真的告警的耶,綠肥愉快的笑了起來.
直到又一天的到來......
這天機器重啟了,因為硬盤故障, 結果系統沒起來, 直到老大發現......
"哎,又挨了一通訓", 不過的確是工作不到位,系統沒啟動都不知道,這工作做得真叫一個差
"怎么搞",agent.ping映入了眼簾,看來得拿它"出出氣"了,ping不通都不告訴我,哼,不整治你整治誰
"系統沒起來,也就意味着zabbix agent沒啟動起來,沒啟動起來,那就是說我大zabbix server根本取不到agent的數據,那么該用哪個函數那?", "nodata",對,就是它,寫出來的表達式是這樣的:
{test-01:agent.ping.nodata(3m)}=1
三分鍾取不到agent.ping的值,那也就是說agent宕了或者服務器掛了,不錯,不錯.
直到又一天的到來......
"什么情況,怎么網站打開這么慢?" 老大在那里嘟囔着
趁機看了下CPU使用率,我擦,已經持續一小時CPU 100%滿負荷運行了,看來隔壁研發小妹又寫了個死循環,不過我是不是得增加個CPU的報警?
說干就干,既然是CPU有問題,那就從CPU下手,之前增加過"system.cpu.util[,idle]"的item,這次就寫個trigger, 寫出來的trigger是這個樣子:
{test-01:system.cpu.util[,idle].last(0)}<20
也就是說如果cpu空閑小於20%即CPU占用超過80%立即觸發報警,嘿嘿,看來不錯
一天過去了,郵箱里增加了幾百封關於"CPU使用率超過80%的郵件",查詢一看,CPU使用率總是冒個尖就馬上就下來了,看來它把這里當城門了,這里用last(0)有點不靠譜,那么該用哪個函數哪? 還得好好翻翻手冊.
"最近幾分鍾,最近幾分鍾,最近幾分鍾",綠肥若有所思的自言自語着......
{test-01:system.cpu.util[,idle].avg(3m)}<20
連續三分鍾CPU使用率平均值超過80%觸發報警, 有沒有更狠一點的,三分鍾CPU使用率持續在80%以上觸發報警
{test-01:system.cpu.util[,idle].max(3m)}<20
連續三分鍾CPU空閑率中的最大值小於20%即每一個值都小於20%,對應的是就是CPU使用率全部都在80%以上,看來這個的確更狠一點.
似乎還有點不妥,發現CPU占用率在79.9%左右竟然也給我報OK,不爽,不爽, 看來需求得調整為"連續三分鍾CPU使用率超過80%觸發報警,如果連續三分鍾CPU使用率低於50%才認為恢復正常"
手冊里邊有個"TRIGGER.VALUE"宏,看來得從這里下下手.
TRIGGER.VALUE對應的為Trigger狀態,0代表OK, 1代表Problem,分解下需求:
-
正常情況下連續三分鍾CPU使用率超過80%,看起來表達式是:
{TRIGGER.VALUE}=0&{test-01:system.cpu.util[,idle].max(3m)}<20
-
故障時連續三分鍾CPU使用率低於50%恢復正常,即故障時刻CPU使用率持續三分鍾高於50%依然為故障,表達式是這個樣子的:
{TRIGGER.VALUE}=1&{test-01:system.cpu.util[,idle].min(3m)}<50
然后整合下表達式,就成了下邊這個樣子:
({TRIGGER.VALUE}=0&{test-01:system.cpu.util[,idle].max(3m)}<20) | ({TRIGGER.VALUE}=1&{test-01:system.cpu.util[,idle].min(3m)}<50)
不錯,不錯,看起來多高端,頗有成就感!