hook发送给服务器的消息,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 + '##' + '\n'

'状态:%s' %status + '\n'

'告警级别:%s' %serverity + '\n'

'分组名称:%s' %job + '\n'

'IP地址:%s' %instance + '\n'

'开始时间:%s' %start_time + '\n'

)

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)

fe4bf63e73e684169ec0c7322a9c5ad3.png