告警规则

告警规则允许您根据 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 分钟。处于活动状态但尚未触发的元素处于挂起状态。没有 for 子句的告警规则将在首次评估时变为活动状态。

还有一个可选的 keep_firing_for 子句,它告诉 Prometheus 在触发条件最后一次满足后,将此告警保持触发状态指定的时长。这可用于防止诸如告警闪烁、因数据丢失导致的误解除等情况。没有 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 实例的“告警”选项卡。这将向您显示每个已定义告警当前处于活动状态的确切标签集。

对于挂起和触发中的告警,Prometheus 还会存储形式为 ALERTS{alertname="<告警名称>", alertstate="<挂起或触发>", <附加告警标签>} 的合成时间序列。只要告警处于指定的活动(挂起或触发)状态,样本值就被设置为 1,当不再是这种情况时,该序列会被标记为过期。

发送告警通知

Prometheus 的告警规则很擅长找出当前出了什么问题,但它们不是一个完整的通知解决方案。需要在简单的告警定义之上添加另一层来处理汇总、通知速率限制、静默和告警依赖。在 Prometheus 的生态系统中,Alertmanager 承担了这一角色。因此,可以将 Prometheus 配置为定期向 Alertmanager 实例发送有关告警状态的信息,然后由 Alertmanager 负责分发正确的通知。Prometheus 可以被配置为通过其服务发现集成自动发现可用的 Alertmanager 实例。

本文档是开源的。请通过提交问题或拉取请求来帮助改进它。