首页 > 其他分享 >如何生成好看的zabbix告警报表并发送邮件

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

时间:2024-07-17 14:52:33浏览次数:11  
标签:cell zabbix import 告警 data email 邮件 row

作者 乐维社区(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库

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 += "<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.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()

 

四、成果演示

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

 

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

 

 

 

 

 

 

以上就是本篇的全部内容。更多运维技巧欢迎关注乐维社区,更多运维问题也欢迎到乐维社区留言提问。

 

 

标签:cell,zabbix,import,告警,data,email,邮件,row
From: https://www.cnblogs.com/lwops/p/18307367

相关文章

  • 邮件服务器搭建教程:如何选择并配置软件?
    邮件服务器搭建教程怎么使用?服务器的性能优化策略?邮件服务器不仅提供基本的邮件收发功能,还涉及到数据安全、垃圾邮件过滤等多方面问题。AokSend将详细介绍如何选择并配置邮件服务器软件,确保您的邮件系统既高效又安全。邮件服务器搭建教程:功能需求常见的邮件服务器软件如Pos......
  • 自己搭建邮件服务器时如何保障数据安全性?
    自己搭建邮件服务器的要求?如何正确配置邮件服务器?自己搭建邮件服务器成为许多企业和个人用户的选择,以实现更高的自主性和定制化需求。下面,AokSend将从几个方面探讨如何在自己搭建邮件服务器的过程中,有效保障数据的安全性。自己搭建邮件服务器:加密数据使用SSL/TLS协议加密邮......
  • zabbix6.4分离部署笔记
    Zabbix6.4分离部署实施过程一、环境准备三台服务器###操作系统:REDHATENTERPRISELINUX8.3数据库:MYSQL8.0ip地址以及用途:Zabbix前端,8C16G16G系统盘100G:10.0.13.711371zabbixwebZabbix服务后端,8C16G100G:10.0.13.631363zabbixserverZabbix数据库MySql,8......
  • zabbix“专家坐诊”第246期问答
    问题一Q:有哪位大哥知道这是啥情况,6.4主动检查接口显示未知?A:看看agent配置文件的主采集有没有填写正确IP。Q:我刚刚客户端重新授权,发现可以预警了,但是还是灰色的,我尝试输入错误的密码,可以预警,但是这个灰色有点奇怪,在6.0版本上没有这个问题,我现在部署了6.4的会有这个问题。A:不影......
  • Zmail--让邮件变得简单的python邮件模块
    其他轮子的缺点:服务端拒信:首要问题。很多其他的轮子需要自己构造MIME和邮件头(通常优化了过程),但经常遭遇拒信,具体原因是其没有正确的定义邮件头,诸如From和To的头信息在使用SMTP时每家服务商检查都会有细微的差别,以及一些平台的差异(win10localhost乱码导致发件拒信),甚至在你发往......
  • 邮件发送与使用thymeleaf引擎重置密码邮件
    邮件发送原生java-mail进行邮件发送;前提:先登录邮箱,开启POP3/SMTP服务,使第三方可以使用授权码登录邮箱。@TestpublicvoidsendEmail(){Stringaccount="[email protected]";Stringpwd="KXNZHOZDMLTVWHOZ";//设置SMTP请求头Pr......
  • 邮件地址搜索软件_邮件地址采集软件
    一款搜索邮件地址和手机号码的软件,可以按整站搜索,也可以按关键词搜索关键词搜索支持baiu.com和bing.com。界面简单,使用方法非常简易和方便。易邮件地址搜索大师特色—易邮件地址搜索大师是一款搜索邮件地址和手机号码的软件,可以按整站搜索,也可以按关键词搜索。使用方法非常......
  • 基于SpringBoot+Vue+uniapp的邮件过滤系统的详细设计和实现(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • Exchange邮箱用户发邮件失败,提示“ Client does not have permissions to send as thi
    原贴https://www.cnblogs.com/dreamer-fish/p/16876232.htmlExchange邮箱用户发邮件失败,提示“Clientdoesnothavepermissionstosendasthissender”Exchange用户发邮件提示“5505.7.60SMTP;Clientdoesnothavepermissionstosendasthissender”处理方法:......
  • 使用Docker部署mailcow开源邮件系统详细过程
    1.项目介绍项目网站:mailcow:dockerized–Blog根据官方介绍,这个项目名称是mailcow,名称都是小写的。下面内容是通过AI翻译自官方文档:mailcow:dockerizeddocumentationmailcow:dockerized是一个基于Docker的开源组件/电子邮件套件。mailcow依赖于许多广为人知且长期......