zabbix監控告警表報統計
阿新 • • 發佈:2018-12-03
傳送郵件的指令碼
#!/usr/bin/python #coding:utf-8 import smtplib, time, os from email.mime.text import MIMEText from email.header import Header def send_mail_html(file): '''傳送html內容郵件''' # 傳送郵箱 #sender = '[email protected]' sender = ("%s<[email protected]>")%(Header('Zabbix監控系統告警!','utf-8'),) # 接收郵箱 receiver = '
[email protected]' # 傳送郵件主題 t = time.strftime("%Y年%m月%d日", time.localtime()) subject = t +'zabbix監控報表!' # 傳送郵箱伺服器 smtpserver = 'smtp.163.com' # 傳送郵箱使用者/密碼 username = 'l10880347' password = '你的授權碼' # 讀取html檔案內容 f = open(file, 'rb') mail_body = f.read() f.close() # 組裝郵件內容和標題,中文需引數‘utf-8’,單位元組字元不需要 msg = MIMEText(mail_body, _subtype='html', _charset='utf-8') msg['Subject'] = Header(subject, 'utf-8') msg['From'] = sender msg['To'] = receiver # 登入併發送郵件 try: smtp = smtplib.SMTP() smtp.connect(smtpserver) smtp.login(username, password) smtp.sendmail(sender, receiver, msg.as_string()) except: print("郵件傳送失敗!") else: print("郵件傳送成功!") finally: smtp.quit() def find_new_file(dir): '''查詢目錄下最新的檔案''' file_lists = os.listdir(dir) file_lists.sort(key=lambda fn: os.path.getmtime(dir + "/" + fn) if not os.path.isdir(dir + "/" + fn) else 0) # print('最新的檔案為: ' + file_lists[-1]) file = os.path.join(dir, file_lists[-1]) print('/usr/lib/zabbix/repostscripts/html/:', file) return file dir = '/usr/lib/zabbix/repostscripts/html/' # 指定檔案目錄 file = find_new_file(dir) # 查詢最新的html檔案 send_mail_html(file) # 傳送html內容郵件
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><TR><TD>Zabbix server</TD><TD>{HOST.NAME} has just been restarted</TD><TD>1</TD><TD>14</TD></TR><TR><TD>Zabbix server</TD><TD>Zabbix unreachable poller processes more than 75% busy</TD><TD>3</TD><TD>10</TD></TR><TR><TD>Zabbix server</TD><TD>Disk I/O is overloaded on {HOST.NAME}</TD><TD>2</TD><TD>8</TD></TR><TR><TD>Zabbix server</TD><TD>Zabbix agent on {HOST.NAME} is unreachable for 5 minutes</TD><TD>3</TD><TD>5</TD></TR><TR><TD>Zabbix server</TD><TD>Zabbix preprocessing worker processes more than 75% busy</TD><TD>3</TD><TD>4</TD></TR><TR><TD>Zabbix server</TD><TD>Zabbix trapper processes more than 75% busy</TD><TD>3</TD><TD>4</TD></TR><TR><TD>Zabbix server</TD><TD>Zabbix alerter processes more than 75% busy</TD><TD>3</TD><TD>2</TD></TR><TR><TD>Zabbix server</TD><TD>Zabbix proxy poller processes more than 75% busy</TD><TD>3</TD><TD>2</TD></TR><TR><TD>Zabbix server</TD><TD>Zabbix preprocessing manager processes more than 75% busy</TD><TD>3</TD><TD>2</TD></TR><TR><TD>devops-docker-node50</TD><TD>Zabbix agent on {HOST.NAME} is unreachable for 5 minutes</TD><TD>3</TD><TD>2</TD></TR><TR><TD>Zabbix server</TD><TD>Zabbix poller processes more than 75% busy</TD><TD>3</TD><TD>2</TD></TR><TR><TD>Zabbix server</TD><TD>Zabbix alert manager processes more than 75% busy</TD><TD>3</TD><TD>2</TD></TR></TABLE> </td> </tr> <tr> <td colspan="2" style="background-color:#FFA500;text-align:center;"> zabbix告警統計</td> </tr> </table> </body> </html>
<html>
<style> .title{font-weight:bold;font-size:18px;}</style>
<body>
<p>
<img src="">
<br><br>
<span
class="title">運維日報</span>
<br><br>
各項監控指標如下:
<br>
目前新增監控主機為:101 臺
<br>
基礎監控告警為:10次
<br>
中間監控告警為:11次
<br>
資料庫監控告警為:5次
<br>
業務監控告警為:3次
<br><br>
<span class="title">執行情況</span>
<br><br>
CPU最小閒置10% 5臺伺服器
<br>
記憶體使用率大於10% 20臺伺服器
<br>
磁碟使用率超過80% 40臺伺服器
<br><br>
<span class="title">運維監控日報統計</span>
<br><br>
</p>
</body>
</html>
生成XLSX指令碼
#!/usr/bin/python
# coding:utf-8
import xlsxwriter
# 建立一個Excel檔案
workbook = xlsxwriter.Workbook('zabbix.xlsx')
# 建立一個工作表sheet物件,使用預設名稱:"Sheet1"
worksheet = workbook.add_worksheet("repost")
# 建立一個圖表物件
chart = workbook.add_chart({'type':'column'})
# 定義資料表頭
title = [u'告警級別',u'星期一',u'星期二',u'星期三',u'星期四',u'星期五',u'星期六',u'星期日',u'平均告警次數']
# 定義業務名稱列表
buname = [u'資訊',u'一般嚴重',u'非常嚴重',u'嚴重',u'災難']
# 定義5個頻道一週七天的資料列表
data = [
[1,2,5,9,1,1,8],
[2,8,9,9,8,0,9],
[5,2,8,1,7,8,5],
[1,5,8,8,4,0,9],
[0,5,8,6,3,8,4]
]
# 定義資料formatter格式物件,設定邊框加粗1畫素
formatter = workbook.add_format()
formatter.set_border(1)
# 定義標題欄格式物件:邊框加粗1畫素,背景色為灰色,單元格內容居中、加粗
title_formatter = workbook.add_format()
title_formatter.set_border(1)
title_formatter.set_bg_color('#cccccc')
title_formatter.set_align('center')
title_formatter.set_bold()
# 定義平均值欄資料格式物件:邊框加粗1畫素,數字按2位小數顯示
ave_formatter = workbook.add_format()
ave_formatter.set_border(1)
ave_formatter.set_num_format('0.00')
# 定義圖表資料系列函式
def chart_series(cur_row):
chart.add_series({
'categories':'=repost!$B$1:$H$1',
'values':'=repost!$B${}:$H${}'.format(cur_row,cur_row),
'line':{'color':'black'},
'name':'=repost!$A${}'.format(cur_row)
})
# 注:其中categories表示x軸,values表示y軸,line表示線條樣式,name表示圖例項
# 下面分別以行和列的方式將標題欄、業務名稱、流量資料寫入單元格,並引用不同的格式物件
worksheet.write_row('A1',title,title_formatter)
worksheet.write_column('A2',buname,formatter)
# 寫入第2到第6行的資料,並將第2~6行資料加入圖表系列
for i in range(2,7):
worksheet.write_row('B{}'.format(i),data[i-2],formatter)
# 計算平均流量欄資料並寫入
worksheet.write_formula('I{}'.format(i),'=AVERAGE(B{}:H{})'.format(i,i),ave_formatter)
# 將每一行資料加入圖表序列
chart_series(str(i))
# 設定圖表大小
chart.set_size({'width':577,'height':287})
# 設定圖表大標題
chart.set_title({'name':u'zabbix監控告警週報表'})
# 設定y軸小標題
chart.set_y_axis({'name':''})
# 在A8單元格插入圖表
worksheet.insert_chart('A8',chart)
# 關閉Excel文件
workbook.close()
使用Grafana實現監控告警報表視覺化