Zabbix告警发送性能图

前言:

实现zabbix告警发送性能图主要实现思路:

zabbix告警传入item.ky参数 -> 利用item.key获取当前的性能图 -> 保存到本地 -> 在发送邮件的时候构建邮件文本内容

首先先讲一下zabbix的性能图:

http://127.0.0.1/zabbix/chart.php?period=864000&stime=20180317191110&itemids%5B0%5D=25464&type=0&updateProfile=1&profileIdx=web.item.graph&profileIdx2=25464&width=1778&sid=37a0a2403c5192c8&screenid=&curtime=1490613155473

分析上面链接,调试后发现如下:

period       # zabbix数据时间范围
stime        # 开始时间
itemids[0]   # item.key
type         # 图表类型
profiledx    # 项类型
width        # 图表宽度
sid          # 用户sid

必须的参数有:

"period"  : "3600"               # 一小时内的性能图
"itemids[0]" : itemID            # item的id
"type" : "0"                     # 图表类型
"profileIdx" : "web.item.graph"  # 项
"width"  : "700"                 # 宽度

仔细观察这些参数,其实发现变化的只有itemid 其他都是可以不变的,查看官网发现item.ky是在告警的时候可以直接传入的:

https://www.zabbix.com/documentation/3.2/manual/appendix/macros/supported_by_location

→ Trigger-based notifications
→ Internal notifications

意思就是说包含在 {ALERT.MESSAGE} 里面

在Actions动作里面可以自定义传入item.key的宏。具体配置:

我是在actions里将我需要的参数配置进去

actions -> Default message 传入

HOST.HOST1:{HOST.HOST1}|HOST.IP1:{HOST.IP1}|EVENT.DATE:{EVENT.DATE}|
EVENT.TIME:{EVENT.TIME}|TRIGGER.SEVERITY:{TRIGGER.SEVERITY}|
TRIGGER.NAME:{TRIGGER.NAME}|ITEM.KEY1:{ITEM.KEY1}|ITEM.NAME1:{ITEM.NAME1}|
ITEM.VALUE1:{ITEM.VALUE1}|ITEM.ID:{ITEM.ID}|TRIGGER.STATUS:{TRIGGER.STATUS}

配置完成后,zabbix告警的时候会发出item.ky,获取到item.key后就要让脚本接收到参数

D = {}
subject = sys.argv[2]
J = sys.argv[3].replace("‘","").replace("\"","").replace(" ","").split("|")
for i in range(0,len(J)):
    D[J[i].split(":")[0]] = J[i].split(":")[1]

triggerHost = "<strong>告警主机: </strong>%s (%s)" % (D[‘HOST.HOST1‘],D[‘HOST.IP1‘])
triggerTime = "<strong>告警时间: </strong>%s %s" % (D[‘EVENT.DATE‘],D[‘EVENT.TIME‘])
triggerLevel = "<strong>告警等级: </strong>%s" % (D[‘TRIGGER.SEVERITY‘])
triggerName  = "<strong>告警信息: </strong> %s" % (D[‘TRIGGER.NAME‘])
triggerKey = "<strong>告警项目: </strong> %s" % (D[‘ITEM.KEY1‘])
triggerText = "<strong>问题详情: </strong>%s %s" % (D[‘ITEM.NAME1‘],D[‘ITEM.VALUE1‘])
triggerItemID = D[‘ITEM.ID‘]
if D[‘TRIGGER.STATUS‘] == ‘OK‘:
    triggerStatus = "<strong>当前状态: </strong><span style=‘font-weight:bold;color:green;‘>%s</span>" % (D[‘TRIGGER.STATUS‘])
    mailSubject = ‘<div style="border-bottom:1px #D9D9D9 solid;font-size:18px;line-height:40px;color:#7BB009;">故障恢复</div>‘
else:
    triggerStatus = "<strong>当前状态: </strong><span style=‘font-weight:bold;color:red;‘>%s</span>" % (D[‘TRIGGER.STATUS‘])
    mailSubject = ‘<div style="border-bottom:1px #D9D9D9 solid;font-size:18px;line-height:40px;color:#F00000;">故障通知</div>‘

上面我将参数接收后进行一个处理,处理完这些参数,我们要利用获取到的item来获取性能图:

import requests
myRequests = requests.Session()

def GetGraph(itemID,pName=None):
    
    try:
        loginUrl = "http://%s/zabbix/index.php" % HOST
        print loginUrl
        loginHeaders={
            "Host":HOST,
            "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
        }
        playLoad = {
            "name":USER,
            "password":PASSWD,
            "autologin":"1",
            "enter":"Sign in",
        }
        res = myRequests.post(loginUrl,headers=loginHeaders,data=playLoad)
        
        testUrl = "http://%s/zabbix/chart.php" % HOST
        testUrlplayLoad = {
            "period" :"3600",
            "itemids[0]" : itemID,
            "type" : "0",
            "profileIdx" : "web.item.graph",
            "width" : "700",
        }
        testGraph = myRequests.get(url=testUrl,params=testUrlplayLoad)
        IMAGEPATH = os.path.join(‘/tmp‘, pName)
        f = open(IMAGEPATH,‘wb‘)
        f.write(testGraph.content)
        f.close()
        return pName
    except Exception as e:
        print e
        return False
    finally:
        myRequests.close()

这样传入item的参数就可以获取到的图片到本地/tmp目录下。

获取到图片之后,再进行一个邮件构建,就可以完成啦,下面是邮件的构建部分:

mailText = """
<html xmlns="http://www.w3.org/1999/xhtml">
<html><head><meta charset="utf-8" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>$sub</title></head>
<body style="margin:0;padding:0;">

<table cellspacing="0" cellpadding="0" width="100%%" style="min-height:69px;border:1px #7BB009 solid;border-top-width:6px;font-family:‘微软雅黑‘,sans-serif;font-size:14px;">
<tbody><tr><td><center><div style="text-align:left;max-width:100%%;min-height:69px;"><div style="float:left;height:69px;">
<img style="border:none;" src="%s" height="50"  width="200" alt="591" title="591"/>
</a></div></div></center></td></tr></tbody></table>
<table cellspacing="0" cellpadding="0" width="100%%" style="border:1px #7BB009 solid;border-width:0 1px 0 1px;font-family:‘微软雅黑‘,sans-serif;font-size:13px;">
<tbody><tr><td><center><div style="max-width:100%%;text-align:left;border-bottom:1px #D9D9D9 dashed;padding-bottom:20px;font-size:13px;">
<table width="100%%" cellspacing="0" cellpadding="8" style="font-size:13px;"><tbody><tr><td>
%s</td></tr><tr><td>
%s</td></tr><tr><td>
%s</td></tr><tr><td>
%s</td></tr><tr><td>
%s</td></tr><tr><td>
%s</td></tr><tr><td>
%s</td></tr><tr><td>
%s</td></tr><tr><td>
<img src="cid:p"></tr><tr><td>
</td></tbody></table></td></tr></tbody></table></div></center>	</td></tr></tbody></table>
<table cellspacing="0" cellpadding="0" width="100%%" style="border:1px #7BB009 solid;border-top:none;font-family:‘微软雅黑‘,sans-serif;font-size:12px;line-height:35px;padding-bottom:30px;"></table></body>
</html>
""" % (logPng,mailSubject,triggerHost,triggerTime,triggerLevel,triggerName,triggerKey,triggerText,triggerStatus)

def SendMail(Recipient,Subject,Text,Img=None):
    msg = MIMEMultipart(‘alternative‘)
    msg[‘From‘]= "%s<%s>" % (MAILNAME,MAILUSER)
    msg[‘Subject‘] = Header(Subject,‘utf-8‘).encode()
    msg[‘To‘] = Recipient
    if Img :
        fp = open(Img,‘rb‘)
        msgImage = MIMEImage(fp.read())
        fp.close()
        msgImage.add_header(‘Content-ID‘,‘p‘)
        msg.attach(msgImage)
    part = MIMEText(Text, ‘html‘, ‘utf-8‘)
    msg.attach(part)

    smtp = smtplib.SMTP_SSL(SMTPSERVER,‘465‘)
    try:
        smtp.login(MAILUSER,MAILPASS)
        smtp.sendmail(MAILUSER,Recipient,msg.as_string())
    except Exception as e:
        print e
    finally:
        smtp.quit()

最后脚本最前面进行一个判断,判断一分钟内的性能图就不再重复去zabbix上读,直接从本地上读。

然后计划任务再计划清除图片

*/5 * * * * find /tmp  -cmin +1 -name ‘zabbix-graph-itemID*‘ -delete

最后效果图:

时间: 2024-08-13 13:50:01

Zabbix告警发送性能图的相关文章

一个简单好用的zabbix告警信息发送工具

之前使用邮件和短信发送zabbix告警信息,但告警信息无法实时查看或者无法发送,故障无法及时通知运维人员. 后来使用第三方微信接口发送信息,愉快地用了一年多,突然收费了. zabbix告警一直是我的痛点,近期发现一个基于个人微信号的信息发送工具-lykchat. 引用:http://blog.csdn.net/liyingke112/article/details/68955298 lykchat信息发送系统是Python3开发的,通过模拟微信网页端,基于个人微信号,为系统管理人员提供信息发送工

zabbix告警模板表格化

为了更好的用户体验,我们需要尽量美化我们的输出内容,尽量做到整齐划一,让人看了会有很舒服的感觉, 这个好像和苹果的产品一样,给人一种美感让人感觉非常享受. 一般我们的zabbix告警邮件就是纯文字,建议发送邮件的时候采用html的信体方式发送,并且表格化.颜色化输出. 下面是我的模板代码,可以根据自己的需求做调整: 1 <table border="1" bordercolor="black" cellspacing="0px" cellp

CMDB机柜平台结合zabbix告警展示

最近看了刘天斯老师的机柜展示平台,非常绚丽,而且有大屏显示的话也是能够体现运维价值的,这里就说下我最近在做的CMDB平台的一些数据: CMDB数据: 机房,机柜,机柜电源,机柜位置,机房合同,合同到期时间,机房联系人. 服务器,CPU,硬盘,是否虚拟化,宿主机,raid类型,内存. 资产ID,上架日期,下架记录,服务器代理商,代理商联系方式,服务器到保日期. IP地址,MAC地址,业务线,产品线,操作系统. 通信这块主要技术json-rpc,然后提供Api接口给程序调用,按照固定格式导入即可:硬

zabbix告警通知

之前使用邮件和短信发送zabbix告警信息,但告警信息无法实时查看或者无法发送,故障无法及时通知运维人员. 后来使用第三方微信接口发送信息,愉快地用了一年多,突然收费了. zabbix告警一直是我的痛点,近期发现一个基于个人微信号的信息发送工具-lykchat. lykchat信息发送系统是Python3开发的,通过模拟微信网页端,基于个人微信号,为系统管理人员提供信息发送工具. 实现的功能有用户登录管理.微信登陆管理和微信信息发送功能. 代码地址:https://github.com/lyko

微信企业号升级企业微信后zabbix告警发不出去

微信企业号升级企业微信后便没有zabbix告警发出,单独运行脚本报错: 进入接口调试页面http://qydev.weixin.qq.com/debug,输入CorpID和Secret,得到access_token: 之前的格式是: 于是修改告警脚本,之前获取access_token的语句是: 由于现在格式变了(由第四列变成了第10列),于是将$4改为$10,再次运行脚本还有错误: 提示"Invalid input",单独运行输出格式: 发现唯一有异常的地方是agentid列有空格,试

zabbix告警配置

告警概述 告警是监控的重要职能,是指将达到某一阈值时间的消息发给用户,让用户在事件发生的 时候即可知道监控项处于不正常状态,从而让用户来觉得是否采取相关措施. 在zabbix中,告警是由一系列的流程组成的,首先是触发器达到阈值,接下来是Action对 事件信息进行处理,其中包括两部分:第一部分是发送消息,即将告警信息发给用户:第 二部分是执行命令,即将事件用命令进行处理,达到时间故障自动尝试回复的效果. zabbix的告警流程如下: Host group(设备组) →Hosts(设备)→ App

Zabbix告警升级机制图文详解

Zabbix告警升级机制图文详解 配置目的 随着监控项目的增多,有一些警告性质的报警可能不许要让领导收到,如果监控项长时间处于一个反复报警的状态时,可能是没有人去解决 也可能是他们无法去解决的时候,再去向上级发送告警 那么zabbix就可以通过它的告警机制去实现 它可以通过自定义时间段,发送消息.命令 从而形成一个梯度的报警机制.通过下图解释梯度报警的设置方法. 简单的配置第个,剩下的配置类似,重点不在于如何配置这个,重点在于如何配置"告警升级"和发送时间的理解 配置图解 步骤持续时间

zabbix 告警小试

zabbix 告警小试 1. 实验内容简述 本次实验,旨在通过zabbix监控,实现对告警信息的实时通知,主要用到了zabbix中的item.trigger.action.user.user group.media等内容,通过item监控特定的对象,当item返回值满足一定条件的时候,触发触发器的action动作,通知相关的用户.实现的功能有以下几点: 监控的内容是什么 在什么样的情况下属于异常,需要通知 以什么样的方式通知用户,怎么通知 通知用户的内容是什么 2. 实验步骤 2.1 创建触发器

zabbix告警抑制

zabbix 告警抑制 本人认为告警抑制有两种方法:一种是触发器的依赖关系,一种是调整触发器触发动作的时间. 第一种告警抑制举例:路由器A----->路由器B------>路由器c 我们在监控网络设备的时候,三台设备上都对网口进行了监控监控,如果路由器A,的网络不通了,那么后边的 路由器B 和 路由器C 的网络肯定也就不通了,那么这时候三台路由器都会报警,没有办法确定谁得问题,但是我们添加触发器依赖关系, 触发器的依赖是这样的,A 依赖 B ,那么当B 发生告警之后,A 就不会再次告警, 由此