如何通过Alertmanager接收Harbor推送的Webhook?(已开启Harbor Webhook)
Alertmanager接收Harbor Webhook事件的实现方案
一、Alertmanager是否支持接收Webhook?
Alertmanager本身没有专门的“接收任意Webhook”的接收器,但它提供了告警接收API(/api/v2/alerts),可以接收符合Prometheus告警格式的HTTP POST请求。由于Harbor发送的Webhook payload格式与该API要求的格式不匹配,因此无法直接对接,需要通过中间层做格式转换。
二、实现方式
核心思路是搭建一个轻量的格式转换服务,接收Harbor的Webhook事件,将其转换为Alertmanager可识别的告警格式后,转发到Alertmanager的告警接收API。以下是具体步骤:
1. 编写格式转换服务(以Python为例)
创建一个简单的Flask服务,实现请求转发与格式转换:
from flask import Flask, request, jsonify import requests import time app = Flask(__name__) # 替换为你的Alertmanager地址 ALERTMANAGER_API_URL = "http://<alertmanager-ip>:9093/api/v2/alerts" @app.route('/harbor-webhook-forward', methods=['POST']) def handle_harbor_webhook(): harbor_payload = request.get_json() if not harbor_payload: return jsonify({"status": "error", "message": "Empty payload"}), 400 # 提取Harbor事件核心信息 event_type = harbor_payload.get("type") event_data = harbor_payload.get("event_data", {}) repo_name = event_data.get("repository", {}).get("name") tag = event_data.get("resources", [{}])[0].get("tag") event_timestamp = harbor_payload.get("occur_at") # 转换为Alertmanager兼容的告警格式 alert_payload = [ { "labels": { "alertname": f"Harbor_{event_type}_Triggered", "repository": repo_name or "unknown", "event_type": event_type }, "annotations": { "summary": f"Harbor {event_type} 事件触发", "description": f"仓库: {repo_name or 'unknown'}, 镜像标签: {tag or 'unknown'}, 事件时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(event_timestamp))}", "raw_details": str(event_data) }, "startsAt": time.strftime('%Y-%m-%dT%H:%M:%SZ', time.localtime(event_timestamp)) } ] # 转发到Alertmanager try: response = requests.post(ALERTMANAGER_API_URL, json=alert_payload) response.raise_for_status() return jsonify({"status": "success"}), 200 except Exception as e: return jsonify({"status": "error", "message": str(e)}), 500 if __name__ == '__main__': app.run(host='0.0.0.0', port=8080)
2. 部署转换服务
将上述代码部署到服务器,确保Harbor和Alertmanager都能访问到该服务的端口(示例中为8080)。可以用Gunicorn等工具实现生产环境部署。
3. 配置Harbor Webhook
登录Harbor管理界面,进入目标项目的项目设置 -> Webhook:
- 添加新Webhook,目标URL填写转换服务的地址(如
http://<转换服务IP>:8080/harbor-webhook-forward) - 勾选需要触发的事件类型(如镜像推送、删除、漏洞扫描完成等)
- 保存后点击“测试”,确认Harbor能成功发送请求到转换服务
4. 配置Alertmanager路由与通知
在Alertmanager配置文件中,添加针对Harbor事件的路由规则,将告警转发到指定通知渠道:
route: group_by: ['alertname', 'repository'] group_wait: 30s group_interval: 5m repeat_interval: 1h receiver: 'harbor-events-handler' receivers: - name: 'harbor-events-handler' # 示例:配置邮件通知,可替换为企业微信、Slack等渠道 email_configs: - to: 'admin@your-domain.com' from: 'alertmanager@your-domain.com' smarthost: 'smtp.your-domain.com:587' auth_username: 'alertmanager@your-domain.com' auth_password: 'your-smtp-password'
重启Alertmanager使配置生效。
三、验证
触发Harbor中的目标事件(如推送一个镜像),检查转换服务日志是否收到请求,Alertmanager是否生成对应告警并发送通知。
内容的提问来源于stack exchange,提问作者Alexandr
相关产品推荐
相关产品推荐

