zabbix监控告警表报统计

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiegh2014/article/details/79604822


发送邮件的脚本

#!/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实现监控告警报表可视化



猜你喜欢

转载自blog.csdn.net/xiegh2014/article/details/79604822