zabbix自动生成监控报表并定时发送邮件

实现思路:

  1. zabbix提供了一个获取事件的api,可以根据此api获取zabbix原始报警数据
  2. 将获取到的原始数据进行统计去重,统计触发器出现次数,并把重复的触发器删除,将需要用到的数据统一放到一个列表中
  3. 将第二步的列表进行遍历,并传入到HTML中,或者也可以使用pandas直接把数据建模,然后自动生成HTML表格
  4. 将生成的HTML作为邮件内容发送

定义获取的时间间隔

x=(datetime.datetime.now()-datetime.timedelta(minutes=30)).strftime("%Y-%m-%d %H:%M:%S")
y=(datetime.datetime.now()).strftime("%Y-%m-%d %H:%M:%S")
def timestamp(x,y):
    p=time.strptime(x,"%Y-%m-%d %H:%M:%S")
    starttime = str(int(time.mktime(p)))
    q=time.strptime(y,"%Y-%m-%d %H:%M:%S")
    endtime= str(int(time.mktime(q)))
    return starttime,endtime

这里是获取的30分钟的报警数据

获取事件数据

def getevent(auth,timestamp):
    data={
        "jsonrpc": "2.0",
        "method": "event.get",
        "params": {
            "output": [
                "name",
                "severity"
            ],
            "value":1,
            "time_from":timestamp[0],
            "time_till":timestamp[1],
            "selectHosts":[
                #"hostid",
                "name"
            ]
        },
        "auth": auth,
        "id": 1
    }
    getevent=requests.post(url=ApiUrl,headers=header,json=data)
    triname=json.loads(getevent.content)[‘result‘]  

通过zabbix api获取需要用到的事件内容,其中包含报警主机名,主机id,触发器,触发器严重性

将获取到的数据进行处理

triggers=[]
a={}
for i in triname:
     triggers.append(i[‘name‘])
for i in triggers:
     a[i]=triggers.count(i)
list2=[]
print(triname)
#print(a)
for key in a:
     b={}
     b[‘name‘]=key
     b[‘host‘]=[i[‘hosts‘][0][‘name‘] for i in triname if i[‘name‘]==key][0]
     b[‘severity‘]=[i[‘severity‘] for i in triname if i[‘name‘]==key][0]
     b[‘count‘]=a[key]
     list2.append(b)
return list2

这里是将重复出现的触发器进行去重并统计出现次数,将获取到的触发次数以及以前的信息都放到同一个表里,并传给HTML

将数据发送给HTML

def datatohtml(list2):
    tables = ‘‘
    for i in range(len(list2)):
        name,host,severity,count = list2[i][‘name‘], list2[i][‘host‘], list2[i][‘severity‘], list2[i][‘count‘]
        td = "<td>%s</td> <td>%s</td> <td>%s</td> <td>%s</td>"%(name, host, severity, count)
        tables = tables + "<tr>%s</tr>"%td
    base_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>%s</TABLE>
    </td>
    </tr>
    <tr>
    <td colspan="2" style="background-color:#FFA500;text-align:center;">
    zabbix告警统计</td>
    </tr>
    </table>
    </body>
    </html>
    """ %tables
    return base_html

将传入的列表进行遍历并传入HTML表格中

发送报表邮件

将生成的HTML通过邮件发送

def sendmail(base_html):
    from_addr = ‘[email protected]‘
    password = ‘没有故事的陈师傅‘
    to_addr = ‘[email protected]‘
    smtp_server = ‘smtp.qq.com‘

    msg = MIMEText(base_html, ‘html‘, ‘utf-8‘)
    msg[‘From‘] = from_addr
    msg[‘To‘] = to_addr
    msg[‘Subject‘] = Header(‘Zabbix本周监控报表‘, ‘utf-8‘).encode()

    try:
        server=SMTP(smtp_server,"25")   #创建一个smtp对象
        #server.starttls()    #启用安全传输模式
        server.login(from_addr,password)  #邮箱账号登录
        server.sendmail(from_addr,to_addr,msg.as_string())  #发送邮件
        server.quit()   #断开smtp连接
    except smtplib.SMTPException as a:
        print (a)

完整脚本可通过GitHub:https://github.com/sunsharing-note/zabbix/blob/master/zhoubao.py 获取,或者关注公众号“没有故事的陈师傅”,回复监控报表获取



欢迎关注个人公众号“没有故事的陈师傅”

原文地址:https://blog.51cto.com/12970189/2428022

时间: 2024-08-08 22:00:34

zabbix自动生成监控报表并定时发送邮件的相关文章

zabbix自动发现监控多台mysql

1: 前言 由于前面写的博客,zabbix自动发现监控redis.zabbix自动发现监控mongo这两篇博客虽然都能自动发现并监控,但是由于每个zabbix_agentd都得配置,监控起来非常不方便,因此,再做了个模板,能够自动发现并监控多台mysql.这个方法在监控mongo.redis或者mysql主从等时候也都适用. 2: 在zabbix_agentd下编写自动发现并监控多台mysql的脚本,脚本如下: #!/bin/sh #zhuangweihong 20160512 zabbix d

zabbix自动发现监控mongo

1: zabbix自动发现mongo监控的端口,并返回zabbix_server需要的格式,脚本部署在zabbix_agent上,路径为/usr/local/zabbix/zabbix_discover_mongo.sh,脚本内容如下: #!/bin/sh #zhuangweihong 20160419 zabbix discover mysql res=`sudo ss -tulnp|grep mongo|grep -v 28107|awk '{print $(NF-2)}'|awk -F':

Zabbix自动发现监控Mysql数据库

结果图展现 先让大家看下结果图,Zabbix通过自动发现监控Mysql每秒的增.删.改.查,通过自动发现监控Mysql的流入流出流量,结果图如下: Mysql给Zabbix监控的权限 首先创建一个监控用户,usage on为比较小的权限,较安全.sql如下 grant usage on *.* to 'monitor'@'127.0.0.1' identified by 'shijiangepwd'; flush privileges; 测试监控用户是否生效,测试结果如下 mysql -umon

使用 zabbix 自动发现监控 MySQL

介绍 使用 zabbix 的 low-level 自动发现功能完成单主机多端口的监控, 详见low_level_discovery, 整体上监控类似 percona 的 zabbix 监控插件, 不过使用 mymonitor.pl 替换了脚本 ss_get_mysql_stats.php, 而且配置有点不同. 具体代码及配置详见: zabbix_mysql 1. 结构说明: zabbix_mysql/ |-- README.md |-- bin | |-- get_mysql_stats_wra

zabbix自动发现监控redis

1: 在zabbix_agentd端编写自动发现的脚本,主要是自动发现redis的监控端口,脚本如下: vim /usr/local/zabbix/zabbix_discover_redis.sh #!/bin/sh #zhuangweihong 20160419 zabbix discover redis res=`sudo ss -tulnp|grep redis|awk '{print $(NF-2)}'|awk -F':' '{print $(NF)}'|sort -u` if [[ -

zabbix自动发现监控tomcat健康页面

一.背景 公司系统平台有10几个tomcat服务,由于需要服务保持全年无间断服务,特在tomcat中嵌入专门的监控页面,在curl 专用页面返回值为200时,则认定服务正常运行,否则报警发送专门的监控运维的邮箱. 二.原理 正常的tomcat健康状态监控页面如下图 我们利用如下命令判断返回值是否为200 shell>/usr/bin/curl -o /dev/null -s --connect-timeout 5 -w '%{http_code}' http://10.0.0.107:9100/

zabbix自动发现监控url

1.在监控客户机上 web_site_code_status.sh: #!/bin/bash # function:monitor tcp connect status from zabbix source /etc/bashrc >/dev/null 2>&1 source /etc/profile >/dev/null 2>&1 #/usr/bin/curl -o /dev/null -s -w %{http_code} http://$1/ web_site_

zabbix 自动发现监控端口(六)

一.配置脚本,将脚本分发到各个minion端 1.1.脚本内容 vim discover_port.sh  #!/bin/bash portarray=(`sudo netstat -tnlp|egrep -i "$1"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq`) length=${#portarray[@]} printf "{\n" printf  '\t'&q

zabbix 自动发现 监控 硬盘读写 disk io

直接 上配置: 1.配置文件 cat userparameter_harddisk.conf #discovery hard diskUserParameter=custom.vfs.discovery.diskname,/opt/app/zabbix-agent/scripts/check_harddisk.sh diskname_discovery#disk status# See https://www.kernel.org/doc/Documentation/ABI/testing/pr