线上使用zabbix报警脚本(含图片)
分享一个线上使用的自定义zabbix报警脚本,脚本思路大致如下:
1.使用爬虫获取报警图片(前提是要获得报警的item)
2.将图片与邮件内容整合
3.发送邮件
4.日志记录
脚本内容如下:
#!/usr/bin/python #coding:utf-8import sys,time,re,os,glob import smtplib from email.mime.text import MIMEText from email.mime.p_w_picpath import MIMEImage from email.mime.multipart import MIMEMultipart import urllib,urllib2,cookielib import zlibmail_host = '************' # 邮件发送方相关信息 mail_user = '************' mail_pass = '************' mail_postfix = '************'zabbix_user = "********" # zabbix-web相关信息 zabbix_pass = "********" url = "http://***********/" alartscript_path="/**********/alertscripts/" # 邮件脚本及日志位置 line = "ItemID"me = "zabbix"+'<'+mail_user+'>'######### 利用爬虫获取图片,保证cookie的可用性 def get_graph(itemID):login_url = url + "index.php"post_value = {"request":"","name":zabbix_user,"password":zabbix_pass,"autologin":"1", #注意这个是否记住密码的选项,将造成生成的cookie长度不一样,短的能查看到图但没有数据"enter":"Sign in"}post_data = urllib.urlencode(post_value)headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Encoding":"gzip, deflate","Accept-Language":"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3","Connection":"Keep-Alive","Host":"**************","Referer":login_url,###########这个cookie很重要,要求当前cookie正在浏览器上正常使用,才能顺利取图"Cookie":"******** zbx_sessionid=*********"}request = urllib2.Request(login_url,post_data,headers)cj = cookielib.CookieJar()opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))urllib2.install_opener(opener)result = opener.open(request)print result.info() #查看下内容信息,如果是gzip要解压写入文件result_html = zlib.decompress(result.read(), 16+zlib.MAX_WBITS)global graph_url # 构建用于访问图片的URLgraph_url = url+"chart.php"+"?itemids="+str(itemID)graph_data = urllib2.urlopen(graph_url)print graph_data.info()#.get('Content-Encoding')#graph_html = zlib.decompress(graph_data.read(), 16+zlib.MAX_WBITS)print graph_data.info().get('Content-Type')p_w_picpath_data = graph_data.read()if graph_data.info().get('Content-Type') == "p_w_picpath/png":p_w_picpath_file = open('last_%s.pnj'%itemID,'wb')p_w_picpath_file.write(p_w_picpath_data)p_w_picpath_file.close()else:trigged = open('zabbix.png','rb') # 如果获取图片data失败,打开一张事先准备好的图,这里使用的是zabbix的logo,在邮件中很直接的反应出获取图片失败p_w_picpath_data = trigged.read()trigged.close()print "Graph_URL:",graph_urlreturn p_w_picpath_datadef mail_con(txtData,p_w_picpathData): # 重写邮件内容(添加图片)msg = MIMEMultipart('related')msg['Subject'] = subjectmsg['From'] = memsg['to'] = receivercon_txt = MIMEText(txtData,_subtype='html',_charset='utf-8')msg.attach(con_txt)con_img = MIMEImage(p_w_picpathData)con_img.add_header('Content-ID','digglife') # 将要发送的图片嵌入到邮件头部,重写邮件内容msg.attach(con_img)return msg.as_string()def send_mail(receiver,subject,contents): # 邮件发送,并将结果记录logfile = open('alarm_mail.log','a')try:s = smtplib.SMTP()s.connect(mail_host)s.login(mail_user,mail_pass)s.sendmail(me,receiver,contents)s.close()log = time.ctime() + "\tOK\t" + subject +"\t"+ receiver + "\n"except Exception,e:log = time.ctime() + "\tFail\t" + subject +"\t"+ receiver + "\n"logfile.write("\n"+"\t"+graph_url+"\n")logfile.write(log)logfile.close()if __name__ == "__main__":cur_pwd = os.getcwd()print cur_pwdos.chdir(alartscript_path) # zabbix-server工作的路径为/,在这里切换邮件脚本路径,可以写入日志和图片处理,减少出错old_pnjs = glob.glob('last_*.pnj')for old_file in old_pnjs:os.remove(old_file)receiver = sys.argv[1]subject = sys.argv[2]src_mail_con = sys.argv[3]try:ItemID = re.match(r'.*ItemID:(\d+)[^\d]+.*',src_mail_con.replace('\n',''),re.S).group(1) # 利用正则从邮件内容中获取itemIDexcept:ItemID = 0000 # item为0000的是一张空图,减少异常情况print "ItemID:",ItemIDImageData = get_graph(ItemID)MailCon = mail_con(src_mail_con,ImageData)send_mail(receiver,subject,MailCon)
脚本中‘********’部分出于个人信息安全进行隐藏,读者可根据具体环境修改(发件箱信息,zabbix-web登陆信息及cookie)
脚本首先要获得报警itemID,以及邮件内容放置图片信息,因此还要自定义报警邮件内容,如下:
邮件内容:
<body>故障通知<br/>触发器: {TRIGGER.NAME}<br/>主机名:{HOST.NAME}({IPADDRESS})<br/>状态: {TRIGGER.STATUS}<br/>告警级别: {TRIGGER.SEVERITY}<br/>URL: {TRIGGER.URL}<br/><br/>告警项目:<br/><br/>{ITEM.NAME1} ({HOST.NAME1}:{ITEM.KEY1}): {ITEM.VALUE1}<br/><br/><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><img src="cid:digglife" orgwidth="1016" orgheight="376" data-p_w_picpath="1" style="width: 780px; height: 288px;"></div>ItemID:{ITEM.ID}<br/>EventID: {EVENT.ID}<br/>告警时间:{EVENT.DATE} {EVENT.TIME} <br/><br/>详细信息:<a href="http://*******/history.php?action=showgraph&itemids[]={ITEM.ID}" target="_blank">登录查看</a><br/></body>
效果如下:
QQ邮箱接收邮件,显示内容:
日志记录:
转载于:https://blog.51cto.com/11424123/1771220
线上使用zabbix报警脚本(含图片)相关推荐
- XE中FMX操作ListBox,添加上千条记录(含图片)
我之前是想在ListBox的每个Item上添加一个图片,Item上所有的内容都是放在Object里赋值,结果发现加载一百条记录耗时四五秒: procedure TMainForm.AddItem; v ...
- 线上SQL脚本执行错了出事之后互相甩锅怎么办?
平常我们线上执行的SQL脚本都是很粗犷的.呼叫一下DBA或者运维,把脚本发过去,然后告诉他在哪个环境执行.然后双方沟通不畅,测试环境的脚本执行到生产了!脚本写的有问题执行错了却没有回滚脚本!或者每个人 ...
- 线上服务导致cpu飙升问题排查
一.故障说明 昨晚突然收到线上服务器cpu报警,登录监控平台看了下发现cpu瞬间飙升到60%.第一反应就是使用top命令去查看,发现是一个java进程.于是立刻使用jps -l命令定位到该java进程 ...
- gc就是fullgc吗 major_线上出现fullgc问题如何排查?
1.问题描述 线上出现fullgc报警,每5分钟一次 2.背景知识 1. 程序执行了System.gc() 执行了jmap -histo:live pid命令 在执行minor gc的时候进行的一系列 ...
- 【开发技能】研发线上事故总结!
一.前言 你的代码出过事故吗? 老人言:常在河边走哪有不湿鞋.只要你在做着编程开发的工作就一定会遇到事故,或大或小而已. 当然可能有一部分研发同学,在相对传统的行业或者做着用户体量较小的业务等,很难遇 ...
- 面试官:线上服务器CPU占用率高如何排查定位问题?
开发十年,就只剩下这套架构体系了!! 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下:  ...
- 线上发生死锁异常了,该怎么办
前言 MySQL 死锁异常是我们经常会遇到的线上异常类别,一旦线上业务日间复杂,各种业务操作之间往往会产生锁冲突,有些会导致死锁异常.这种死锁异常一般要在特定时间特定数据和特定业务操作才会复现,并且分 ...
- mysql死锁的排查方法_MySQL死锁系列-线上死锁问题排查思路
前言 MySQL 死锁异常是我们经常会遇到的线上异常类别,一旦线上业务日间复杂,各种业务操作之间往往会产生锁冲突,有些会导致死锁异常.这种死锁异常一般要在特定时间特定数据和特定业务操作才会复现,并且分 ...
- window服务器cpu过高的排查_线上服务器发生CPU占用率过高应该如何排查并定位问题?...
国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下: 排名前几的比较受重视的能力分别为:解决问题 ...
最新文章
- 微软与联合国环境规划署联手解决环境问题
- Leetcode 122. 买卖股票的最佳时机 II 解题思路及C++实现
- html5效果源码,10款web前端值得学习的 HTML5 效果附源码
- android配置开发环境ubuntu
- 沣东新城镐京遗址规划_沣东新城房价为啥这么高?
- centos 6.5装mysql 5.7,centos 6.5装mysql5.7
- [深度学习-数据集] cifar-10数据集介绍
- linux下weblogic12c建域,三、WebLogic 12C集群部署-创建域
- 苹果cms V10模板|首涂第二十五套精简宽屏主题模板破解带后台无加密版
- 【Python密度泛函理论】
- Matlab求整数规划
- MTK刷机工具Flash_Tool部分4032错误解决办法
- php如何实时显示弹幕,斗鱼弹幕 PHP 实现
- Eclipse设置护眼浅绿色背景
- 【MDCC 2016】产品与设计峰会现场实录(下)
- 突破某些网站限制只能由微信打开的尴尬场景
- IGMP协议(IGMPv1、IGMPv2、IGMPv3)
- GitHub上README.md编写教程(基本语法)
- 《复杂网络》复杂网络的结构及特点
- react render相关 【类组件、函数组件 】
热门文章
- linux dump用法,Linux命令之tcpdump命令用法介绍
- bootstrap table php,bootstrap table Tooltip
- git本地仓库关联远端仓库
- Redis高级客户端Lettuce详解
- 如何高效地去调试UGUI的源码
- python-9-IO编程
- CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction)...
- Looping over the databases on a server
- 清除 Xcode 项目缓存
- 如何实施好基于MOSS的企业搜索项目(上)