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)

经验分享 程序员 微信小程序 职场和发展