4. Prometheus 告警规则基础:语法、分组、抑制与静默
Prometheus 告警规则是监控体系的核心执行单元,它定义了“什么条件下触发告警”。在 Argo CD 同步工程中,告警规则被标准化为模板,随应用部署自动同步。本章深入剖析告警规则的语法结构、分组策略、抑制与静默机制,为后续模板化工程奠定基础。
4.1 告警规则语法结构
每条 Prometheus 告警规则由 名称、表达式、持续时间 和 标签/注解 四部分组成。规则文件采用 YAML 格式,通常放置在 rules/ 目录下。
groups:
- name: example-group
rules:
- alert: HighErrorRate
expr: |
sum(rate(http_requests_total{status=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))
> 0.05
for: 2m
labels:
severity: critical
team: platform
annotations:
summary: "HTTP 5xx 错误率超过 5%"
description: "当前错误率 {{ $value | humanizePercentage }},已持续 2 分钟"
| 字段 | 必填 | 说明 | 典型值 |
|---|---|---|---|
alert |
是 | 告警名称,必须唯一 | HighErrorRate |
expr |
是 | PromQL 表达式,返回非零值即触发 | rate(...) > 0.05 |
for |
否 | 持续时间,防止抖动误报 | 2m、5m |
labels |
否 | 附加标签,用于路由和分组 | severity: critical |
annotations |
否 | 描述信息,支持模板变量 | summary、description |
模板变量提示: 注解中可使用
{{ $value }}、{{ $labels.instance }} 等变量动态填充当前值。在 Argo CD 模板中,这些变量会被保留,由 Prometheus 在运行时解析。
4.2 告警分组机制
分组(Grouping)将相似告警合并为一条通知,避免告警风暴。分组在 alertmanager.yml 中配置,核心参数如下:
| 参数 | 默认值 | 作用 |
|---|---|---|
group_by |
['...'] |
按哪些标签分组,如 ['severity', 'team'] |
group_wait |
30s |
首次告警等待时间,收集同组告警 |
group_interval |
5m |
同组新告警的发送间隔 |
repeat_interval |
4h |
已解决告警的重复通知间隔 |
工程实践: 在 Argo CD 模板中,
group_by 通常固定为 ['alertname', 'severity', 'namespace'],确保同一命名空间下的同类告警合并为一条通知,减少运维噪音。
4.3 抑制机制
抑制(Inhibition)用于在高级别告警已触发时,自动屏蔽低级别关联告警。例如:节点宕机时,抑制该节点上所有 Pod 的不可达告警。
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['namespace', 'instance']
抑制规则三要素:
- source_match:源告警匹配条件(高级别)
- target_match:目标告警匹配条件(被抑制)
- equal:必须相等的标签列表,确保抑制范围精确
注意: 抑制规则不要过度泛化。避免使用
equal: ['...'] 通配,否则可能误屏蔽真正需要关注的告警。建议至少包含 namespace 或 instance 作为限定标签。
4.4 静默机制
静默(Silence)是运维人员主动设置的告警屏蔽,常用于计划内维护窗口。静默通过 Alertmanager API 或 Web UI 创建,支持定时过期。
| 属性 | 说明 | 示例 |
|---|---|---|
| 匹配器 | 标签匹配表达式 | severity =~ "warning|critical" |
| 开始/结束时间 | 静默生效窗口 | 2025-04-10 02:00 至 2025-04-10 06:00 |
| 创建者 | 操作人标识 | ops-team |
| 注释 | 静默原因说明 | 数据库升级维护 |
模板化静默: 在 Argo CD 工程中,可将静默配置作为 Application 的额外资源,通过
Silence CRD 或 Alertmanager API 自动创建,实现维护窗口的声明式管理。
4.5 告警生命周期与状态流转
告警从产生到关闭经历多个状态,理解状态流转有助于排查告警丢失或重复问题。
4.6 规则分组与路由关系
告警规则分组(groups)与 Alertmanager 路由分组(group_by)是两个不同层级的概念,容易混淆。下表明确区分:
| 层级 | 配置位置 | 作用 | 示例 |
|---|---|---|---|
| 规则分组 | rules/*.yml |
将多条告警规则组织在一起,共享评估间隔 | groups: - name: kubernetes-apps |
| 路由分组 | alertmanager.yml |
将已触发的告警按标签合并为通知 | group_by: ['alertname', 'namespace'] |
模板化建议: 在 Argo CD 模板中,规则分组按
namespace 或 application 划分,每个分组独立评估。路由分组则统一在 Alertmanager 配置中定义,不随应用模板变化。
4.7 常见告警规则模式
以下列出同步工程中高频使用的告警规则模式,可直接作为模板参考:
- 错误率突增:
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) > 0.05 - 延迟过高:
histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le)) > 2.0 - Pod 重启频繁:
increase(kube_pod_container_status_restarts_total[10m]) > 3 - 磁盘空间不足:
node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} < 0.1 - 证书即将过期:
certmanager_certificate_expiration_seconds < 604800
避坑指南: 避免在
expr 中使用 absent() 函数检测指标缺失,因为 absent() 在指标恢复时不会自动清除告警。推荐使用 up == 0 或 rate(...) == 0 替代。
4.8 本章小结
Prometheus 告警规则是监控告警的基石。掌握语法结构、分组、抑制与静默机制,能够有效控制告警数量、提升运维效率。在 Argo CD 模板化工程中,规则分组按应用维度组织,抑制与静默通过声明式配置统一管理,确保告警策略随代码同步、可追溯。