4. SLI 数据采集基础:数据源选择、采样策略与数据清洗

SLI 口径的校准依赖高质量、高保真的观测数据。数据采集阶段决定了后续分析的“原材料”质量。本节从数据源选型、采样策略与数据预处理三个层面,构建 SLI 数据采集的基础框架。

4.1 数据源选择:三大观测支柱

现代可观测性体系通常从 APM(应用性能监控)、日志 与 基础设施监控 三个维度采集数据。不同数据源对 SLI 口径的支撑能力各有侧重。

数据源类型 典型工具 适合的 SLI 类型 优势 局限性
APM Datadog APM, SkyWalking, Jaeger 延迟(Latency)、错误率(Error Rate)、吞吐量(Throughput) 端到端追踪,自动识别服务依赖,请求级粒度 采样率影响低流量服务可见性,存储成本高
日志 ELK, Loki, Splunk 错误率、业务自定义指标(如订单失败数) 结构化/非结构化数据全覆盖,可回溯排查 解析开销大,非标准化日志易产生口径偏差
基础设施监控 Prometheus, Zabbix, CloudWatch 可用性(Uptime)、饱和度(Saturation) 指标稳定,采集开销低,适合长期趋势分析 无法感知应用层业务逻辑,粒度较粗
选型建议: 对于核心交易链路,优先使用 APM 数据作为 SLI 口径来源;对于非关键但高频的批量任务,基础设施监控的指标足以支撑阈值校准。日志数据通常作为“补充证据”用于异常定位,而非直接作为 SLI 口径主源。
数据源选择与 SLI 映射关系 数据源 → SLI 映射关系 APM 延迟 / 错误率 / 吞吐量 日志 错误率 / 业务自定义指标 基础设施监控 可用性 / 饱和度 SLI 口径原始数据池 统一时间戳、标签化、去重 阈值校准引擎 口径对齐 → 基线计算 → 阈值生成

4.2 采样策略:在精度与成本之间平衡

全量采集在高并发系统中不可持续。合理的采样策略必须保证 SLI 口径的统计代表性,同时控制存储与计算开销。

4.2.1 常见采样策略对比

策略 原理 适用场景 对 SLI 口径的影响
固定比率采样 每 N 个请求采集 1 个 流量平稳、无突发峰值的系统 低流量时段样本不足,口径方差大
自适应采样 根据当前 QPS 动态调整采样率 流量波动明显的互联网服务 高流量时降采样,低流量时全采,口径更稳定
头部采样 只采集延迟最高的 Top N% 请求 关注长尾延迟的 SLI(如 p99) 低估平均延迟,但能精准捕捉异常尾部
尾部采样 只采集延迟最低的 Top N% 请求 关注基准性能的 SLI(如 p50) 忽略异常,口径过于乐观
避坑提示: 不要对 SLI 口径使用“随机丢弃”策略。随机丢弃会破坏时间序列的连续性,导致阈值校准时的基线计算出现系统性偏差。推荐使用“自适应采样 + 头部采样”的组合策略,兼顾成本与口径精度。

4.2.2 采样率校准验证方法

在正式使用采样数据前,应通过以下步骤验证采样是否满足 SLI 口径要求:

  1. 对比全量与采样数据的统计分布:在测试环境运行 1 小时全量采集,与同时间段采样数据对比 p50、p99、错误率,偏差应 < 5%。
  2. 检查低流量时段覆盖:确保凌晨等低峰期仍有足够样本(建议每分钟至少 30 个样本),否则应启用自适应采样提升低流量采样率。
  3. 验证异常事件捕获率:人为注入故障,确认采样数据能捕获到至少 90% 的异常事件。

4.3 数据清洗与预处理

原始数据在进入阈值校准流程前,必须经过清洗与预处理,消除噪声、对齐口径、统一格式。

4.3.1 清洗步骤清单

步骤 操作 示例
1. 去重 基于 traceId/requestId 移除重复记录 APM 因网络重传产生的重复 span
2. 时间戳对齐 统一转换为 UTC 毫秒时间戳,修正时钟偏移 日志时间戳与 APM 时间戳相差 > 1s 时标记告警
3. 异常值过滤 移除明显超出物理极限的数据点(如延迟 > 3600s) 因客户端超时产生的 9999ms 假数据
4. 缺失值处理 连续缺失 < 5 个点用线性插值填充;超过则标记为断点 Prometheus 抓取超时导致的空指标
5. 口径标签标准化 统一 service、endpoint、status_code 等标签命名 将 "svc_name" 统一为 "service"

4.3.2 预处理代码示例(Python 伪代码)

import pandas as pd
import numpy as np

def preprocess_sli_data(df: pd.DataFrame) -> pd.DataFrame:
    """
    SLI 原始数据清洗与预处理流水线
    """
    # 1. 去重
    df = df.drop_duplicates(subset=['trace_id', 'span_id'])

    # 2. 时间戳对齐与排序
    df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
    df = df.sort_values('timestamp')

    # 3. 异常值过滤(延迟 > 300s 视为异常)
    df = df[df['latency_ms'] <= 300000]

    # 4. 缺失值处理(线性插值,最多连续插 5 个点)
    df['latency_ms'] = df['latency_ms'].interpolate(
        method='linear', limit=5, limit_direction='both'
    )

    # 5. 口径标签标准化
    df.rename(columns={'svc_name': 'service', 'ep': 'endpoint'}, inplace=True)

    return df
关键原则: 数据清洗必须保留原始数据副本。任何过滤、插值、聚合操作都应记录在数据血缘中,以便在阈值校准出现异常时回溯原始口径。
SLI 数据清洗流水线 SLI 数据清洗流水线 原始数据 去重 时间戳对齐 异常值过滤 缺失值插值 口径标签标准化 统一 service / endpoint / status_code 清洗后数据 → 阈值校准

4.4 数据源选择与清洗的常见陷阱

  • 陷阱一:APM 采样率过低导致 p99 失真 —— 当采样率低于 1% 时,p99 的置信区间会急剧扩大,建议核心服务采样率不低于 5%。
  • 陷阱二:日志解析错误引入假阳性错误率 —— 日志中非业务异常(如健康检查日志)被误解析为错误,导致 SLI 错误率虚高。应在清洗阶段加入白名单过滤。
  • 陷阱三:基础设施监控的聚合粒度与 SLI 口径不匹配 —— 例如用 5 分钟平均 CPU 使用率作为饱和度 SLI,会掩盖 1 分钟级的突发抖动。建议将聚合窗口缩小至 1 分钟或更细。
最佳实践: 在数据采集阶段建立“数据质量仪表盘”,实时监控采样率、数据延迟、缺失率、异常值比例。当任一指标超过阈值(如缺失率 > 5%)时,自动触发告警,避免劣质数据进入阈值校准流程。