警报 API
重要提示:Prometheus 会负责将警报发送到 Alertmanager。建议在 Prometheus 中基于时间序列数据配置警报规则,而不是直接向警报 API 发送警报,因为 Prometheus 支持许多特殊情况,可确保即使在 Alertmanager 崩溃或重启时,警报也能被正确投递。
您可以通过 APIv2 向 Alertmanager 发送警报。APIv2 是作为 OpenAPI 规范定义的,可以在此处 找到。
APIv1 在 Alertmanager 0.16.0 版本中被弃用,并在 0.27.0 版本中被移除。
要向 APIv2 发送警报,请向 api/v2/alerts 发送 POST 请求。您必须将 Content-Type 请求头设置为 application/json,并发送包含一组警报的 JSON 数据。
以下是一个示例:
[
{
"labels": {
"alertname": "<required_value>",
"<name>": "<value>",
...
},
"annotations": {
"<name>": "<value>",
},
"startsAt": "<RFC3339>",
"endsAt": "<RFC3339>",
"generatorURL": "<value>"
},
...
]
所有警报都包含标签、注释、可选的 startsAt 时间戳以及可选的 endsAt 时间戳。所有时间戳都应为 RFC3339 格式。
标签用于对同一警报的重复实例进行去重,而注释用于包含关于警报的其他信息,例如摘要、描述或运行手册 (runbook) 的 URL。
startsAt 时间戳是警报触发的时间。如果省略,Alertmanager 会将 startsAt 设置为当前时间。
endsAt 时间戳是警报应被视为已解决的时间。如果省略,Alertmanager 会将 endsAt 设置为当前时间 + resolve_timeout。
generatorURL 是一个唯一链接,指向警报的来源。例如,它可以链接到 Prometheus 中的触发规则。
客户端的期望
客户端需要定期向 Alertmanager 重新发送触发中的警报,直到警报被解决。
具体间隔取决于多个变量,例如 endsAt 时间戳,或者如果省略该时间戳,则取决于 resolve_timeout 的值。如果省略 endsAt 时间戳,Alertmanager 会将该警报现有的 endsAt 时间戳更新为当前时间 + resolve_timeout。
触发中的警报会在其 endsAt 时间戳过期后被解决。
为了确保已解决的警报能够发送解决通知,客户端还需要在警报解决后的 5 分钟内,继续向 Alertmanager 重新发送已解决的警报。由于 Alertmanager 是无状态的,这可以确保即使 Alertmanager 崩溃或重启,已解决的通知也能被成功发送。