如何生成好看的zabbix告警报表并发送邮件

乐维看科技2024-07-17 14:31:45  138

作者 乐维社区(forum.lwops.cn) 许远

场景模拟

小东是一名资深的IT运维人员,其直属领导想要了解公司业务系统的健康状态以及小东日常的工作情况等,要求小东每周统计系统告警情况并发邮件给到他。小东所在公司搭建了一套zabbix开源监控,于是小东利用自己的专业知识,实现了zabbix告警统计,并生成漂亮的告警报表发送给自己的领导,得到了领导的称赞。

Zabbix开源监控是IT监控领域的佼佼者,拥有强大的告警统计与报表生成能力,但对于刚上手的小白来说可能还有些难度,本文将详细介绍zabbix告警报表的生成过程及发送邮件的操作步骤。

实现原理

环境说明:本人部署的zabbix版本为6.0加postgresql14.4数据库,如果用mysql的话,查询语句可能不一致

数据来源

基于python脚本实现,安装psqcopg2库,查询pg数据库的数据,主要是统计出最近一个月内告警出现最多的触发器,返回10-20条数据即可。统计最近一个月内哪些对象出现的告警次数比较多,我个人的话,返回的数据是1000条

数据清理

把主要是统计出最近一个月内告警出现最多的触发器的数据整理成一个列表数据,数据格式如下

[{“告警标签”},{“触发器名称”},{“告警次数”},{“告警颜色”}]

统计最近一个周内哪些对象出现的告警次数比较多(本人加了限制,就是一个对象同一个触发器起码一周内出现超过5次才统计),我个人的话,返回的数据是1000条

[{“对象名称”},{“对象ip”},{“触发器名称”},{“告警出现次数”}]

脚本实现过程

通过python脚本把最近一个月告警出现最多的触发器动态封装成html发到邮件正文。把一周内哪些对象出现的告警次数多的填充到excel表,并作为附件发送到邮件

实现步骤

需要安装一下python库

import smtplib

from email.mime.multipart import MIMEMultipart

from email.mime.text import MIMEText

import psycopg2

import openpyxl

from openpyxl.styles import Alignment, Font

from openpyxl.utils import get_column_letter

import smtplib

from email.mime.multipart import MIMEMultipart

from email.mime.text import MIMEText

from email.mime.base import MIMEBase

from email import encoders

import os

部分代码

Postgresql数据库连接代码

config = {

'host': '数据库ip',

'port': 5432, # PostgreSQL 默认端口是5432

'user': '用户名',

'password': '密码',

'database': '数据库名'

}

try:

connection = psycopg2.connect(**config)

with connection.cursor as cursor:

sql_query="""SELECT t.description AS trigger_name, t.priority AS trigger_level, COUNT(e.eventid) AS occurrence_count FROM events e JOIN triggers t ON e.objectid = t.triggerid WHERE e.source = 0 AND e.object = 0 AND e.clock >= EXTRACT(EPOCH FROM (NOW - INTERVAL '1 WEEK')) GROUP BY t.description, t.priority ORDER BY occurrence_count DESC LIMIT 100;"""

cursor.execute(sql_query)

results = cursor.fetchall

for row in results:

excel_data.append([row[0],row[1],row[2],row[3]])

except Exception as e:

Print(e)

数据清洗封装动态html部分代码(有些css样式在邮件会不生效,所以可能需要用内嵌style)

table_rows = ""

for trigger in trigger_stats:

table_rows += "{}{}{}".format(trigger['color'],trigger['level'],trigger["name"], trigger["count"])

Excel数据填充部分代码(data为清理好的数据)

def generate_excel(data):

# 创建一个新的工作簿

wb = openpyxl.Workbook

sheet = wb.active

sheet.title = '告警报表'

# 定义表头

headers = ['业务名称', 'IP', '告警信息', '告警次数']

# 写入表头

for col_idx, header in enumerate(headers, start=1):

cell = sheet.cell(row=1, column=col_idx)

cell.value = header

cell.font = Font(bold=True)

cell.alignment = Alignment(horizontal='center')

# 填充数据

for row_idx, row_data in enumerate(data, start=2):

for col_idx, value in enumerate(row_data, start=1):

cell = sheet.cell(row=row_idx, column=col_idx)

cell.value = value

print(cell.value)

# 保存工作簿

excel_file = './alert_data.xlsx'

wb.save(os.path.basename(excel_file))

邮件发送部分代码

# 创建MIMEMultipart对象

msg = MIMEMultipart('alternative')

msg['From'] = sender_email

msg['To'] = receiver_email

msg['Subject'] = subject

# 附加HTML内容

msg.attach(MIMEText(html_content, 'html'))

generate_excel(excel_data)

with open('./alert_data.xlsx', 'rb') as attachment:

part = MIMEBase('application', 'octet-stream')

part.set_payload(attachment.read)

encoders.encode_base64(part)

part.add_header('Content-Disposition', 'attachment; filename="{}"'.format('./alert_data.xlsx'))

msg.attach(part)

try:

# 连接到QQ邮箱的SMTP服务器

server = smtplib.SMTP_SSL('smtp.qq.com', 465)

server.login(sender_email, sender_password)

server.sendmail(sender_email, receiver_email, msg.as_string)

print('邮件发送成功')

except Exception as e:

print('邮件发送失败:', e)

finally:

server.quit

成果演示

邮件一个月的告警统计报表

告警统计excel邮件附件(部分宏值需要额外替换成具体值)

转载此文是出于传递更多信息目的。若来源标注错误或侵犯了您的合法权益,请与本站联系,我们将及时更正、删除、谢谢。
https://www.414w.com/read/911024.html
0
随机主题
郭德纲受邀去威尼斯大学演讲, 被授予荣誉勋章, 夸奖郭麒麟超过自己绿色地球授予认证北冕号在内的全部庞洛邮轮旗下船只法中有情, 让家有爱, 杭州金牌律师走进浙江省女子监狱现场调解降价就会冲的小米手机, 很多人直接选了这两款, 小米13Ultra在内江苏调度100万台农机具助力“三夏”生产石家班硬核实力“拒绝锁喉”不信你试试?泽连斯基将前往法国说服北约击落俄罗斯导弹, 没收俄国被冻结资产中俄多个大动作落地,美债连续三个月缩减,美联储发现绷不住了汽车业变天: 从理想、特斯拉的裁员看行业震荡有了“福建舰”后,中国还需要几艘航母,才能战胜美国海军?海贼王1115话: 路飞跑路, 索隆娜美将会合, 金星摧毁艾尔巴夫船首Sensor Tower: 《Monopoly GO! 》4月蝉联全球手游畅销榜冠军, 《王者荣耀》位列第2名, 米哈游旗下两款手游表现强劲汽车工业进入新时代, 日产逍客开始大降价, 还值得入手吗?《闯关东》: 看懂朱传武对朱家的报复, 才知鲜儿被他利用得有多狠混沌看盘: 螺纹如期冲上半年线, 短线需调整巩固站稳家族荣耀之继承者:有很大可能是小三的女儿老六艺术 游戏嘛怎么开心怎么来,让我们忘记生活的压力吧。ONE在亚洲推出全新航线! 5月27日首航!拼多多一季报: 高质量发展驶入深水区 业绩数据给予正向肯定9C秘籍 | 让竞争对手认知超越你的10大方法国足新一期大名单: 6名新人入围, 谁能担当重任?
最新回复(0)