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 组合,注意两个条件的时间窗口应保持一致,避免时间偏差导致逻辑混乱。
多条件组合告警逻辑流程 PromQL 条件 A PromQL 条件 B PromQL 条件 C 组合逻辑引擎 AND / OR / unless 触发告警 / 保持正常

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 指标)和网络连通性,而非直接重启服务。
No Data / Error 处理决策树 告警查询结果 No Data 空结果集 Error 查询执行异常 正常数据 继续评估阈值 策略:Alerting / Keep Last 根据业务重要性选择 策略:Alerting / OK 建议触发告警排查

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 中携带实例名称、当前值、阈值、持续时间等上下文,便于自动化处理。