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 聚合窗口:压缩的粒度与函数

聚合窗口是降采样执行的基本时间块。系统将窗口内的原始数据点通过聚合函数合并为一个新数据点。窗口越大,压缩比越高,但信息损失也越大。

聚合窗口降采样原理 原始数据(1s 分辨率) 窗口 1(200s) 窗口 2(200s) 窗口 3(200s) 降采样结果(200s 分辨率) AVG: 87.2 AVG: 88.5 AVG: 86.8 聚合函数选择直接影响精度损失: • AVG/SUM:保留趋势,丢失极值 → 适合资源利用率指标 • MAX/MIN:保留峰值/谷值 → 适合告警回溯、容量规划

常见的聚合函数及其对精度的影响:

聚合函数 保留的信息 丢失的信息 典型用途
AVG 整体趋势、均值 峰值、抖动、异常点 CPU 使用率、内存占用
MAX 窗口内最大值 低值、分布形态 延迟 p99、请求峰值
MIN 窗口内最小值 高值、波动细节 空闲资源、最低水位
SUM 总量、累计值 瞬时速率变化 请求总数、错误计数
COUNT 数据点数量 数值本身 采样率验证、数据完整性
P99 / P95 尾部延迟分布 精确排序、极端离群点 SLO 合规性监控
常见陷阱: 对 Counter 类型指标使用 AVG 聚合会导致速率信息失真。Counter 应先用 rate() 转换为速率,再对速率进行降采样;或直接使用 MAX 保留窗口内最大速率。对 Histogram 类型指标,降采样必须在桶(bucket)级别进行,不能直接聚合分位值。

4.3 数据保留策略:分层存储与生命周期

现代可观测性平台普遍采用多级保留策略:近期数据保留高分辨率,远期数据自动降采样为低分辨率。这种策略在保证近期排查能力的同时,大幅降低历史数据的存储成本。

多级保留策略与降采样流水线 热存储(Hot Tier) — 原始分辨率 10s,保留 7 天 降采样规则:10s → 5min,AVG + MAX 温存储(Warm Tier) — 5min 分辨率,保留 30 天 冷存储(Cold Tier) — 1h 分辨率,保留 1 年

典型的分层保留策略参数:

层级 分辨率 保留时长 压缩比(相对原始) 存储介质
热层 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(如峰值指标)
• 低频查询 + 低敏感度 → 激进降采样(如磁盘总量)

4.5 OpenTelemetry 中的降采样实现路径

在 OpenTelemetry 架构中,降采样可以在多个阶段实施:

  1. 采集端(OTel Collector): 通过 filter 和 metricstransform 处理器,在采集时直接降低采样频率或丢弃低价值指标。
  2. 后端存储层: 使用支持自动降采样的后端(如 VictoriaMetrics、Thanos、M3DB),配置 downsampling.periods 规则。
  3. 查询时降采样: 在 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 分辨率
重要提醒: 降采样规则一旦写入并删除原始数据,不可逆。在生产环境实施前,务必在测试环境验证聚合函数和窗口大小对关键指标的影响。建议先以“写入降采样数据 + 保留原始数据”的方式并行运行一个保留周期,确认精度损失在可接受范围内后,再启用原始数据自动删除策略。