重要提示:Prometheus 负责将告警发送到 Alertmanager。建议在 Prometheus 中基于时间序列数据配置告警规则,而不是直接向告警 API 发送告警,因为 Prometheus 支持多种特殊情况,以确保即使 Alertmanager 崩溃或重启,告警也能被送达。
你可以通过 APIv2 向 Alertmanager 发送告警。APIv2 以 OpenAPI 规范定义,可以在此处找到。
APIv1 在 Alertmanager 0.16.0 版本中被弃用,并在 Alertmanager 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 格式。
标签用于对相同告警的相同实例进行去重,而注解用于包含关于告警的其他信息,例如摘要、描述或运维手册的 URL。
startsAt 时间戳是告警触发的时间。如果省略,Alertmanager 会将 startsAt 设置为当前时间。
endsAt 时间戳是告警应被解决的时间。如果省略,Alertmanager 会将 endsAt 设置为当前时间加上 resolve_timeout。
generatorURL 是一个唯一的 URL,链接到告警的来源。例如,它可能链接到 Prometheus 中触发的规则。
客户端的预期行为
客户端应定期向 Alertmanager 重新发送触发中的告警,直到告警被解决。
确切的间隔取决于多个变量,例如 endsAt 时间戳,或者如果省略了该时间戳,则取决于 resolve_timeout 的值。如果省略了 endsAt 时间戳,Alertmanager 会将告警的现有 endsAt 时间戳更新为当前时间加上 resolve_timeout。
当触发告警的 endsAt 时间戳过期后,该告警即被解决。
为确保已解决的告警能收到解决通知,客户端还应在告警解决后的最多 5 分钟内继续向 Alertmanager 重新发送已解决的告警。由于 Alertmanager 是无状态的,这确保了即使 Alertmanager 崩溃或重启,解决通知也能被发送。