告警规则
告警规则允许您基于 Prometheus 表达式语言的表达式来定义告警条件,并将关于触发告警的通知发送给外部服务。每当在给定时间点告警表达式产生一个或多个向量元素时,该告警就会被视为针对这些元素的标签集处于活动(active)状态。
定义告警规则
在 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 在首次遇到新的表达式输出向量元素,与将此元素的告警计为“触发(firing)”之间等待一定的持续时间。在这种情况下,Prometheus 将在每次评估期间检查该告警是否在 10 分钟内持续处于活动(active)状态,然后才会触发该告警。处于活动状态但尚未触发的元素处于挂起(pending)状态。不带 for 子句的告警规则将在第一次评估时变为活动状态。
还有一个可选的 keep_firing_for 子句,它指示 Prometheus 在最后一次满足触发条件后,在指定的持续时间内保持此告警继续触发。这可用于防止告警抖动(flapping)、由于数据丢失导致的错误恢复等情况。不带 keep_firing_for 子句的告警规则将在不满足条件的第一次评估时停用(假设上述任何可选的 for 持续时间已得到满足)。
labels 子句允许指定一组附加到告警的标签。任何现有的冲突标签都将被覆盖。标签值可以使用模板。
annotations 子句指定了一组信息性标签,可用于存储更长的附加信息,例如告警描述或操作手册(runbook)链接。注释值可以使用模板。
模板化
标签和注释值可以使用控制台模板进行模板化。$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="<alert name>", alertstate="<pending or firing>", <additional alert labels>} 的形式存储合成时间序列。只要告警处于指定的活动(挂起或触发)状态,样本值就会设置为 1,一旦不再处于该状态,该序列就会被标记为陈旧(stale)。
发送告警通知
Prometheus 的告警规则擅长查明当前有哪些地方出现故障,但它们并不是一个完整的通知解决方案。需要在简单的告警定义之上,再加上一层来添加汇总、通知速率限制、静默和告警依赖。在 Prometheus 生态系统中,Alertmanager 承担了这一角色。因此,Prometheus 可以配置为定期将有关告警状态的信息发送给 Alertmanager 实例,然后再由后者负责发送正确的通知。Prometheus 可以通过其服务发现集成进行配置,以自动发现可用的 Alertmanager 实例。