Prometheus Alert
1 基本概念
Prometheus 生态中的告警,有 Prometheus Server 和 Alertmanager 组件实现。

- Prometheus Server 负责采集 Metrics,并根据 Prometheus Rule 配置的 PromQL 决定是否触发 Alert。
- Alertmanager 负责接收 Server 的 Alert 信息,然后经过处理将其路由到各个 Receiver。
2 Alert 处理
Alertmanager 提供一些功能对收到的 Alert 信息进行处理。
2.1 Grouping
Grouping 指的是对 Alert 进行分组,将多个 Alert 合并到一个 Alert。
例如,Server 宕机的情况下,可能会导致所有的 Client 都发出 Alert。通过 Grouping 可以将这些 Alert 合并会一个 Alert,避免瞬间触发大量告警通知。
当然,也可以一定时间的 Alert 进行分组打包,合并为一个 “大” 的 Alert 通知,避免受到频繁的告警轰炸。
Grouping 功能通过 route 配置项 中的相关字段使用:
|
|
-
group_by
指定分组基于的 label name,不同 label 值会被设为单独的一组。
例如按照上述配置,按照
label["product"]
+label["environment"]
进行分组,以下告警都属于不同 group:{product="web", environment="dev}
{product="app", environment="dev}
{product="web", environment="prod}
-
group_wait(默认 30s)
设置接收告警到发送的等待时间。收到某一个分组的告警后,在
${group_wait}
等待时间内接收同组的告警,这些告警会合并为一个告警发出。 -
group_interval(默认 5m)
相同 group 告警的间隔时间。在发出该 group 的告警后,间隔
${group_interval}
再能够再次发送该 group 告警。通过该配置来防止频繁发送相同 group 的告警。
2.2 Inhibition
Inhibition 指的是某个 Alert 已经通知后,停止重复发送此 Alert 引发的其他异常或者故障产生的 Alert。在实际的配置中,可以理解为:当 Source Alert 触发后,根据配置抑制 Target Alert 的告警。
例如灾备体系中,原集群宕机,流量切换到灾备集群后,那么原集群的其他告警就失去了意义,那么通过 Inhibition 就可以抑制原集群的其他告警。
Inhibition 功能通过配置文件中的 inhibit_rules 模块实现。
|
|
-
source_match / source_match_re
描述 Source Alert 的匹配条件。示例中,只有一个 Alert 包含
alertname: TORouterDown
的 Label 才会被视为 Source Alert。 -
target_match / target_match_re
描述需要被抑制的 Target Alert 的匹配条件。示例中,包含
alertname: RedisUnreachable
的 Alert 会被视为 Target Alert。 -
equal
Source Alert 与 Target Alert 具有 equal 中包含的 Label,并且值完全相同,才会触发抑制规则。
该配置用于描述 Source 与 Target Alert 的是相关联的,避免误触发抑制。示例中的含义为,要求 Source 与 Target Alert 同属于一个数据中心(dc)的支架(rack)才会触发抑制规则。
2.3 Silence
Silence 用于将特定的告警在一定时间不在通知。
可以通过两种方式来设置 Silence:
-
Alertmanager Web Console
-
amtool 命令行工具
3 Alert 配置
Alertmanager 的所有配置都是通过配置文件提供的,通过参数 --config.file
指定配置文件:
|
|
Alertmanager 也支持动态重新加载配置文件,可以通过发生 SIGHUP
信号或者向 /-/reload
HTTP 接口发送 POST 请求重新加载配置文件。
Alertmanager 配置项分为:
- global 全局配置
- templates 告警模板
- route 告警路由
- receivers 接收器
- inhibit_rules 抑制规则
完整的配置文件说明见官方文档:CONFIGURATION。
3.1 global 配置
global
配置项中包含所有配置项的公共配置,可以作为其他配置项的默认值,自动被其他配置项的配置覆盖。
3.2 templates 配置
当 Alertmanager 向各个 Receivers 发送告警通知时,会通过 template 来构建通知信息。
Alertmanager 带有默认的 template。当然,也可以在 templates
配置项中定义告警模板,例如:
|
|
3.2.1 template 数据结构
template 会使用 Go 模板语言构建的,因此可以在 template 实现代码逻辑以及变量的使用。
当然,Alertmanager 提供了预定义数据与函数可以在模板文件中使用。
|
|
完整的数据结构见 NOTIFICATION TEMPLATE REFERENCE。
3.3 route 配置
route 配置描述收到 Prometheus 的告警后,如果将告警发送到目标的 receivers。
路由规则以树型结构组合:第一个路由规则称为 根路由节点,后续称为 子路由节点。
每个告警从配置的根节点进入路由树,按照深度优先顺序遍历匹配。当匹配到某个路由规则时,就会发送给 receiver。如果没有匹配到任意的路由规则,那么从根据跟路由节点发出。
|
|
可以看到,每一个路由节点包含以下配置:
- receiver - 配置发送告警的 receiver 名称
- repeat_interval -(默认 4h)设置告警成功后,再次发送完全相同的告警的间隔时间
- continue -(默认 false)为 false 时,那么告警匹配时就停止继续匹配其他路由节点。反之,会继续匹配
- match - 匹配规则,对应 label 的 value 完全匹配
- match_re - 基于正则的匹配规则,对应 label 的 value 匹配正则
- routes - 子路由节点
- group_by group_wait group_interval - 参考 Grouping
3.4 receivers
receivers 配置中定义能够接受告警通知的目标。每个 receiver 有着全局唯一的名称,对应一个或多个通知方式。
Alertmanager 支持多种的通知方式,包括 Email、微信、PagerDuty、Webhook 等。
|
|
各种 receiver 的配置方式参考官方文档 receiver。
3.5 inhibit_rules
参考 Inhibition。
4 Prometheus Rule
参考 Alert Rule。