zabbix发送报警的几种方法 推荐
2014-06-18 00:08
309 查看
最近有个朋友问我zabbix报警怎么做比较简单,灵活,方便。
其实目前zabbix的报警无怪乎下面几种方法:
1.通过action直接调用sendmail一类的脚本,传入zabbix的宏变量,优点:配置比较简单,缺点:缺乏灵活性。
2.通过action调用脚本,传入宏变量,并通过脚本来做后续的处理,这个方法比较简单也比较灵活,大部分情况下都适用。
3.抓取zabbix 数据库里面的报警信息并做报警处理,比如可以通过下面的sql抓取一段时间范围内的报警信息:
简单说下想要实现的目标
1)发送的邮件可以做一些基本的判断(比如获取内存使用,cpu使用,服务器负载等),并增加历史的图形展示
2)根据主机名,item名来判断收件人(属于谁的发送给谁,sample的脚本没有写这个功能)
首先,在action里面的operations设置如下:
注意target list/type,execute on项,以及脚本的参数(注意双引号)
创建报警脚本(写得比较挫,见谅):
关于报警问题的debug:
1.看看trigger有没有正常触发(dashboard上有没有对应的action)
2.发送报警的命令运行是否正常(手动验证)
3.结合server的日志和zabbix的数据库debug(比较常用的是alerts表)
其实目前zabbix的报警无怪乎下面几种方法:
1.通过action直接调用sendmail一类的脚本,传入zabbix的宏变量,优点:配置比较简单,缺点:缺乏灵活性。
2.通过action调用脚本,传入宏变量,并通过脚本来做后续的处理,这个方法比较简单也比较灵活,大部分情况下都适用。
3.抓取zabbix 数据库里面的报警信息并做报警处理,比如可以通过下面的sql抓取一段时间范围内的报警信息:
select s.host,h.ip,i.key_,a.subject,a.message,t.priority,a.clock from alerts a,events e, triggers t,functions f,items i,interface h,hosts s where a.eventid=e.eventid and e.objectid=t.triggerid and t.triggerid=f.triggerid and i.itemid=f.itemid and i.hostid=h.hostid and e.object='0' and e.source='0' and s.hostid=i.hostid and a.clock > 'xxxx'这里简单说下第二种方法(对于第二种方法有比较多的扩展,比如通过脚本把消息发送至消息队列中,然后由后端的报警程序消费,后端的报警程序可以做一些扩展的功能,比如结合cmdb来获取业务负责人,机器的维护状态等,这个涉及到一定的开发量,我们这里说下简单的方法):
简单说下想要实现的目标
1)发送的邮件可以做一些基本的判断(比如获取内存使用,cpu使用,服务器负载等),并增加历史的图形展示
2)根据主机名,item名来判断收件人(属于谁的发送给谁,sample的脚本没有写这个功能)
首先,在action里面的operations设置如下:
注意target list/type,execute on项,以及脚本的参数(注意双引号)
创建报警脚本(写得比较挫,见谅):
#!/usr/bin/python # -*- coding: utf8 -*- #zabbix remote command import time,datetime import re,os import sys import zabbix_sendmail from zabbix_sendmail import SendmailError import subprocess import logging from logging.handlers import RotatingFileHandler reload(sys) sys.setdefaultencoding('utf-8') LOGFILE = "/apps/svr/zabbix_server/scripts/logs/out.log" MAXLOGSIZE = 100*1024*1024 BACKUPCOUNT = 4 log = 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) def get_2hour_ago(): a = os.popen("date +%Y%m%d%H -d '2 hours ago'").readlines()[0] b = a.strip() return b def run_command(ip,command): cmd = "zabbix_get -s " + ip + " -k 'system.run[\"" + command + "\"]'" return os.popen(cmd).readlines() mailcontent = "" if __name__ == "__main__": to_list = [] to_mobile = [] if len(sys.argv) != 8: print "show usage: %s serverip itemid itemname hostname itemkey itemvalue triggerstatus" % (sys.argv[0]) sys.exit(1) mailcontent = """ <html> <body> <meta http-equiv="Content-Type" content="text/html";charset=utf-8> <title>大数据监控邮件</title> <style type="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 += "<div class='divtd'> 监控项:%s , 主机名:%s ,IP:%s ,当前值: %s </div><br />" % (itemname,hostname,ip,itemvalue) mailcontent += "<div class='divtd'>内存信息:</div> <div class='.body'>" for line in run_command(ip,"free -m"): line=line.strip() mailcontent += "%s<br />" % line mailcontent += "<br /></div>" mailcontent += "<div class='divtd'>IO信息:</div> <div class='.body'>" for line in run_command(ip,"iostat -xn 1 1"): line=line.strip() mailcontent += "%s<br />" % line mailcontent += "<br /></div>" mailcontent += "<div class='divtd'>负载信息:</div> <div class='.body'>" for line in run_command(ip,"sar -q 1 3"): line=line.strip() mailcontent += "%s<br />" % line mailcontent += "<br /></div>" mailcontent += "<div class='divtd'>CPU信息:</div> <div class='.body'>" for line in run_command(ip,"mpstat -P ALL"): line=line.strip() mailcontent += "%s<br />" % line mailcontent += "<br /></div>" mailcontent += "<div class='divtd'>系统日志:</div> <div class='.body'>" for line in run_command(ip,"/usr/bin/sudo tail -20 /var/log/messages"): line=line.strip() mailcontent += "%s<br />" % line mailcontent += "<br /></div>" to_list = ["xxxx"] mailcontent += "<div class='divtd'>历史数据:</div> <div class='.body'>" mailcontent += "<table style='border-collapse: collapse; width: 96%;'>" mailcontent += """<tr><img src=http://xxxxxx/chart.php?itemid=%s&period=7200&stime=%s width="871" height="305"/>""" % (itemid,time_start) mailcontent += "</tr> </table>" mailcontent += """</html> </body>""" print mailcontent log.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("报警邮件发送成功") except SendmailError,e: log.error("报警邮件发送失败,失败信息:%s"%(str(e)))其中zabbix_sendmail的内容如下:
#!/usr/bin/python # -*- coding: utf8 -*- #to send zabbix alert mail import smtplib from email.mime.text import MIMEText import traceback import exceptions import sys reload(sys) sys.setdefaultencoding('utf-8') mail_host = "xxxxx" mail_user = "xxxx" mail_pass = "xxxx" mail_address = "xxx" mail_postfix="xxxx" mail_port="xxx" class SendmailError(Exception): def __init__(self, errorlog): self.errorlog = errorlog def __str__(self): return "发送邮件错误,错误信息: %s" % (self.errorlog) def send_mail_withoutSSL(to_list,sub,content): me = "BI Monitor" + "<"+mail_user+"@"+mail_postfix+">" msg = MIMEText(content,'html','utf8') msg['Subject'] = sub msg['From'] = me msg['To'] = ";".join(to_list) try: s = smtplib.SMTP() s.connect(mail_host) s.login(mail_user,mail_pass) s.sendmail(me, to_list, msg.as_string()) s.close() return True except Exception, e: raise SendmailError(str(e))发送的报警邮件如下
关于报警问题的debug:
1.看看trigger有没有正常触发(dashboard上有没有对应的action)
2.发送报警的命令运行是否正常(手动验证)
3.结合server的日志和zabbix的数据库debug(比较常用的是alerts表)
相关文章推荐
- zabbix通过skype发送报警消息之弯路 推荐
- zabbix实现邮件报警--发送对应graph图片 推荐
- zabbix利用python脚本发送报警邮件的方法
- zabbix邮件报警以附件发送的解决方法
- ObjectARX给CAD发送命令的几种方法
- 杀猪、打狗、护牛、赛马、放虎——几种管理方法 推荐
- zabbix通过skype发送报警消息之切换平台
- C#发送Email邮件三种方法的总结(推荐)
- 邮件发送解决方案在.NET环境下几种不同方法示例
- Zabbix 自定义邮件发送脚本(Python) 推荐
- zabbix通过skype发送报警消息之终结
- zabbix通过skype发送报警消息之安装skype
- php发送get、post请求的几种方法
- [总结]发送邮件共有几种方法,测试成功的例子
- php发送get、post请求的几种方法
- Sendmail 发送监控报警邮件报错 dsn=5.6.0, stat=Data format error 推荐
- asp发送邮件的几种方法
- 将Java应用程序本地编译为EXE的几种方法(推荐使用JOVE和JET)
- 用C#发送邮件的几种方法
- Oracle BAM发送报警信息超长的解决方法