由于报警短信、邮件太多导致运维人员精神高度紧张、时间长了容易对重要告警忽略,引起不必要的麻烦。为了解决这个问题我在网上开始搜索告警收敛相关的文章尝试解决,最终受益于"简述"大神的这篇文章 "zabbix 告警 | 告警收敛" 的思路,于是基于大神的代码进行了部分修改并已应用于我们公司环境中一年以上。
下面为大家分享下整体的流程以及代码。
一、架构图
①产生的所有告警均由zabbix的actions调用脚本推入缓存redis当中;
②脚本将每分钟(crontab)去redis中拉取数据,根据定义好的一系列规则进行分析、合并;
③根据预先定义好的规则将报警通过定义好的方式发送给相关人员;
![](https://img.haomeiwen.com/i6840999/d2f2ac64b0a907d8.png)
二、设置Zabbix
1. 配置Media types
- 仅传递 subject
- 我这里定义了3个Mediatype 分别用于发送邮件、短信、企业微信(具体可自行调整) (3个除了Name不一样之外其他配置(Script name/Script parameters)保持一致)
-
脚本 “zabbix-police/police.py” 主要功能是将Subject(Eventid)写入Redis,后面会写到
Media type 配置
多个Media types
2. 配置Actions
- 我这里以每个Trigger severity一个Actions举例。(可以根据不同的HostGroup或者其他条件自行配置多个actions)
- Default subject 之所以用 "{EVENT.ID}_1、{EVENT.ID}_0"为的是保持唯一性,1代表故障、0代表恢复
- Default sbject
{EVENT.ID}_1
- Default message
triggervalue|{TRIGGER.VALUE}
hostname|{HOSTNAME1}
ipaddress|{IPADDRESS}
hostgroup|{TRIGGER.HOSTGROUP.NAME}
triggerstatus|{TRIGGER.STATUS}
triggerseverity|{TRIGGER.SEVERITY}
triggername|{TRIGGER.NAME}
triggerkey|{TRIGGER.KEY1}
triggeritems|{ITEM.NAME}
itemvalue|{ITEM.VALUE}
eventid|{EVENT.ID}
action|{ACTION.NAME}
eventage|{EVENT.AGE}
eventtime|{EVENT.DATE} {EVENT.TIME}
- Recovery subject
{EVENT.ID}_0
- Recovery message
triggervalue|{TRIGGER.VALUE}
hostname|{HOSTNAME1}
ipaddress|{IPADDRESS}
hostgroup|{TRIGGER.HOSTGROUP.NAME}
triggerstatus|{TRIGGER.STATUS}
triggerseverity|{TRIGGER.SEVERITY}
triggername|{TRIGGER.NAME}
triggerkey|{TRIGGER.KEY1}
triggeritems|{ITEM.NAME}
itemvalue|{ITEM.VALUE}
eventid|{EVENT.ID}
action|{ACTION.NAME}
eventage|{EVENT.AGE}
eventtime|{EVENT.DATE} {EVENT.TIME}
![](https://img.haomeiwen.com/i6840999/e0b7ec8cc74a3e94.png)
![](https://img.haomeiwen.com/i6840999/358cc0018d2f9d37.png)
![](https://img.haomeiwen.com/i6840999/d671fa5034d09cbd.png)
![](https://img.haomeiwen.com/i6840999/5dbf6e040c89b9fa.png)
三、配置 Zabbix 服务器
1. 安装环境
#下载代码
/etc/zabbix/alertscripts
git clone https://github.com/sungaomeng/zabbix-police.git
#安装依赖
yum install gcc python-devel
pip install -r zabbix-police/requirements.txt
2. 脚本
#文件分布
[root@zabbix-server01 alertscripts]# tree zabbix-police
zabbix-police
├── police.py #Action调用此函数, 用于将EventID写入Redis
├── allpolice.py #综合函数, 总入口, 用于整合其他脚本, 定时被Crontab调用
├── dbread.py #数据库查询函数, 用于查询Redis、Mysql, 获取EventID、获取告警具体信息、Mediatype脚本对应关系、查询告警接收人等信息
├── police.conf #定义配置文件, 包括mysql、redis、wechat、email、sms、logfile等配置
├── modconf.py #加载配置函数, 用于加载配置文件
├── operation.py #操作函数, 用于1. 接收dbread.py返回的告警、恢复信息, 进行合并、压缩处理, 并返回处理结果 2. 定义各告警发送调用函数
├── send_wechat.py #告警发送-微信函数
├── send_sms.py #告警发送-短信函数
├── send_email.py #告警发送-邮件函数
├── requirements.txt #依赖
└── README.md
3. Crontab
[root@zabbix-server01 zabbix-police]# crontab -l
* * * * * /usr/bin/python /etc/zabbix/alertscripts/zabbix-police/allpolice.py
四、告警效果
![](https://img.haomeiwen.com/i6840999/51ce6a1e78579a96.png)
![](https://img.haomeiwen.com/i6840999/75da6dcdc1b5e56e.png)
![](https://img.haomeiwen.com/i6840999/8fffe6cdf32a80af.png)
网友评论