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 口径主源。
4.2 采样策略:在精度与成本之间平衡
全量采集在高并发系统中不可持续。合理的采样策略必须保证 SLI 口径的统计代表性,同时控制存储与计算开销。
4.2.1 常见采样策略对比
| 策略 | 原理 | 适用场景 | 对 SLI 口径的影响 |
|---|---|---|---|
| 固定比率采样 | 每 N 个请求采集 1 个 | 流量平稳、无突发峰值的系统 | 低流量时段样本不足,口径方差大 |
| 自适应采样 | 根据当前 QPS 动态调整采样率 | 流量波动明显的互联网服务 | 高流量时降采样,低流量时全采,口径更稳定 |
| 头部采样 | 只采集延迟最高的 Top N% 请求 | 关注长尾延迟的 SLI(如 p99) | 低估平均延迟,但能精准捕捉异常尾部 |
| 尾部采样 | 只采集延迟最低的 Top N% 请求 | 关注基准性能的 SLI(如 p50) | 忽略异常,口径过于乐观 |
避坑提示: 不要对 SLI 口径使用“随机丢弃”策略。随机丢弃会破坏时间序列的连续性,导致阈值校准时的基线计算出现系统性偏差。推荐使用“自适应采样 + 头部采样”的组合策略,兼顾成本与口径精度。
4.2.2 采样率校准验证方法
在正式使用采样数据前,应通过以下步骤验证采样是否满足 SLI 口径要求:
- 对比全量与采样数据的统计分布:在测试环境运行 1 小时全量采集,与同时间段采样数据对比 p50、p99、错误率,偏差应 < 5%。
- 检查低流量时段覆盖:确保凌晨等低峰期仍有足够样本(建议每分钟至少 30 个样本),否则应启用自适应采样提升低流量采样率。
- 验证异常事件捕获率:人为注入故障,确认采样数据能捕获到至少 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
关键原则: 数据清洗必须保留原始数据副本。任何过滤、插值、聚合操作都应记录在数据血缘中,以便在阈值校准出现异常时回溯原始口径。
4.4 数据源选择与清洗的常见陷阱
- 陷阱一:APM 采样率过低导致 p99 失真 —— 当采样率低于 1% 时,p99 的置信区间会急剧扩大,建议核心服务采样率不低于 5%。
- 陷阱二:日志解析错误引入假阳性错误率 —— 日志中非业务异常(如健康检查日志)被误解析为错误,导致 SLI 错误率虚高。应在清洗阶段加入白名单过滤。
- 陷阱三:基础设施监控的聚合粒度与 SLI 口径不匹配 —— 例如用 5 分钟平均 CPU 使用率作为饱和度 SLI,会掩盖 1 分钟级的突发抖动。建议将聚合窗口缩小至 1 分钟或更细。
最佳实践: 在数据采集阶段建立“数据质量仪表盘”,实时监控采样率、数据延迟、缺失率、异常值比例。当任一指标超过阈值(如缺失率 > 5%)时,自动触发告警,避免劣质数据进入阈值校准流程。