zabbix发送报警的几种方法

最近有个朋友问我zabbix报警怎么做比较简单,灵活,方便。

其实目前zabbix的报警无怪乎下面几种方法:

1.通过action直接调用sendmail一类的脚本,传入zabbix的宏变量,优点:配置比较简单,缺点:缺乏灵活性。

2.通过action调用脚本,传入宏变量,并通过脚本来做后续的处理,这个方法比较简单也比较灵活,大部分情况下都适用。

3.抓取zabbix 数据库里面的报警信息并做报警处理,比如可以通过下面的sql抓取一段时间范围内的报警信息:

selects.host,h.ip,i.key_,a.subject,a.message,t.priority,a.clockfromalertsa,eventse,triggerst,functionsf,itemsi,interfaceh,hostsswherea.eventid=e.eventidande.objectid=t.triggeridandt.triggerid=f.triggeridandi.itemid=f.itemidandi.hostid=h.hostidande.object=’0’ande.source=’0’ands.hostid=i.hostidanda.clock>’xxxx’

这里简单说下第二种方法(对于第二种方法有比较多的扩展,比如通过脚本把消息发送至消息队列中,然后由后端的报警程序消费,后端的报警程序可以做一些扩展的功能,比如结合cmdb来获取业务负责人,机器的维护状态等,这个涉及到一定的开发量,我们这里说下简单的方法):

简单说下想要实现的目标

1)发送的邮件可以做一些基本的判断(比如获取内存使用,cpu使用,,服务器负载等),并增加历史的图形展示

2)根据主机名,item名来判断收件人(属于谁的发送给谁,sample的脚本没有写这个功能)

首先,在action里面的operations设置如下:

注意target list/type,execute on项,以及脚本的参数(注意双引号)

创建报警脚本(写得比较挫,见谅):

#!/usr/bin/python#-*-coding:utf8-*-#zabbixremotecommandimporttime,datetimeimportre,osimportsysimportzabbix_sendmailfromzabbix_sendmailimportSendmailErrorimportsubprocessimportloggingfromlogging.handlersimportRotatingFileHandlerreload(sys)sys.setdefaultencoding(‘utf-8’)LOGFILE=”/apps/svr/zabbix_server/scripts/logs/out.log”MAXLOGSIZE=100*1024*1024BACKUPCOUNT=4log=logging.getLogger(‘zabbix_exec_command’)log.setLevel(logging.DEBUG)formatter=logging.Formatter(‘%(asctime)s-%(levelname)s:%(message)s’)fh=RotatingFileHandler(LOGFILE,maxBytes=MAXLOGSIZE,backupCount=BACKUPCOUNT)ch=logging.StreamHandler()fh.setFormatter(formatter)ch.setFormatter(formatter)log.addHandler(fh)log.addHandler(ch)defget_2hour_ago():a=os.popen(“date+%Y%m%d%H-d’2hoursago'”).readlines()[0]b=a.strip()returnbdefrun_command(ip,command):cmd=”zabbix_get-s”+ip+”-k’system.run[\””+command+”\”]'”returnos.popen(cmd).readlines()mailcontent=””if__name__==”__main__”:to_list=[]to_mobile=[]iflen(sys.argv)!=8:print”showusage:%sserveripitemiditemnamehostnameitemkeyitemvaluetriggerstatus”%(sys.argv[0])sys.exit(1)mailcontent=”””<html><body><metahttp-equiv=”Content-Type”content=”text/html”;charset=utf-8><title>大数据监控邮件</title><styletype=”text/css”>.body{font-size:14px;color:#333;background-color:#fff;}.divtd{color:#E28E40;}</style>”””ip,itemid,itemname,hostname=sys.argv[1],sys.argv[2],sys.argv[3],sys.argv[4]itemkey,itemvalue,triggerstatus=str(sys.argv[5]).replace(“”,””),str(sys.argv[6]).replace(“”,””),sys.argv[7]log.info(“报警信息:IP:%s,监控项:%s,主机名:%s,监控key:%s”%(ip,itemname,hostname,itemkey))time_start=get_2hour_ago()mailcontent+=”<divclass=’divtd’>监控项:%s,主机名:%s,IP:%s,当前值:%s</div><br/>”%(itemname,hostname,ip,itemvalue)mailcontent+=”<divclass=’divtd’>内存信息:</div><divclass=’.body’>”forlineinrun_command(ip,”free-m”):line=line.strip()mailcontent+=”%s<br/>”%linemailcontent+=”<br/></div>”mailcontent+=”<divclass=’divtd’>IO信息:</div><divclass=’.body’>”forlineinrun_command(ip,”iostat-xn11″):line=line.strip()mailcontent+=”%s<br/>”%linemailcontent+=”<br/></div>”mailcontent+=”<divclass=’divtd’>负载信息:</div><divclass=’.body’>”forlineinrun_command(ip,”sar-q13″):line=line.strip()mailcontent+=”%s<br/>”%linemailcontent+=”<br/></div>”mailcontent+=”<divclass=’divtd’>CPU信息:</div><divclass=’.body’>”forlineinrun_command(ip,”mpstat-PALL”):line=line.strip()mailcontent+=”%s<br/>”%linemailcontent+=”<br/></div>”mailcontent+=”<divclass=’divtd’>系统日志:</div><divclass=’.body’>”forlineinrun_command(ip,”/usr/bin/sudotail-20/var/log/messages”):line=line.strip()mailcontent+=”%s<br/>”%linemailcontent+=”<br/></div>”to_list=[“xxxx”]mailcontent+=”<divclass=’divtd’>历史数据:</div><divclass=’.body’>”mailcontent+=”<tablestyle=’border-collapse:collapse;width:96%;’>”mailcontent+=”””<tr><imgsrc=http://xxxxxx/chart.php?itemid=%s&period=7200&stime=%swidth=”871″height=”305″/>”””%(itemid,time_start)mailcontent+=”</tr></table>”mailcontent+=”””</html></body>”””printmailcontentlog.debug(“监控邮件内容:%s”%mailcontent)log.info(“邮件收件人:%s,短信收件人列表:%s”%(to_list,to_mobile))mail_sub=”Zabbix监控报警|当前状态:%s,监控项:%s,监控主机:%s”%(triggerstatus,itemname,hostname)log.info(“开始发送邮件,邮件主题:%s”%mail_sub)try:zabbix_sendmail.send_mail_withoutSSL(to_list,mail_sub,mailcontent)log.info(“报警邮件发送成功”)exceptSendmailError,e:log.error(“报警邮件发送失败,失败信息:%s”%(str(e)))走马观花之外,这才是深入体验,探索自我的最佳时间,

zabbix发送报警的几种方法

相关文章:

你感兴趣的文章:

标签云: