3. 告警规则配置:PromQL 表达式编写、阈值设定、多条件组合与异常处理
告警规则是 Grafana 告警体系的核心载体,它决定了“何时触发告警”以及“触发后携带哪些上下文”。本章聚焦 PromQL 表达式编写、阈值设定策略、多条件组合逻辑(AND/OR)以及 No Data / Error 场景的处理方法,确保告警规则在生产环境中既准确又鲁棒。
核心原则:告警规则应尽量在 PromQL 层面完成数据筛选与聚合,减少告警引擎的二次计算负担;阈值设定需结合业务周期与历史基线,避免静态硬编码导致的误报或漏报。
3.1 PromQL 表达式编写:从指标到告警条件
PromQL(Prometheus Query Language)是告警规则的“眼睛”。一个合格的告警表达式应满足:语义明确、可聚合、可重试。
| 场景 | PromQL 示例 | 说明 |
|---|---|---|
| CPU 使用率 > 90% | (1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)) * 100 > 90 |
使用 rate 函数平滑瞬时抖动,按 instance 聚合 |
| 内存可用量 < 512MB | node_memory_MemAvailable_bytes / 1024 / 1024 < 512 |
单位转换后与阈值比较,避免大数溢出 |
| HTTP 5xx 错误率 > 5% | sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) * 100 > 5 |
分子分母分别聚合,避免零除问题 |
| 磁盘预测满(线性回归) | predict_linear(node_filesystem_free_bytes{mountpoint="/"}[6h], 4*3600) < 0 |
基于过去 6 小时趋势预测未来 4 小时是否耗尽 |
编写技巧:优先使用
rate() 而非 irate() 做告警,因为 rate 对短时间窗口的毛刺更不敏感;对于计数器类型指标,始终使用 rate 或 increase 包裹,避免直接比较原始值。
3.2 阈值设定:静态阈值与动态基线
阈值是告警的“扳机”。根据业务容忍度与指标特性,可选择以下策略:
- 静态阈值:适用于稳定指标(如 CPU > 90%、内存 < 512MB)。优点:简单直观;缺点:无法适应业务潮汐。
- 动态基线:基于历史数据自动计算阈值(如过去 7 天同时间段的 P95 值)。Grafana 支持通过
avg_over_time或外部 ML 服务实现。 - 复合阈值:同时设置 Warning 和 Critical 两级,例如 Warning > 80%,Critical > 95%。
| 阈值类型 | 适用场景 | 风险点 |
|---|---|---|
| 静态阈值 | 基础设施资源(CPU、内存、磁盘) | 业务高峰期可能误报,低谷期可能漏报 |
| 动态基线 | 业务流量、API 延迟、错误率 | 需要足够的历史数据(至少 2 周) |
| 同比/环比 | 日活用户、订单量 | 节假日或活动日可能产生偏差 |
避坑提示:不要将阈值设为精确的整数边界(如 90.00%),建议保留 1-2% 的缓冲区间;对于突发流量场景,可结合
for 参数设置持续时长,避免瞬时尖峰触发告警。
3.3 多条件组合:AND / OR 逻辑
Grafana 告警规则支持在一条规则内通过 PromQL 的 and / or 运算符组合多个条件,实现更精细的触发逻辑。
# 示例:CPU 高 且 内存高(AND)
(avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) < 0.1)
and
(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.2)
# 示例:CPU 高 或 磁盘 IO 高(OR)
(avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) < 0.1)
or
(rate(node_disk_io_time_seconds_total[5m]) > 0.8)
| 运算符 | 语义 | 典型场景 |
|---|---|---|
and |
两个条件同时满足时才触发 | CPU 高 + 内存高 → 可能内存泄漏 |
or |
任一条件满足即触发 | CPU 高 或 磁盘 IO 高 → 资源紧张 |
unless |
排除满足某条件的实例 | 所有实例告警,但排除维护中的实例 |
最佳实践:多条件组合时,建议将计算量小的条件放在左侧,减少 PromQL 引擎的计算开销;对于
or 组合,注意两个条件的时间窗口应保持一致,避免时间偏差导致逻辑混乱。
3.4 No Data 与 Error 处理
生产环境中,指标数据可能因网络抖动、采集器重启、Prometheus 自身故障等原因出现缺失或异常。Grafana 告警规则提供三种内置处理策略:
| 策略 | 行为 | 推荐场景 |
|---|---|---|
| No Data | 当查询返回空结果时,可选择:Alerting(触发告警)、No Data(保持无数据状态)、OK(视为正常)、Keep Last(保留上次状态) | 关键指标(如心跳)建议设为 Alerting;非关键指标可设为 Keep Last |
| Error | 当 PromQL 执行出错时(如语法错误、超时),可选择:Alerting(触发告警)、Error(保持错误状态)、OK(视为正常) | 建议设为 Alerting,以便及时发现查询链路问题 |
| 超时 | 查询超过设定时间(默认 30s)未返回,视为 Error | 对于复杂聚合查询,可适当延长超时时间 |
关键提醒:No Data 和 Error 处理策略应写入 Runbook 参数映射。例如,当 No Data 触发告警时,Runbook 应自动检查 Prometheus 目标状态(up 指标)和网络连通性,而非直接重启服务。
3.5 规则配置完整示例
以下是一个生产级告警规则配置片段,展示了 PromQL、阈值、多条件组合与异常处理的整合:
# 告警规则 YAML 示例(Grafana 8.x+ 原生格式)
groups:
- name: node_alerts
interval: 30s
rules:
- alert: HighCpuAndMemory
expr: |
(1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) > 0.9)
and
(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.2)
for: 2m
labels:
severity: critical
annotations:
summary: "Instance {{ $labels.instance }} 资源紧张"
description: "CPU > 90% 且 可用内存 < 20%,持续 2 分钟"
# No Data 处理:触发告警
no_data_state: Alerting
# Error 处理:触发告警
error_state: Alerting
Runbook 参数映射提示:上述规则中的
labels 和 annotations 字段将直接作为 Runbook 的输入参数。建议在 annotations 中携带实例名称、当前值、阈值、持续时间等上下文,便于自动化处理。