前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Zabbix自动生成报表并发送邮件

Zabbix自动生成报表并发送邮件

作者头像
没有故事的陈师傅
发布2019-08-14 16:41:10
1.8K0
发布2019-08-14 16:41:10
举报
文章被收录于专栏:运维开发故事

热爱你选择的生活,选择你热爱的生活

由于本人不懂前端,HTML内容参考了https://blog.csdn.net/xiegh2014/article/details/79604822 这里也要特别感谢兴哥对脚本提供的帮助,兴哥博客https://www.cnblogs.com/chancey

实现思路:

  1. zabbix提供了一个获取事件的api,可以根据此api获取zabbix原始报警数据
  2. 将获取到的原始数据进行统计去重,统计触发器出现次数,并把重复的触发器删除,将需要用到的数据统一放到一个列表中
  3. 将第二步的列表进行遍历,并传入到HTML中,或者也可以使用pandas直接把数据建模,然后自动生成HTML表格
  4. 将生成的HTML作为邮件内容发送

定义获取的时间间隔

代码语言:javascript
复制
x=(datetime.datetime.now()-datetime.timedelta(minutes=30)).strftime("%Y-%m-%d %H:%M:%S")
y=(datetime.datetime.now()).strftime("%Y-%m-%d %H:%M:%S")
def timestamp(x,y):
p=time.strptime(x,"%Y-%m-%d %H:%M:%S")
starttime = str(int(time.mktime(p)))
q=time.strptime(y,"%Y-%m-%d %H:%M:%S")
endtime= str(int(time.mktime(q)))
return starttime,endtime

这里是获取的30分钟的报警数据

获取事件数据

代码语言:javascript
复制
def getevent(auth,timestamp):
data={
"jsonrpc": "2.0",
"method": "event.get",
"params": {
"output": [
"name",
"severity"
],
"value":1,
"time_from":timestamp[0],
"time_till":timestamp[1],
"selectHosts":[
#"hostid",
"name"
]
},
"auth": auth,
"id": 1
}
getevent=requests.post(url=ApiUrl,headers=header,json=data)
triname=json.loads(getevent.content)['result']

通过zabbix api获取需要用到的事件内容,其中包含报警主机名,主机id,触发器,触发器严重性

将获取到的数据进行处理

代码语言:javascript
复制
triggers=[]
a={}
for i in triname:
triggers.append(i['name'])
for i in triggers:
a[i]=triggers.count(i)
list2=[]
print(triname)
#print(a)
for key in a:
b={}
b['name']=key
b['host']=[i['hosts'][0]['name'] for i in triname if i['name']==key][0]
b['severity']=[i['severity'] for i in triname if i['name']==key][0]
b['count']=a[key]
list2.append(b)
return list2

这里是将重复出现的触发器进行去重并统计出现次数,将获取到的触发次数以及以前的信息都放到同一个表里,并传给HTML

将数据发送给HTML

代码语言:javascript
复制
def datatohtml(list2):
tables = ''
for i in range(len(list2)):
name,host,severity,count = list2[i]['name'], list2[i]['host'], list2[i]['severity'], list2[i]['count']
td = "<td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td>"%(name, host, severity, count)
tables = tables + "<tr>%s</tr>"%td
base_html="""
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>zabbix监控告警</title>
</head>
<body>
<table width="900" border="0">
<tr>
<td colspan="2" style="background-color:#FFA500;">
<h4>告警级别: 1 表示:信息 2 表示:告警 3 表示:一般严重 4 表示:严重 5 表示:灾难</h4>
</td>
</tr>
<tr>
<td style="background-color:#FFD700;width:100px;">
<TABLE BORDER=1><TR><TH>主机</TH><TH>触发器</TH><TH>告警级别</TH><TH>告警次数</TH></TR>%s</TABLE>
</td>
</tr>
<tr>
<td colspan="2" style="background-color:#FFA500;text-align:center;">
zabbix告警统计</td>
</tr>
</table>
</body>
</html>
""" %tables
return base_html

将传入的列表进行遍历并传入HTML表格中

发送报表邮件

将生成的HTML通过邮件发送

代码语言:javascript
复制
def sendmail(base_html):
from_addr = 'wanger@qq.com'
password = '没有故事的陈师傅'
to_addr = 'wanger@163.com'
smtp_server = 'smtp.qq.com'msg = MIMEText(base_html, 'html', 'utf-8')
msg['From'] = from_addr
msg['To'] = to_addr
msg['Subject'] = Header('Zabbix本周监控报表', 'utf-8').encode()try:
server=SMTP(smtp_server,"25")   #创建一个smtp对象
#server.starttls()    #启用安全传输模式
server.login(from_addr,password)  #邮箱账号登录
server.sendmail(from_addr,to_addr,msg.as_string())  #发送邮件
server.quit()   #断开smtp连接
except smtplib.SMTPException as a:
print (a)

实现效果如下:

如果需要每周定时发送,可将其放入Linux的定时任务中,完整脚本阅读原文或者访问GitHub:https://github.com/sunsharing-note/zabbix/blob/master/zhoubao.py 获取


欢迎各位一起交流,对脚本提出指导意见

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维开发故事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现思路:
  • 定义获取的时间间隔
  • 获取事件数据
  • 将获取到的数据进行处理
  • 将数据发送给HTML
  • 发送报表邮件
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档