编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

zabbix 钉钉报警带监控波动图(zabbix实现钉钉报警)

wxchong 2024-10-25 17:45:04 开源技术 64 ℃ 0 评论

由于项目需要,自己弄了一个钉钉报警带监控波动图的功能,网上找了下都没有符合要求的脚本,所以自己就编写了一个,脚本里引用了dingding的python库用模拟登录(shell脚本实现)。我这个只是给大家一个参考,希望大家在此基础上做一个更好的功能来。

要做以下工作
1 在/opt/建立zabbix_alert_images目录,主要是存放报警时候存储的图片位置
2 http://192.168.1.2:81/脚本里地址是我自己搭建的一个webdav服务器,这个网上大家一搜就有,目的是存放报警的图片,也就是在/opt/zabbix_alert_images目录里的图片,为什么还在要这台服务器里存储,是在因为我们的zabbix服务器是在内网,不想映射公网的一个地址,所以就得借助外网的一台webdav服务器来转存下,这样钉钉在调取图片才会正常显示的。192.168.1.2这里只是一个例子,其实他是一个可以在外网正常访问的一台服务器
3 zabbix配置运作时候要配置成这样才行,如下
告警主机:{HOST.NAME},IP地址:{HOST.CONN}在{EVENT.DATE}-{EVENT.TIME}{TRIGGER.NAME},告警监控项:({ITEM.ID}),请尽快处理
以上可以大家随便 定义的,主要得有告警监控项:({ITEM.ID}),是通过它来找到报警时候的监控图的。
4 我当时测试时候钉钉报警第一次可以正常抓取到报警时候的图片,可是同一个报警他就只显示我第一次抓取时候的图片,时间一直在那,可能钉钉缓存的关系,所以我在脚本里写了一个随机字符串的一个功能,生成的图片是随机,这样钉钉就不会以为是同一个图片了,也就不缓存,也就实现了报警时候抓取的图片是正常的。
以上做完后大家就可以试试你的zabbix效果了,看看是不是和我的一样了。
有什么问题大家尽管提,一起交流下。
报警脚本放在/usr/lib/zabbix/alertscripts目录里,权限是nginx,我这里搭建的是nginx+php+zabbix,大家根据自己配置情况把脚本放在相应报警脚本里即可。

a.sh

#!/bin/bash
ItemID=$1
cookie=/tmp/zabbix-cookie.txt
name="admin"
password="zabbix"
url=http://10.1.1.1/zabbix
#设定工作目录 
cd /opt/zabbix_alert_images
#模拟登录zabbix
/usr/bin/curl -k -c $cookie -b $cookie  -d "request=&name=$name&password=$password&autologin=1&enter=Sign+in" $url/index.php
#graphid=939
period1=3600
stime1=`/bin/date +%Y%m%d%H%M%S`
width1=800
/usr/bin/curl -k -b $cookie -F "period=$period1" -F "isNow=1" -F "itemids[0]=$ItemID" -F "type=0" -F "profileIdx=web.item.graph" -F "profileIdx2=29123" -F "width=1387" $url/chart.php > /opt/zabbix_alert_images/$ItemID.png

dingding脚本如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
from dingtalkchatbot.chatbot import DingtalkChatbot
import urllib2,chardet,random,string
import sys,json,re,os,requests
#from urllib.parse import urljoin
from urlparse import urljoin
def get_imgurl():        #获取监控项波动图片地址
    ItemID = re.search('(告警监控项:.*\()(.*)(\))', sys.argv[1]).group(2)
    png_url = zabbix_url + "chart.php?period=3600&isNow=1&itemids%5B0%5D=" + ItemID + "&type=0&profileIdx=web.item.graph&profileIdx2=29123&width=1387"
    return ItemID 
if __name__ == '__main__':
    defaultencoding = 'utf-8'
    if sys.getdefaultencoding() != defaultencoding:
        reload(sys)
        sys.setdefaultencoding(defaultencoding)
    
    zabbix_url = 'http://10.1.1.1/zabbix/' 
    itemid = get_imgurl()
    os.environ['itemid']=str(itemid)
    #根据itemid转换成png文件
    os.system("/usr/lib/zabbix/alertscripts/a.sh ${itemid}") 
    with open("/opt/zabbix_alert_images/a.txt","a") as f:
         f.write(sys.argv[1]+'\n')
    #把png文件上传到webdav服务器中
    os.chdir("/opt/zabbix_alert_images/")
    #生成随机字符串改名
    ran = ''.join(random.sample(string.ascii_letters + string.digits, 8))
    os.rename(itemid+".png",ran+".png")
    BASE_URL = 'http://192.168.1.2:81'
    def put(name):
        url = urljoin(BASE_URL, name)
        response = requests.put(url, data=open(name, 'rb'))
        response.raise_for_status()
    file_png = ran + ".png"
    put(file_png)
    def del_file(name):
        url = urljoin(BASE_URL, name)
        response = requests.delete(url)
        response.raise_for_status()
    # WebHook地址
    webhook = 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx'
    # 初始化机器人小丁
    xiaoding = DingtalkChatbot(webhook)
    #发送带图片的钉钉告警信息
    webdav_url = "http://192.168.1.2:81/" + file_png
    MSG = ''
    for i in sys.argv[1].split(','):
        MSG += i + '\n\n'
    xiaoding.send_markdown(title='xx监控', text='#### xx监控\n'
                           '> 监控图表\n\n'
                           '> ![实际图表]' + '(' + webdav_url + ')' + '\n'
                           '> ######' + '\n\n' + MSG,
                           is_at_all=True)
    #清空日志文件
    d = open("/opt/zabbix_alert_images/a.txt","r+")
    d.truncate()

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表