4. 降采样基础概念:分辨率、聚合窗口、数据保留策略与精度损失权衡
降采样(Downsampling)是控制指标存储成本最核心的手段。其本质是在时间维度上对原始数据进行压缩,通过降低数据点密度来换取更长的保留周期。理解降采样的三个基础概念——分辨率、聚合窗口与保留策略——以及它们之间的精度损失权衡,是设计成本控制方案的前提。
核心公式: 存储成本 ≈ 指标基数 × 分辨率(点数/秒) × 保留时长。降采样通过降低“分辨率”和分级“保留时长”来直接削减存储量。
4.1 分辨率:时间轴上的数据密度
分辨率定义了相邻两个数据点之间的时间间隔。间隔越小,分辨率越高,数据越精细,但存储开销也越大。
| 分辨率类型 | 典型间隔 | 每日数据点数(单时间序列) | 适用场景 |
|---|---|---|---|
| 高分辨率 | 1s – 10s | 86,400 – 8,640 | 实时告警、故障排查、高频交易 |
| 中分辨率 | 30s – 60s | 2,880 – 1,440 | 仪表盘监控、容量规划 |
| 低分辨率 | 5min – 15min | 288 – 96 | 长期趋势分析、月度报表 |
在 OpenTelemetry 生态中,分辨率通常由采集端的 collection_interval 和后端的降采样规则共同决定。例如,Prometheus 的 scrape_interval: 15s 即为原始分辨率,而 Thanos 或 VictoriaMetrics 的降采样规则会在此基础上生成更低分辨率的副本。
实践建议: 不要对所有指标使用统一分辨率。对延迟 p99、错误率等关键 SLO 指标保留高分辨率(如 10s),对 CPU 使用率、内存占用等慢变指标使用中分辨率(如 60s),对磁盘总量等几乎不变指标直接使用低分辨率(如 5min)。
4.2 聚合窗口:压缩的粒度与函数
聚合窗口是降采样执行的基本时间块。系统将窗口内的原始数据点通过聚合函数合并为一个新数据点。窗口越大,压缩比越高,但信息损失也越大。
常见的聚合函数及其对精度的影响:
| 聚合函数 | 保留的信息 | 丢失的信息 | 典型用途 |
|---|---|---|---|
AVG |
整体趋势、均值 | 峰值、抖动、异常点 | CPU 使用率、内存占用 |
MAX |
窗口内最大值 | 低值、分布形态 | 延迟 p99、请求峰值 |
MIN |
窗口内最小值 | 高值、波动细节 | 空闲资源、最低水位 |
SUM |
总量、累计值 | 瞬时速率变化 | 请求总数、错误计数 |
COUNT |
数据点数量 | 数值本身 | 采样率验证、数据完整性 |
P99 / P95 |
尾部延迟分布 | 精确排序、极端离群点 | SLO 合规性监控 |
常见陷阱: 对 Counter 类型指标使用 AVG 聚合会导致速率信息失真。Counter 应先用
rate() 转换为速率,再对速率进行降采样;或直接使用 MAX 保留窗口内最大速率。对 Histogram 类型指标,降采样必须在桶(bucket)级别进行,不能直接聚合分位值。
4.3 数据保留策略:分层存储与生命周期
现代可观测性平台普遍采用多级保留策略:近期数据保留高分辨率,远期数据自动降采样为低分辨率。这种策略在保证近期排查能力的同时,大幅降低历史数据的存储成本。
典型的分层保留策略参数:
| 层级 | 分辨率 | 保留时长 | 压缩比(相对原始) | 存储介质 |
|---|---|---|---|---|
| 热层 | 10s | 7 天 | 1x(原始) | SSD / 内存 |
| 温层 | 5min | 30 天 | ~30x | HDD / 对象存储 |
| 冷层 | 1h | 365 天 | ~360x | 对象存储(S3/GCS) |
成本估算: 假设一个指标基数为 100 万的时间序列,原始 10s 分辨率每天产生约 86.4 亿个数据点。采用上述三级保留策略后,热层 7 天 + 温层 30 天 + 冷层 365 天的总存储量,仅相当于原始数据全量保留 14 天左右的规模。存储成本降低约 96%。
4.4 精度损失权衡:可接受的代价
降采样必然带来精度损失,但并非所有场景都需要高精度。关键在于识别哪些分析场景可以容忍损失,哪些场景必须保留原始精度。
| 分析场景 | 精度要求 | 可接受的降采样粒度 | 风险说明 |
|---|---|---|---|
| 实时告警 | 高 | 原始分辨率或 10s | 降采样延迟可能导致告警滞后 |
| 故障排查(近期) | 高 | 原始分辨率或 30s | 丢失细节可能导致根因误判 |
| 容量规划(周/月) | 中 | 5min – 15min | 峰值可能被平滑,需保留 MAX |
| 长期趋势(季度/年) | 低 | 1h – 1d | 仅保留整体走向,忽略波动 |
| SLO 合规审计 | 极高 | 原始分辨率或 P99 专用降采样 | 精度损失可能导致 SLO 误算 |
权衡决策矩阵: 对于每个指标,根据其“查询频率”和“精度敏感度”两个维度决定降采样策略。
• 高频查询 + 高敏感度 → 保留原始分辨率(如 SLO 指标)
• 高频查询 + 低敏感度 → 中等降采样(如 CPU 使用率)
• 低频查询 + 高敏感度 → 按需降采样,保留 MAX/MIN(如峰值指标)
• 低频查询 + 低敏感度 → 激进降采样(如磁盘总量)
• 高频查询 + 高敏感度 → 保留原始分辨率(如 SLO 指标)
• 高频查询 + 低敏感度 → 中等降采样(如 CPU 使用率)
• 低频查询 + 高敏感度 → 按需降采样,保留 MAX/MIN(如峰值指标)
• 低频查询 + 低敏感度 → 激进降采样(如磁盘总量)
4.5 OpenTelemetry 中的降采样实现路径
在 OpenTelemetry 架构中,降采样可以在多个阶段实施:
- 采集端(OTel Collector): 通过
filter和metricstransform处理器,在采集时直接降低采样频率或丢弃低价值指标。 - 后端存储层: 使用支持自动降采样的后端(如 VictoriaMetrics、Thanos、M3DB),配置
downsampling.periods规则。 - 查询时降采样: 在 PromQL 或 SQL 查询中使用
avg_over_time、max_over_time等函数,不改变存储数据,仅影响查询结果。
# OTel Collector 配置示例:采集端降采样
processors:
filter:
metrics:
include:
match_type: regexp
metric_names:
- "http.server.request.duration.*"
exclude:
match_type: strict
metric_names:
- "http.server.request.duration.bucket" # 排除桶数据,仅保留分位值
metricstransform:
transforms:
- include: "system.cpu.utilization"
action: update
new_name: "system.cpu.utilization.1m"
aggregation: "avg"
interval: 60s # 将原始 10s 数据聚合为 60s 分辨率
重要提醒: 降采样规则一旦写入并删除原始数据,不可逆。在生产环境实施前,务必在测试环境验证聚合函数和窗口大小对关键指标的影响。建议先以“写入降采样数据 + 保留原始数据”的方式并行运行一个保留周期,确认精度损失在可接受范围内后,再启用原始数据自动删除策略。