深色模式
Webhook 对接自研系统
摘要:Webhook 是最通用的接收方式——Alertmanager 把告警以 JSON POST 给一个 URL,你写个小服务接收并落库/建单/联动。本文给一个最小 Python 接收端示例。
适用环境
- 已运行 Alertmanager
- 一台能跑 Python 的机器(接收端),与 Alertmanager 网络互通
操作步骤
1. 写最小接收服务
python
# receiver.py 依赖: pip install flask
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def webhook():
data = request.get_json(force=True)
for a in data.get('alerts', []):
print(a['labels'], a['annotations'])
return jsonify(status='ok')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5001)1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
2. 在 Alertmanager 配置 receiver
yaml
receivers:
- name: 'self-system'
webhook_configs:
- url: 'http://10.0.0.10:5001/webhook'
send_resolved: true # 恢复时也通知1
2
3
4
5
2
3
4
5
3. 启动并加载
bash
python3 receiver.py &
amtool check-config /etc/alertmanager/alertmanager.yml
curl -X POST http://localhost:9093/-/reload1
2
3
2
3
DANGER
接收端务必返回 2xx,否则 Alertmanager 会按 retry 一直重试;不要在接收端做耗时操作阻塞响应。
验证
bash
# 手动发一条告警
amtool alert add alertname=TestWebhook severity=warning
# 接收端应打印 labels/annotations;也可 curl 自测:
curl -XPOST http://10.0.0.10:5001/webhook -H 'Content-Type: application/json' \
-d '{"alerts":[{"labels":{"alertname":"x"},"annotations":{"summary":"hi"}}]}'1
2
3
4
5
2
3
4
5
常见坑
WARNING
- Webhook payload 体积可能很大(大量 alerts),接收端要限制 body 大小,避免被网关截断。
send_resolved: true一定要配,否则恢复事件丢失,自研系统永远显示“未恢复”。