作者 乐维社区(forum.lwops.cn) 许远
一、场景模拟
小东是一名资深的IT运维人员,其直属领导想要了解公司业务系统的健康状态以及小东日常的工作情况等,要求小东每周统计系统告警情况并发邮件给到他。小东所在公司搭建了一套zabbix开源监控,于是小东利用自己的专业知识,实现了zabbix告警统计,并生成漂亮的告警报表发送给自己的领导,得到了领导的称赞。
Zabbix开源监控是IT监控领域的佼佼者,拥有强大的告警统计与报表生成能力,但对于刚上手的小白来说可能还有些难度,本文将详细介绍zabbix告警报表的生成过程及发送邮件的操作步骤。
二、实现原理
环境说明:本人部署的zabbix版本为6.0加postgresql14.4数据库,如果用mysql的话,查询语句可能不一致
1、数据来源
基于python脚本实现,安装psqcopg2库,查询pg数据库的数据,主要是统计出最近一个月内告警出现最多的触发器,返回10-20条数据即可。统计最近一个月内哪些对象出现的告警次数比较多,我个人的话,返回的数据是1000条
2、数据清理
把主要是统计出最近一个月内告警出现最多的触发器的数据整理成一个列表数据,数据格式如下
[{“告警标签”},{“触发器名称”},{“告警次数”},{“告警颜色”}]
统计最近一个周内哪些对象出现的告警次数比较多(本人加了限制,就是一个对象同一个触发器起码一周内出现超过5次才统计),我个人的话,返回的数据是1000条
[{“对象名称”},{“对象ip”},{“触发器名称”},{“告警出现次数”}]
3、脚本实现过程
通过python脚本把最近一个月告警出现最多的触发器动态封装成html发到邮件正文。把一周内哪些对象出现的告警次数多的填充到excel表,并作为附件发送到邮件
三、实现步骤
需要安装一下python库
mport 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 += "<tr style='width:10%;height:10px'><td style='width:8%;border: 1px solid #999;text-align:center;padding: 5px 0;'><span style='background-color: {}; padding: 2px 6px; border-radius: 3px; color:white;'>{}</span></td><td style='width:10%;border: 1px solid #999;text-align:center;padding: 5px 0;color: #f40;'>{}</td><td style='width:10%;border: 1px solid #999;text-align:center;padding: 5px 0;'>{}</td></tr>".format(trigger['color'],trigger['level'],trigger["name"], trigger["count"])
Excel数据填充部分代码(data为清理好的数据)
def generate_excel(data):# 创建一个新的工作簿wb = openpyxl.Workbook()sheet = wb.activesheet.title = '告警报表'# 定义表头headers = ['业务名称', 'IP', '告警信息', '告警次数']# 写入表头for col_idx, header in enumerate(headers, start=1):cell = sheet.cell(row=1, column=col_idx)cell.value = headercell.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 = valueprint(cell.value)# 保存工作簿excel_file = './alert_data.xlsx'wb.save(os.path.basename(excel_file))
邮件发送部分代码
# 创建MIMEMultipart对象msg = MIMEMultipart('alternative')msg['From'] = sender_emailmsg['To'] = receiver_emailmsg['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()
四、成果演示
1、邮件一个月的告警统计报表
2、告警统计excel邮件附件(部分宏值需要额外替换成具体值)
以上就是本篇的全部内容,更多运维技巧欢迎关注乐维社区,更多运维问题也欢迎到乐维社区留言提问。