1. 水位录制规则概述
1.1 什么是水位录制规则
水位录制规则(Watermark Recording Rule)是 SRE 监控体系中一类专门用于持续记录系统资源或服务状态“水位”的 PromQL 规则。它不直接触发告警,而是将关键指标在特定时间窗口内的最大值、最小值、百分位值或变化率持久化到新的时间序列中,形成可供后续分析、容量规划与告警阈值校准的“水位历史”。
核心定义:水位录制规则 = 预定义的 PromQL 表达式 + 固定的录制频率 + 目标指标名称,将原始高基数或高频率指标降维为稳定的水位时间序列。
例如,一个典型的 CPU 使用率水位录制规则如下:
# 录制过去5分钟内CPU使用率的最大值(水位峰值)
- record: node:cpu_utilization:max_5m
expr: max_over_time(100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)[5m:])
labels:
level: "critical"
该规则每 15 秒(默认评估间隔)执行一次,将过去 5 分钟的 CPU 峰值水位写入 node:cpu_utilization:max_5m 指标,供后续查询或告警使用。
1.2 水位录制规则在 SRE 监控中的价值
水位录制规则在 SRE 实践中具有不可替代的四大核心价值:
| 价值维度 | 具体说明 | 典型场景 |
|---|---|---|
| 容量规划 | 通过录制长期水位峰值与趋势,量化资源使用上限,指导扩缩容决策 | 集群节点数规划、数据库连接池大小调整 |
| 告警降噪 | 用录制的水位基线替代原始指标,避免高频波动导致的误告警 | CPU 突刺过滤、内存抖动忽略 |
| 阈值校准 | 基于录制的水位百分位数据(P50/P90/P99)动态调整告警阈值 | 延迟告警阈值从固定值改为 P99 水位 + 偏移量 |
| 事后回溯 | 保留高精度水位历史,故障复盘时可快速定位异常水位拐点 | 故障时间线分析、根因定位 |
SRE 最佳实践:水位录制规则是“监控的监控”——它记录的是监控系统自身对服务状态的抽象理解,是构建可观测性数据湖的基础组件。
1.3 水位录制规则与普通告警规则的区别
水位录制规则与普通告警规则在目的、输出、评估方式、数据生命周期四个维度存在本质差异:
| 对比维度 | 普通告警规则 | 水位录制规则 |
|---|---|---|
| 核心目的 | 检测异常状态并触发通知 | 持续记录系统状态水位,不直接通知 |
| 输出形式 | 告警事件(Alert)→ 通知渠道 | 新时间序列(Time Series)→ 存储后端 |
| 评估频率 | 通常较低(1-5分钟),避免告警风暴 | 通常较高(15-60秒),保证水位精度 |
| 数据保留 | 告警事件按需保留,通常较短 | 水位序列长期保留(数周至数月) |
| 典型表达式 | node_cpu_utilization > 0.9 |
max_over_time(node_cpu_utilization[5m]) |
| 对原始数据影响 | 只读不写,不产生新指标 | 写入新指标,增加存储但降低查询复杂度 |
常见误区:不要将水位录制规则当作告警规则的替代品。两者是互补关系——水位规则提供数据基础,告警规则基于水位数据做出决策。正确的做法是:先录制水位,再基于水位设置告警。
1.4 水位录制规则的核心设计原则
设计高质量的水位录制规则需要遵循以下五项原则:
- 明确水位语义:每个录制规则必须清晰定义“录制的是什么水位”——峰值、均值、P99 还是变化率,避免语义模糊。
- 匹配业务周期:录制窗口大小应与业务波动周期对齐,例如业务高峰期 1 小时,则录制窗口至少覆盖 1 小时。
- 控制基数爆炸:录制规则应尽量聚合标签,避免为每个 Pod 或实例录制独立水位,优先使用
by (cluster, service)等高层聚合。 - 分层录制策略:按“基础设施层 → 平台层 → 应用层”分层录制,每层关注不同的水位指标,避免跨层混淆。
- 命名规范统一:采用
level:metric:aggregation_window的命名格式,例如critical:http_latency:p99_5m,便于自动化发现与维护。
实战经验:一个典型的微服务集群,建议录制 20-30 个核心水位指标,覆盖 CPU、内存、网络、磁盘、延迟、错误率、QPS 七个维度。过多的录制规则会导致存储成本失控,过少则无法支撑容量规划与告警校准。