4. 告警规则引擎:Ruler组件原理、基于LogQL的告警规则编写、评估间隔与延迟

4.1 Ruler组件架构与职责

Loki的Ruler组件是告警与记录规则的核心执行引擎。它负责周期性地评估用户定义的规则,当规则条件满足时,将告警推送到Alertmanager或生成新的指标数据。理解Ruler的内部工作原理,是编写高效、可靠告警规则的前提。

核心职责: Ruler从对象存储(如S3、GCS)或本地文件系统加载规则,按照配置的评估间隔执行LogQL查询,并将结果与规则中的阈值进行比较。匹配的告警会被发送至Alertmanager,而记录规则则生成新的时间序列数据。
Ruler 组件内部架构与数据流 规则存储 对象存储 / 本地文件 规则管理器 加载 / 同步 / 缓存 评估循环 定时器 / 间隔调度 LogQL 查询器 执行聚合 / 速率计算 告警输出 发送至 Alertmanager 记录规则输出 写入时序数据库 Ruler 支持多租户隔离,每个租户可拥有独立的规则组和评估间隔

4.2 基于LogQL的告警规则编写

Loki告警规则使用YAML格式定义,核心是LogQL查询表达式。与PromQL不同,LogQL操作的是日志流而非指标,因此需要特别关注日志速率、计数和聚合函数的使用。

4.2.1 规则文件结构

groups:
  - name: example_alert_group
    interval: 30s
    limit: 10
    rules:
      - alert: HighErrorRate
        expr: |
          sum(rate({app="nginx"} |= "ERROR" [5m])) 
          / 
          sum(rate({app="nginx"} [5m])) > 0.05
        for: 2m
        labels:
          severity: critical
          team: platform
        annotations:
          summary: "Nginx 错误率超过 5%"
          description: "当前错误率: {{ $value | humanizePercentage }}"
关键字段说明:
  • expr:LogQL表达式,必须返回一个瞬时向量(即包含标签和样本值的查询结果)。
  • for:告警持续时间。条件满足后,需持续该时长才触发告警,用于防止抖动。
  • labels:附加标签,用于告警路由和分组。建议包含严重级别、所属团队等。
  • annotations:告警描述信息,支持Go模板语法引用查询结果值。

4.2.2 常用告警模式与LogQL示例

告警场景 LogQL 表达式核心模式 说明
错误日志激增 rate({job="api"} |= "ERROR" [5m]) > 100 检测特定日志级别的速率突增
日志缺失/静默 absent(rate({job="api"} [5m])) 当某标签组合的日志流完全消失时触发
延迟异常 quantile_over_time(0.99, {job="api"} | json | unwrap latency [5m]) > 500 从日志中提取延迟字段并计算分位数
错误率百分比 sum(rate({job="api"} |= "5xx" [5m])) / sum(rate({job="api"} [5m])) > 0.1 计算错误请求占总请求的比例
特定模式匹配 count_over_time({job="db"} |~ "connection refused" [1m]) > 50 统计特定日志模式在时间窗口内的出现次数

4.3 评估间隔与延迟

评估间隔和延迟是影响告警实时性与系统负载的关键参数。配置不当可能导致告警风暴或漏报。

4.3.1 评估间隔(Interval)

评估间隔定义了Ruler对每条规则执行LogQL查询的频率。它可以在全局配置和规则组级别设置,规则组级别的设置会覆盖全局配置。

  • 全局默认值:通常为 1m(1分钟),适用于大多数场景。
  • 规则组覆盖:对于需要快速响应的告警(如高错误率),可设置为 15s 或 30s。
  • 性能考量:评估间隔越短,Ruler和Loki查询前端的负载越高。对于聚合查询(如 sum(rate(...))),过短的间隔可能导致查询结果波动较大。

4.3.2 评估延迟(Evaluation Delay)

评估延迟是一个反直觉但极其重要的参数。它告诉Ruler在评估规则时,查询的时间范围要向后偏移一个固定的时间量。

为什么需要延迟? 日志从产生到被Loki摄入、索引并可供查询,存在一定的延迟(通常为几秒到几十秒)。如果不设置延迟,Ruler在 T0 时刻查询 [5m] 窗口时,窗口末尾的数据可能尚未完全入库,导致查询结果偏低,从而漏报告警。

配置示例:

# ruler.yml 全局配置
ruler:
  evaluation_interval: 30s
  evaluation_delay: 30s  # 查询时,将时间窗口向后偏移30秒

# 规则组级别覆盖
groups:
  - name: critical_alerts
    interval: 15s
    limit: 20
    rules:
      - alert: ...

4.3.3 参数对比与最佳实践

参数 作用 推荐值 风险
evaluation_interval 规则执行频率 15s ~ 5m(取决于告警敏感度) 过短:查询压力大;过长:告警延迟高
evaluation_delay 查询时间偏移,补偿摄入延迟 30s ~ 2m(取决于Loki摄入延迟) 过短:漏报;过长:告警响应变慢
for(规则内) 告警触发前的持续时长 1m ~ 5m(取决于抖动容忍度) 过短:抖动告警;过长:真实问题响应慢
评估延迟(Evaluation Delay)工作原理 T-5m T-2.5m T (当前时间) 无延迟:查询窗口 [T-5m, T] → 窗口末尾数据可能未入库 有延迟:查询窗口 [T-5m, T-1m] → 数据已完全入库 延迟 1m 延迟值应略大于 Loki 的 99 百分位摄入延迟。可通过 loki_distributor_ingester_appends_total 等指标监控实际延迟。

4.4 规则评估的生命周期

理解一条规则从加载到触发告警的完整流程,有助于排查告警未触发或误触发的问题。

  1. 规则加载:Ruler启动或配置热加载时,从存储后端读取规则文件,解析为内存中的规则树。
  2. 定时触发:根据规则组的 interval,调度器触发一次评估任务。
  3. 查询执行:Ruler构造LogQL查询,应用 evaluation_delay 偏移时间范围,发送至Loki查询前端。
  4. 结果处理:将查询返回的瞬时向量与规则中的阈值进行比较。如果满足条件,记录为“待触发”状态。
  5. 持续时间检查:检查该告警是否已持续满足条件超过 for 字段指定的时长。如果是,则转为“触发”状态。
  6. 告警发送:将触发的告警(包含标签和注解)通过HTTP API发送至Alertmanager。
排错提示: 如果告警未按预期触发,请依次检查:① 规则文件语法是否正确(可使用 loki-canary 或 logcli 测试查询);② 评估间隔是否过长导致错过瞬时峰值;③ 评估延迟是否过小导致查询窗口缺失数据;④ for 持续时间是否设置过长。