zabbix告警郵件、短信發送錯誤快速排查方法
背景
zabbix告警郵件、短信經常有同事反饋發送錯誤的情況,這個問題排查的角度很多,那么最快捷的角度是什么呢?
在我看來,最快的角度就是判斷這個告警郵件或者短信是從從哪個觸發器觸發的,找到對應的觸發器自然很容易定位是否是告警規則設置的問題。
數據庫alerts表
這個之前也介紹過alerts 表,記錄了zabbix系統中所有的告警發送記錄,即理論上任何一個告警短信、郵件均會在該表留下記錄的。
mysql> desc alerts; +-------------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+---------------------+------+-----+---------+-------+ | alertid | bigint(20) unsigned | NO | PRI | 0 | | | actionid | bigint(20) unsigned | NO | MUL | 0 | | | eventid | bigint(20) unsigned | NO | MUL | 0 | | | userid | bigint(20) unsigned | NO | MUL | 0 | | | clock | int(11) | NO | PRI | 0 | | | mediatypeid | bigint(20) unsigned | NO | MUL | 0 | | | sendto | varchar(100) | NO | | | | | subject | varchar(255) | NO | | | | | message | blob | NO | | NULL | | | status | int(11) | NO | MUL | 0 | | | retries | int(11) | NO | | 0 | | | error | varchar(128) | NO | | | | | nextcheck | int(11) | NO | | 0 | | | esc_step | int(11) | NO | | 0 | | | alerttype | int(11) | NO | | 0 | | +-------------+---------------------+------+-----+---------+-------+
如何利用alerts表?
熟悉了表結構其他的就很簡單了,直接使用sql查詢對應的告警郵件、短信的時間(unix時間戳)和郵箱(或者手機號)等即可查詢這個時間范圍內的匹配告警。
例如我這里的sql就是查詢這一段時間內所有發送給張同學的告警郵件。
mysqll> select * from alerts where clock >=1403851879 and clock < = 1403851895 and sendto='zhangs**zhi@letv.com' \G

結果中有兩個使我們比較關心的,userid和actionid。
userid指的是users表中對應的用戶ID,根據用戶ID我們可以查詢對應的用戶名。而actionid則是可以查詢到對應的動作組。
我們先查詢下userid看下是不是正確的:
根據用戶userid查詢對應的用戶
查詢結果如下:

可以看得出來,對應的227的userid確實是張同學的帳號。
根據actionid查詢對應的動作組
我們再看下這個告警郵件究竟是由那個動作(action)觸發的呢?

查詢到的結果就是因為那個動作觸發的這個告警,這里顯示的是在郵件告警-李*這個動作組,那么肯定是張同學在對應的組,才會有告警郵件的發送的。
前台確認
在zabbix系統前台查詢對應的告警組:

發現張同學確實是在這個組,而且設置了對應的規則。
將他從這個組中刪除掉,問題就解決了。
總結
利用數據庫alerts表,我們可以快速定位到某個告警短信是匹配到具體的那個動作組才觸發的,從而可以快速的定位到對應的動作規則是不是有異常。
