pythondingtalk钉钉群告警消息发布(代码片段)

liwenchao1995 liwenchao1995     2023-05-05     602

关键词:

python dingtalk钉钉群告警消息发布

公司用oprator部署的prometheus,理论上时可以直接通过alertmanager的配置。通过钉钉机器人的webhook向群里发送告警信息。但是想要格式化输出格式,并且规范化就成了问题。因为每个人都有部署exporter的权限,我不能保证每个exporter下面的desc都能跟我想要的格式一样,所以我需要重新整理每个告警信息,根据告警信息规范,格式化输出告警信息

Dingtalk简介

我们可以通过webhook直接向群发起消息,但是对于一些比较复杂的场景,比如格式化输出,投票选择,发送图片处理就稍微有些麻烦,这里可以采用Dingtalk,它的原理其实就是对钉钉的消息格式做了下封装,方便我们去使用发送各种消息,这里我用python写的脚本,所以在github上找了一个python对应的Dingtalk github地址
我也fork了这位作者一份到我的github,在此给作者点个赞,详细使用说明可以看到基本,下面是我的脚本

钉钉告警消息通知脚本

我的思路是先向alert发起请求,获取到json后处理,把告警信息保存到我自己创建的数组或者字典里,再for循环处理,否则直接处理json会造成不必要的资源损耗。再追加生成新的告警信息,发送到钉钉群。

#!/usr/bin/python
# -*- coding:utf-8 -*-
# BY:wenchao.Li time: 2021/10/8
from collections import namedtuple
import requests
import json
from dingtalkchatbot.chatbot import DingtalkChatbot, ActionCard, CardItem
from apscheduler.schedulers.background import BackgroundScheduler
from flask import Flask
import atexit
import time

#定义发生严重告警的字典
disk_warn_list=[]
alive_warn_list=[]
cpu_warn_list=[]
memory_warn_list=[]

app = Flask(__name__)

def GetJsonFromAlert():
  # Alertmanager API 地址
  url = "http://liwenchao1995:301230/api/v2/alerts"
  # 发送请求
  response = requests.get(url)
  # 解析响应
  if response.status_code == 200:
     json_data = json.loads(response.text)   
     length_json=len(json_data) 
     init_len=0
     
     for init_len in range(length_json): 
       try:
	     #判断json的告警信息里是不是以idc-zgc-exporter开头,如果是,就获取它的一些信息,把这些信息存储到字典里,再把字典当作一个元素存储到列表里。
         if json_data[init_len]["labels"]["job"].lower().startswith("idc-zgc-exporter"):
           #定义存储到列表中告警的信息
           # print(GetInfoFromLable(json_data,init_len,"job"))
            alertname=GetInfoFromLable(json_data,init_len,"alertname")
            instance=GetInfoFromLable(json_data,init_len,"instance")
            severity=GetInfoFromLable(json_data,init_len,"severity")
            if alertname == "HighDiskUsage":
               disk_warn_list.append("alertname":alertname,"instance":instance,"severity":severity,"message":"磁盘告警") 
            if alertname == "InstanceDown":
               alive_warn_list.append("alertname":alertname,"instance":instance,"severity":severity,"message":"主机存活告警") 
            if alertname == "HighCpuUsage":
               cpu_warn_list.append("alertname":alertname,"instance":instance,"severity":severity,"message":"Cpu告警") 
            if alertname == "HighMemoryUsage":
               memory_warn_list.append("alertname":alertname,"instance":instance,"severity":severity,"message":"内存告警") 
         else:
            pass
       except KeyError:
         pass
  else:
    print("Failed to connected alerts:", response.text)

def GetInfoFromLable(json_data,init_len,key):
  return json_data[init_len]["labels"][key]

#发起告警信息
def TalkToDingding():
  GetJsonFromAlert()
  webhook = \'https://oapi.dingtalk.com/robot/send?access_token=1231318631d30103da dadasdasdadf1dc62c4870dasda
  xiaoding = DingtalkChatbot(webhook)  # 方式一:通常初始化方式
  # Text消息@所有人
  # xiaoding.send_text(msg=\'dingtalk test warning\', is_at_all=True)
  
  #定义tuple,方便下面调用参数,防止参数过长不美观
  warninfo = namedtuple(\'warninfo\', [\'lever\', \'number\', \'lists\'])
  disk_warn = warninfo("circtl", len(disk_warn_list), GetDictValueInList(disk_warn_list))
  alive_warn = warninfo("circtl", len(alive_warn_list), GetDictValueInList(alive_warn_list))
  cpu_warn = warninfo("circtl", len(cpu_warn_list), GetDictValueInList(cpu_warn_list))
  memory_warn = warninfo("circtl", len(memory_warn_list), GetDictValueInList(memory_warn_list))
  text = Build_Warn_Text(alert_text,disk_warn,alive_warn,cpu_warn,memory_warn)
  xiaoding.send_markdown(title=\'监控报警通知\\n\', text=text, at_mobiles=["18201212313","1712307676"]) 

#定义初始化告警信息,这里加了一张我自己制作的图片
alert_text = \'> ![告警](https://img2023.cnblogs.com/blog/2654447/202304/2654447-20230428140432929-998719694.png)\\n\' \\
       \'> #### [本地监控] 发生告警\\n\'

#构建告警信息
def Build_Warn_Text(alert_text,disk_warn,alive_warn,cpu_warn,memory_warn):
  if alive_warn.number != 0:
    # 主机存活告警部分
    alert_text += \'> ### 主机存活告警\\n\' \\
           \'> * 告警级别: ``\\n\' \\
           \'> * 告警条数: ``\\n\' \\
           \'> * 告警列表: ``\\n\' \\
           \'>.\\n\'.format(alive_warn.lever, alive_warn.number, alive_warn.lists)
  if disk_warn.number != 0:
  # 磁盘告警部分
    alert_text += \'> ### 磁盘告警\\n\' \\
           \'> * 告警级别: ``\\n\' \\
           \'> * 告警条数: ``\\n\' \\
           \'> * 告警列表: ``\\n\' \\
           \'>.\\n\'.format(disk_warn.lever, disk_warn.number, disk_warn.lists)
  if cpu_warn.number != 0:
    # CPU告警部分
    alert_text += \'> ### CPU告警\\n\' \\
           \'> * 告警级别: ``\\n\' \\
           \'> * 告警条数: ``\\n\' \\
           \'> * 告警列表: ``\\n\' \\
           \'>.\\n\'.format(cpu_warn.lever, cpu_warn.number, cpu_warn.lists)
  if memory_warn.number != 0:
    # 内存告警部分
     alert_text += \'> ### 内存告警\\n\' \\
           \'> * 告警级别: ``\\n\' \\
           \'> * 告警条数: ``\\n\' \\
           \'> * 告警列表: ``\\n\' \\
           \'>.\\n\'.format(memory_warn.lever, memory_warn.number, memory_warn.lists)
  return alert_text

def GetDictValueInList(listname):
  list_init=[]
  for dicts in listname:
      warn_host_list=dicts[\'instance\']
      list_init.append(warn_host_list)
  return list_init

#添加TalkToDingding到定时任务,每30秒运行一次
scheduler = BackgroundScheduler()
scheduler.add_job(func=TalkToDingding, trigger=\'interval\', seconds=10)
#scheduler.add_job(func=TalkToDingding, trigger=\'interval\', minutes=30)
scheduler.start() 
atexit.register(lambda: scheduler.shutdown())
  
#flask框架,后台运行
if __name__ == \'__main__\':
    app.run()

上面脚本还有些瑕疵,比如告警级别我没获取直接写死了,后面有时间会再优化

钉钉群机器人通知中的图片,突然不显示了

监控告警使用钉钉作通知,告警触发和告警解除的通知消息使用了2张图片:本来运行的好好的,也运行快一年了,最近告警解除这张图片突然不显示了:但是告警触发还正常:本来还以为是这个地址的图... 查看详情

python3钉钉加签名钉钉群机器人告警脚本(代码片段)

钉钉群聊关于为何设置加签名?这里主要是想着使用起来更方便,因为签名这块更加灵活全网普遍用自定义关键词多,不予置评添加群机器人智能群助手添加机器人自定义机器人设置加签复制一下签名SEC,后边会用到... 查看详情

快速实现钉钉告警通知处理告警关闭告警

钉钉目前已经成为大多数公司必备的软件,无论是上下班快速方便的远程打卡,从而避免了迟到的尴尬局面;还是快速的接收公司第一手消息,从而有效的加快工作的效率。对于实现告警通知到钉钉群当中,目前部分主流监控系... 查看详情

通过钉钉群聊机器人推送zabbix告警

1、首先在zabbix服务端的alertscripts目录下新建一个dingding.sh脚本,内容如下:#!/bin/bashContent=$2curl‘https://oapi.dingtalk.com/robot/send?access_token=XXXX‘  -H‘Content-Type:application/json‘  -d‘&nbs 查看详情

python3钉钉加签名钉钉群机器人巡检告警脚本(代码片段)

本文接上文python3钉钉加签名钉钉群机器人告警脚本https://blog.csdn.net/frdevolcqzyxynjds/article/details/128455191catdd-os-t1.py#!/usr/bin/envpython3#encoding=utf-8importjsonimportsysfromhdfsimport*importjsonimporthashlibimportbase64importhmacimporttimeimportrequestsfromurllib.... 查看详情

python3钉钉加签名钉钉群机器人巡检告警脚本(代码片段)

本文接上文python3钉钉加签名钉钉群机器人告警脚本https://blog.csdn.net/frdevolcqzyxynjds/article/details/128455191catdd-os-t1.py#!/usr/bin/envpython3#encoding=utf-8importjsonimportsysfromhdfsimport*importjsonimporthashlibimportbase64importhmacimporttimeimportrequestsfromurllib.... 查看详情

python3钉钉加签名钉钉群机器人告警脚本(代码片段)

钉钉群聊关于为何设置加签名?这里主要是想着使用起来更方便,因为签名这块更加灵活全网普遍用自定义关键词多,不予置评添加群机器人智能群助手添加机器人自定义机器人设置加签复制一下签名SEC,后边会用到... 查看详情

canoe/capl,钉钉群助手消息通知

查看详情

canoe/capl,钉钉群助手消息通知

查看详情

canoe/capl,钉钉群助手消息通知

查看详情

巧用钉钉群机器人定时推送单图文消息

参考技术A对钉钉群群主或管理员来说,每个钉钉群都可以添加一个或多个钉钉群自定义机器人,利用它为钉钉群推送消息。下面我教大家如何新建一个自定义机器人,并定时为这个群推送单图文消息。这是我在七夕节为钉钉群... 查看详情

zabbix--钉钉告警(代码片段)

zabbix钉钉告警机制群机器人是钉钉群的高级扩展功能,群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步。例如:通过聚合GitHub,GitLab等源码管理服务,实现源码更新同步;通过聚合Trello,JIRA等项目协调... 查看详情

怎么加入钉钉群

钉钉可以通过扫一扫群二维码或搜索群名加入。钉钉(DingTalk)是中国阿里巴巴集团推出的企业版即时通讯应用软件,提供多种语言、支持多种操作系统,由阿里巴巴集团开发,于2015年正式上线。该平台免费提供给所有中国企业... 查看详情

nodejs通过钉钉群机器人推送消息(代码片段)

nodejs通过钉钉群机器人推送消息Intro最近在用nodejs写,之前的nodejs爬虫代码用js写的,感觉可维护性太差,也没有智能提示,于是把js改用ts(typescript)重写一下,提升代码质量。爬虫启动之后不定期会出现验证码反爬虫,需要输入... 查看详情

如何申请钉钉机器人接口

参考技术A钉钉群机器人钉钉群机器人是一个高级扩展功能,只要有一个钉钉账号,就可以使用它。它可以将第三方信息聚合到钉钉群中,实现信息自动同步。支持Webhook协议的自定义接入,通过发明者量化机器人,将提醒、报警... 查看详情

aop实现系统告警(代码片段)

...息来警示我们去干预,尽早处理。二、告警的方式1、钉钉告警通过在企业钉钉群,添加群机器人的方式,通过机器人向群内发送报警信息。至于钉钉机器人怎么创建,发送消息 查看详情

钉钉群机器人怎么弄钉钉群机器人设置方法

参考技术A钉钉群机器人的设置方法如下:打开一个钉钉群,在群设置中找到智能群助手;在智能群助手窗口上,点击“添加机器人”;如需要添加敬业签软件在钉钉群中推送待办事件定时提醒的机器人,可添加“自定义”机器... 查看详情

一、python开发的服务程序,调用钉钉接口向钉钉群推送信息的软件能申请专利吗?

...是申请专利的事!!!一、用python开发的服务程序,通过钉钉开发接口向钉钉群推送文字和图片信息的软件,能申请专利吗?二、开发的钉钉小程序与后台服务程序能申请专利吗?整套软件为对数据进行分析,把分析结果(文字... 查看详情