Prometheus 是否支持 webhook?

Does Prometheus supports webhooks?

我们有一项任务是从普罗米修斯接收警报到我们的内部系统。 prometheus 本身不是 alert manager,只是 Prometheus server,我们可以像 alert-manager 一样接收 webhooks 吗?

can we receive webhooks like the alert-manager?

如果您将应用程序配置为 Alertmanager,则可以接收来自 Prometheus 的 HTTP POST 请求:

# prometheus.yml
alerting:
  alertmanagers:
  - static_configs:
    - targets:
       - your-app.com:80

不过,这基本上意味着您必须重新发明 Alertmanager API,我认为这不是明智之举,因为您必须跟上 API 的变化。如果你只是 运行 一个 Alertmanager 实例并配置 a webhook endpoint.

会更容易制作和维护

如果前面的陈述没有说服您反对直接从 Prometheus 接收推送的想法,这里有几件事可以帮助您解决问题:

  1. 来自 Prometheus (v2.29.2) 的示例 POST 请求:
[
    {
        "endsAt": "2022-01-20T18:03:41.955Z",
        "generatorURL": "http://prometheus.example.com:9090/graph?g0.expr=up+%3D%3D+1&g0.tab=1",
        "labels": {
            "alertname": "Test",
            "foo": "bar",
            "job": "test"
        },
        "startsAt": "2022-01-20T17:24:41.955Z"
    },
    ...
]
  1. Alertmanager 源代码:https://github.com/prometheus/alertmanager
  2. 打印传入请求的简单 HTTP 服务器。我用它来获取 p.1:
#!/usr/bin/env python3
import json
from flask import Flask, request


app = Flask(__name__)


@app.route('/', defaults={"err": ""})
@app.errorhandler(404)
@app.errorhandler(405)
def print_request(err):
    if request.json:
        body = json.dumps(request.json, indent=4, sort_keys=True)
    elif request.form:
        body = request.form
    else:
        body = request.data

    print(f"{request.method} {request.path}\n"
          "#################### HEADERS ###################\n"
          f"{request.headers}"
          "--------------------- BODY ---------------------\n"
          f"{body}")
    return "OK\n"


if __name__ == '__main__':
    app.run("0.0.0.0", port=8000)