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表,我们可以快速定位到某个告警短信是匹配到具体的那个动作组才触发的,从而可以快速的定位到对应的动作规则是不是有异常。