告警规则
告警规则允许你基于 Prometheus 表达式语言定义告警条件,并将告警通知发送到外部服务。当告警表达式在给定时间点产生一个或多个向量元素时,该告警将被视为对这些元素的标签集处于活跃状态。
定义告警规则
Prometheus 中告警规则的配置方式与 记录规则 相同。
一个包含告警的规则文件示例如下:
groups:
- name: example
labels:
team: myteam
rules:
- alert: HighRequestLatency
expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5
for: 10m
keep_firing_for: 5m
labels:
severity: page
annotations:
summary: High request latency
可选的 for 子句使 Prometheus 在首次遇到新的表达式输出向量元素与判定该元素告警触发之间等待一段时间。在这种情况下,Prometheus 将在每次评估时检查告警是否持续保持活跃状态长达 10 分钟,然后再触发告警。处于活跃状态但尚未触发的元素处于挂起(pending)状态。没有 for 子句的告警规则将在第一次评估时即变为活跃状态。
此外还有可选的 keep_firing_for 子句,它告诉 Prometheus 在触发条件最后一次满足后,仍保持该告警处于触发状态一段指定的时间。这可用于防止抖动告警(flapping alerts)或因数据丢失导致的错误恢复等情况。没有 keep_firing_for 子句的告警规则将在条件不满足的第一次评估时立即停用(前提是已满足上述任何可选的 for 持续时间)。
labels 子句允许指定一组附加标签附加到告警上。任何现有的冲突标签都将被覆盖。标签值支持模板化。
annotations 子句指定一组信息性标签,可用于存储较长的附加信息,如告警描述或运维手册链接。注释值支持模板化。
模板化
标签和注释值可以使用 控制台模板 进行模板化。$labels 变量包含告警实例的标签键/值对。可以通过 $externalLabels 变量访问已配置的外部标签。$value 变量包含告警实例的计算值。
# To insert a firing element's label values:
{{ $labels.<labelname> }}
# To insert the numeric expression value of the firing element:
{{ $value }}
示例
groups:
- name: example
rules:
# Alert for any instance that is unreachable for >5 minutes.
- alert: InstanceDown
expr: up == 0
for: 5m
labels:
severity: page
annotations:
summary: "Instance {{ $labels.instance }} down"
description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
# Alert for any instance that has a median request latency >1s.
- alert: APIHighRequestLatency
expr: api_http_request_latencies_second{quantile="0.5"} > 1
for: 10m
annotations:
summary: "High request latency on {{ $labels.instance }}"
description: "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)"
运行时检查告警
要手动检查哪些告警处于活跃状态(挂起或触发),请导航到 Prometheus 实例的“Alerts”选项卡。这将显示每个已定义告警当前处于活跃状态的具体标签集。
对于挂起和触发的告警,Prometheus 还会存储形式为 ALERTS{alertname="<告警名称>", alertstate="<pending 或 firing>", <其他告警标签>} 的合成时间序列。只要告警处于指示的活跃(挂起或触发)状态,样本值就设置为 1;当情况不再如此时,该序列将被标记为陈旧(stale)。
发送告警通知
Prometheus 的告警规则擅长发现 当前 出了什么问题,但它们不是一个成熟的通知解决方案。需要另一层组件来在简单的告警定义之上添加汇总、通知速率限制、静默和告警依赖关系。在 Prometheus 生态系统中,Alertmanager 承担此角色。因此,可以将 Prometheus 配置为定期向 Alertmanager 实例发送告警状态信息,然后由后者负责分发适当的通知。Prometheus 可以通过其服务发现集成配置为自动发现可用的 Alertmanager 实例。