zabbix进阶:一分钟实现zabbix告警抑制

本文档主要讲解实现zabbix告警抑制的思路及配置方法

一、场景模拟

小刘是某国内知名IT企业的运维工程师。他们公司使用zabbix监控设备性能情况。但是最近他们公司的网络设备需要进行升级替换,导致经常出现大量的邮件告警,对此小刘感到很头痛,下面就由我们用一分钟来告诉他怎么解决这个问题吧。

二、实现原理

环境说明:

zabbix版本:Zabbix6.0

操作系统:centos7.9

开发语言:python3

三、实现步骤

注意:本文档主要讲解实现思路及配置方法,具体邮件发送方式可自行编写对应的脚本

编写一个python脚本,用于邮件发送,及统计邮件发送的次数。然后通过定时任务crontab+最大发送的条数配置文件、当前发送的条数配置文件,实现zabbix告警抑制

第一步:编写邮件发送及统计次数脚本

告警脚本存于zabbix_server的这个路径,具体路径可查看zabbix_server.conf文件。

qxn6y07X67636e9cc314b.png

脚本命名alerts_limit.py、脚本内容如下

#!/usr/bin/env python3

#_*_ coding:utf-8 _*_
#导入python库
import sys
import os.path
#发送邮件
"""
参数1:发送人邮箱
参数2:邮件标题
参数3:邮件内容
"""
def sendemail(senduser,sendtitle,sendcontent):
       with open('/tmp/sendhistory.log','a',encoding='utf-8') as f:
           f.write('告警标题:{0},发信人:{1},告警内容:{2}\n'.format(senduser,sendtitle,sendcontent))
if __name__ == '__main__':
   #当前发送的配置文件、最大的发送的告警条数
   currentsend_path = '/tmp/currentsend.conf'
   maxsend_path = '/tmp/maxsend.conf'
   #发件人,发件标题,发件内容
   senduser = sys.argv[1]
   sendtitle = sys.argv[2]
   sendcontent = sys.argv[3]
   #获取当前发送的告警条数,默认值0
   if os.path.exists(currentsend_path):
      with open(currentsend_path,'r',encoding='utf-8') as f:
          currentsend_num = int(f.read().strip())
          currentsend_num+=1
      #发一次就加一次
      with open(currentsend_path,'w',encoding='utf-8') as f:
          f.write(str(currentsend_num))
   else:
      with open(currentsend_path,'w',encoding='utf-8') as f:
          f.write('0')
          currentsend_num=0
   #获取最大的发送的告警条数,默认值50
   if os.path.exists(maxsend_path):
      with open(maxsend_path,'r',encoding='utf-8') as f:
          maxsend_num = int(f.read().strip())
   else:
      with open(currentsend_path,'w',encoding='utf-8') as f:
          f.write('100')
          currentsend_num=100
   #判断是否超过发送邮件的次数
   if currentsend_num < maxsend_num:
      #发送邮件
      sendemail(senduser,sendtitle,sendcontent)
   elif currentsend_num == maxsend_num:
       sendemail(senduser,'告警超过限制的发送条数','当前告警发送邮件已停止,请登录zabbix查看具体告警')

上述脚本存在一个问题,如果用户不手动删除/tmp/currentsend.conf这个文件或者把/tmp/currentsend.conf。那么zabbix产生的告警将会不发送邮件通知。如果要实现比如告警发送自动恢复的话,只需要添加定时任务即可。举例说明

比如我要5分钟内,邮件告警不能超过50条

那么只需要,定时任务添加,并把/tmp/maxsend.conf修改成50即可

*/5 * * * * echo ‘0’ >/tmp/maxsend.conf

比如我要1分钟内,如果邮件告警不能超过30条

那么只需要,定时任务添加,并把/tmp/maxsend.conf修改成30即可

* * * * * echo ‘0’ >/tmp/maxsend.conf

第二步:配置zabbix的告警

dT0Gl5Ir67636ef21947f.png

WoJWp2ty67636f012b9e6.png

hpf2Hpuq67636f0d88ccf.png

ownojsEt67636f1a6eb5f.png

Bx8HvkvX67636f257071f.png

8salYUX367636f3118d6d.png

F3gEY2Oj67636f3cdb8ed.png

四、成果演示

为了方便演示,我们使用采集器监控项进行模拟告警

注意:maxsend.conf、currentsend.conf、alerts_limit.py都必须为zabbix_server的服务用户创建,否则可能出现权限问题,导致无法限制

演示1:(实际生产环境一般不用,仅用于调试脚本)

告警超过限制10条通知后,告警不会自动恢复发送邮件通知,需人工手动操作

修改/tmp/maxsend.conf文件里面的值为10

Jr6NY1IL67636f667d56c.png

如下图,我们模拟了产生了超过10个告警。产生16个告警。

pSFuprKa67636f739c531.png

验证我们的sendmail的调用次数。查看/tmp/sendhistory查看邮件发送的记录。正常来说,currentsend.conf应该为16当前告警数。然后/tmp/sendhistory应该只有9条告警内容和1条告警限制的通知

F8fyybZk67636f88e3217.png

符合预期效果

zvcVTx9167636f94516a8.png

进一步验证

我再产生多16条告警。再查看/tmp/sendhistory是否还是只有10条发邮件的调用历史,同时/tmp/currentsend.conf的数应为32

gmdzGPnE67636fa0a1d81.png

7IAehVVH67636fb1cb553.png

如下图,没有调用发送邮件的动作

lQXQysKX67636fbfd88e7.png

如果我这时候,我再把/tmp/currentsend.conf的值该为0,则正常情况产生16个告警数后,/tmp/currentsend.conf为16,而/tmp/sendhistory.log应该有20条通知

qC1bDDql67636fcf4a4e9.pngRWQA3tnR67636fdc0829d.png

Ygft9QHE67636fea3cb70.png

符合实际需求

hMniAISV67636ff5dcb5a.png

演示2:(实际生产环境使用)

配置定时任务1分钟不能超过10条邮件通知

修改/tmp/maxsend.conf为10

aLW6S08U6763700555588.png

配置定时任务,每分钟把当前告警数设置为0

uVgpaS1h676370131f5a6.png

验证效果

KsLgWMEm6763701f37cda.png

0m2fIjIq67637042e7887.png

如下图,1分钟内。当前告警数持续增加。而邮件发送通知数,始终只是10条记录

E0oGdTlE6763704f5051b.png

到了下一分钟后,告警通知次数为20。当前告警数为重新计算

16j1qoWc6763705de4f60.png

验证效果:如果限制邮件通知成功,当前告警平台告警数应为64个,而邮件通知记录个数应该为20。因为一分钟限制发送邮件次数为10条。两分钟内,产生了64个告警,但是发送邮件历史为20

u4FTQUa96763706e7acf9.png

GoLOLE6a6763707a31c82.png

注意:如果刚好是每分钟58-59秒产生的大量告警,可能会出现发送邮件超过每分钟10条这个限制(可能会多几条告警)

0 条评论

请先 登录 后评论
乐维君
乐维君

410 篇文章

作家榜 »

  1. 乐维君 410 文章
  2. YOHOHO 14 文章
  3. 机灵小和尚 13 文章
  4. 细雨闲花 12 文章
  5. 我是一只小菜鸡 12 文章
  6. 。。。 9 文章
  7. 御前侍卫张五哥 9 文章
  8. 小黄人 8 文章