zabbix告警報(bào)表并發(fā)送郵件功能實(shí)現(xiàn)
一、場(chǎng)景模擬
小東是一名資深的IT運(yùn)維人員,其直屬領(lǐng)導(dǎo)想要了解公司業(yè)務(wù)系統(tǒng)的健康狀態(tài)以及小東日常的工作情況等,要求小東每周統(tǒng)計(jì)系統(tǒng)告警情況并發(fā)郵件給到他。小東所在公司搭建了一套zabbix開源監(jiān)控,于是小東利用自己的專業(yè)知識(shí),實(shí)現(xiàn)了zabbix告警統(tǒng)計(jì),并生成漂亮的告警報(bào)表發(fā)送給自己的領(lǐng)導(dǎo),得到了領(lǐng)導(dǎo)的稱贊。
Zabbix開源監(jiān)控是IT監(jiān)控領(lǐng)域的佼佼者,擁有強(qiáng)大的告警統(tǒng)計(jì)與報(bào)表生成能力,但對(duì)于剛上手的小白來說可能還有些難度,本文將詳細(xì)介紹zabbix告警報(bào)表的生成過程及發(fā)送郵件的操作步驟。
二、實(shí)現(xiàn)原理
環(huán)境說明:本人部署的zabbix版本為6.0加postgresql14.4數(shù)據(jù)庫(kù),如果用mysql的話,查詢語句可能不一致
1、數(shù)據(jù)來源
基于python腳本實(shí)現(xiàn),安裝psqcopg2庫(kù),查詢pg數(shù)據(jù)庫(kù)的數(shù)據(jù),主要是統(tǒng)計(jì)出最近一個(gè)月內(nèi)告警出現(xiàn)最多的觸發(fā)器,返回10-20條數(shù)據(jù)即可。統(tǒng)計(jì)最近一個(gè)月內(nèi)哪些對(duì)象出現(xiàn)的告警次數(shù)比較多,我個(gè)人的話,返回的數(shù)據(jù)是1000條
2、數(shù)據(jù)清理
把主要是統(tǒng)計(jì)出最近一個(gè)月內(nèi)告警出現(xiàn)最多的觸發(fā)器的數(shù)據(jù)整理成一個(gè)列表數(shù)據(jù),數(shù)據(jù)格式如下
[{“告警標(biāo)簽”},{“觸發(fā)器名稱”},{“告警次數(shù)”},{“告警顏色”}]
統(tǒng)計(jì)最近一個(gè)周內(nèi)哪些對(duì)象出現(xiàn)的告警次數(shù)比較多(本人加了限制,就是一個(gè)對(duì)象同一個(gè)觸發(fā)器起碼一周內(nèi)出現(xiàn)超過5次才統(tǒng)計(jì)),我個(gè)人的話,返回的數(shù)據(jù)是1000條
[{“對(duì)象名稱”},{“對(duì)象ip”},{“觸發(fā)器名稱”},{“告警出現(xiàn)次數(shù)”}]
3、腳本實(shí)現(xiàn)過程
通過python腳本把最近一個(gè)月告警出現(xiàn)最多的觸發(fā)器動(dòng)態(tài)封裝成html發(fā)到郵件正文。把一周內(nèi)哪些對(duì)象出現(xiàn)的告警次數(shù)多的填充到excel表,并作為附件發(fā)送到郵件
三、實(shí)現(xiàn)步驟
需要安裝一下python庫(kù)
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數(shù)據(jù)庫(kù)連接代碼
config = {
'host': '數(shù)據(jù)庫(kù)ip',
'port': 5432, # PostgreSQL 默認(rèn)端口是5432
'user': '用戶名',
'password': '密碼',
'database': '數(shù)據(jù)庫(kù)名'
}
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)
數(shù)據(jù)清洗封裝動(dòng)態(tài)html部分代碼(有些css樣式在郵件會(huì)不生效,所以可能需要用內(nèi)嵌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數(shù)據(jù)填充部分代碼(data為清理好的數(shù)據(jù))
def generate_excel(data):
# 創(chuàng)建一個(gè)新的工作簿
wb = openpyxl.Workbook()
sheet = wb.active
sheet.title = '告警報(bào)表'
# 定義表頭
headers = ['業(yè)務(wù)名稱', 'IP', '告警信息', '告警次數(shù)']
# 寫入表頭
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')
# 填充數(shù)據(jù)
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))
郵件發(fā)送部分代碼
# 創(chuàng)建MIMEMultipart對(duì)象
msg = MIMEMultipart('alternative')
msg['From'] = sender_email
msg['To'] = receiver_email
msg['Subject'] = subject
# 附加HTML內(nèi)容
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服務(wù)器
server = smtplib.SMTP_SSL('smtp.qq.com', 465)
server.login(sender_email, sender_password)
server.sendmail(sender_email, receiver_email, msg.as_string())
print('郵件發(fā)送成功')
except Exception as e:
print('郵件發(fā)送失敗:', e)
finally:
server.quit()
四、成果演示
1、郵件一個(gè)月的告警統(tǒng)計(jì)報(bào)表

2、告警統(tǒng)計(jì)excel郵件附件(部分宏值需要額外替換成具體值)

到此這篇關(guān)于如何生成好看的zabbix告警報(bào)表并發(fā)送郵件 的文章就介紹到這了,更多相關(guān)zabbix告警報(bào)表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Zabbix 2.4.5自帶MySQL監(jiān)控的配置使用教程
Zabbix 有自帶監(jiān)控 MySQL 的模板,但是卻不能直接使用,下面這篇文章主要給大家介紹了關(guān)于Zabbix 2.4.5自帶MySQL監(jiān)控配置使用的相關(guān)資料,文中通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-07-07
Zabbix實(shí)現(xiàn)監(jiān)控多個(gè)mysql過程解析
這篇文章主要介紹了Zabbix實(shí)現(xiàn)監(jiān)控多個(gè)mysql過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Zabbix安裝圖文教程(需要LAMP或者LNMP運(yùn)行環(huán)境)
要想安裝Zabbix那么在Linux下安裝zabbix需要有LAMP或者LNMP運(yùn)行環(huán)境才可以,這里給大家分享下Zabbix安裝方法,需要的朋友可以參考下2014-10-10
zabbix redis自動(dòng)發(fā)現(xiàn)端口的腳本返回json格式
zabbix([`zæbiks])是一個(gè)基于WEB界面的提供分布式系統(tǒng)監(jiān)視以及網(wǎng)絡(luò)監(jiān)視功能的企業(yè)級(jí)的開源解決方案。這篇文章主要介紹了zabbix redis自動(dòng)發(fā)現(xiàn)端口的腳本,返回json格式,需要的朋友可以參考下2019-11-11
zabbix執(zhí)行遠(yuǎn)程主機(jī)的腳本或指令詳解
這篇文章主要介紹了在zabbix執(zhí)行遠(yuǎn)程主機(jī)的腳本或指令,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
解析Zabbix 5.0磁盤自動(dòng)發(fā)現(xiàn)和讀寫監(jiān)控的問題
本文文章給大家介紹Zabbix 5.0磁盤自動(dòng)發(fā)現(xiàn)和讀寫監(jiān)控的問題,在配置鍵值得時(shí)候大家要主要此鍵值支持Linux平臺(tái),具體細(xì)節(jié)問題跟隨小編一起通過本文學(xué)習(xí)下吧2021-05-05

