python通过webhook发送告警消息
说明:
当触发prometheus的告警规则后,prometheus会通过alertmanager的接口将告警信息传递给alertmanager,alertmanager通过webhook将告警信息以json的形式传递给python脚本。python脚本使用flask进行实时获取数据,然后发送消息到钉钉群
python脚本:
#!/usr/bin/python # -*- coding: utf-8 -*- import json import os from flask import request, Flask #flask模块 from dingtalkchatbot.chatbot import DingtalkChatbot #钉钉发送群消息模块 #将数据写入到文件中 def Open(s): Path = ./temp.json #判断文件是否存在 if os.path.exists(Path): os.remove(Path) #先删除文件 #文件不存在时,将数据写入到文件中 f = open(Path, w) print(s, file = f) f.close() #接收数据 def GetData(): PostData = request.get_data() # 获取jira POST请求的原始数据 Data = json.loads(PostData) # 将json格式的数据转换为字典 JsonData = json.dumps(Data, ensure_ascii=False, indent=4) #格式化json数据 return Data #Open函数和GetData函数用作获取数据,对数据进行分析使用 #Flask通用配置 app = Flask(__name__) app.config[JSON_AS_ASCII] = False @app.route(/webhook/test/, methods=[POST]) def IssueCreate(): # Open(GetData()) description = GetData()[commonAnnotations][description] status = GetData()[status] serverity = GetData()[alerts][0][labels][severity] job = GetData()[alerts][0][labels][job] instance = GetData()[alerts][0][labels][instance] start_time = GetData()[alerts][0][startsAt] message = str(## + Prometheus告警:%s %description + ## + 状态:%s %status + 告警级别:%s %serverity + 分组名称:%s %job + IP地址:%s %instance + 开始时间:%s %start_time + ) print(message) send_message(message) return "OK", 200 def send_message(message): webhook = {钉钉机器人URL地址} xiaoding = DingtalkChatbot(webhook) xiaoding.send_text(msg=message, is_at_all=True) #is_at_all参数为True表示@所有人 if __name__ == __main__: app.run(debug = False, host = {脚本所在服务器的IP地址}, port = 8888)
根据脚本中的接口配置alertmanager中的webhook
修改alertmanager的配置文件:alertmanager.yml
...省略... receivers: #多加一个name即可 - name: default webhook_configs: - url: http://{脚本服务器的IP地址}:8888/webhook/test/ send_resolved: true - name: email email_configs: - to: {邮箱} send_resolved: true
测试
运行python脚本,创造一个触发报警的条件,(我直接简单粗暴,停掉了node_exporter)