You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 08:56:09