1. 程式人生 > >zabbix監控告警表報統計

zabbix監控告警表報統計


傳送郵件的指令碼

#!/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實現監控告警報表視覺化