4. SLI 指标采集方法:基于日志、基于指标、基于追踪、基于探针的 SLI 采集

SLI 的原始数据必须通过可靠的采集通道获取。不同的数据源决定了采集方式、精度和成本。本章将系统讲解四种主流的 SLI 采集方法:基于日志、基于指标、基于追踪和基于探针。理解每种方法的适用场景与局限性,是设计高质量 SLO 的基础。

4.1 四种采集方法概览

下表从数据源、典型工具、采集延迟、适用 SLI 类型四个维度进行横向对比,帮助你快速建立全局认知。

采集方法 数据源 典型工具 采集延迟 适用 SLI 类型
基于日志 应用/系统日志流 ELK、Loki、Splunk 秒级~分钟级 错误率、延迟分布、特定事件计数
基于指标 时序指标端点 Prometheus、Datadog、CloudWatch 秒级(通常 10~60s) 请求速率、延迟分位数、饱和度
基于追踪 分布式追踪数据 Jaeger、Zipkin、OpenTelemetry 秒级~分钟级 端到端延迟、依赖错误率、链路完整性
基于探针 合成用户请求 Blackbox Exporter、Synthetics 实时(按探测周期) 可用性、全局延迟、功能正确性
选型建议: 生产环境中通常组合使用 2~3 种方法。例如:用指标采集高基数请求速率,用日志兜底错误详情,用探针验证用户侧真实可用性。

4.2 基于日志的 SLI 采集

日志是最原始、最丰富的可观测性数据源。通过结构化日志(如 JSON 格式)可以提取出每次请求的 status_code、latency_ms、error_type 等字段,进而聚合为 SLI。

4.2.1 采集流程

  1. 日志产生: 应用在关键路径输出结构化日志,包含请求 ID、耗时、状态码。
  2. 日志采集: Filebeat / Fluentd 等 Agent 将日志发送到中心存储。
  3. 日志解析: 使用 Logstash / Loki 的查询语言提取字段。
  4. 指标聚合: 对解析后的字段做计数、分位数计算,生成 SLI 时序数据。

4.2.2 典型 SLI 计算示例

假设日志格式为 JSON,每行包含 status 和 duration 字段。以下 LogQL 查询计算过去 5 分钟的错误率 SLI:

sum(rate({app="my-service"} | json | status >= 500 [5m]))
/
sum(rate({app="my-service"} | json [5m]))
注意: 日志采集存在丢失风险(如 Agent 崩溃、网络抖动),且日志量过大时解析成本高。建议对日志 SLI 设置独立的采集管道,避免与全量日志存储竞争资源。

4.3 基于指标的 SLI 采集

指标采集是目前最主流的 SLI 数据源。应用通过暴露 Prometheus 格式的 /metrics 端点,或通过 StatsD / Telegraf 推送指标,再由时序数据库存储和查询。

4.3.1 指标类型与 SLI 映射

指标类型 SLI 示例 PromQL 示例
Counter(计数器) 请求总数、错误总数 rate(http_requests_total{status="5xx"}[5m])
Histogram(直方图) 延迟 p99、p50 histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))
Gauge(仪表盘) 当前连接数、队列深度 avg(service_connections_active)

4.3.2 采集架构要点

  • 拉模式 vs 推模式: Prometheus 采用拉模式,适合动态服务发现;推模式(如 Graphite)适合短生命周期任务。
  • 指标基数控制: 避免高基数标签(如 user_id、request_id)导致存储爆炸。SLI 指标应使用低基数标签(如 service、endpoint、status_class)。
  • 采集频率: 通常 15~30s 一次。对于高精度 SLO(如 99.99%),建议缩短至 10s 并配合预聚合。

4.4 基于追踪的 SLI 采集

分布式追踪能够还原一次请求经过的所有服务节点,从而计算端到端延迟和依赖错误率。追踪数据以 Span 为基本单元,多个 Span 组成 Trace。

4.4.1 追踪 SLI 的关键指标

  • Trace 完成率: 成功完成所有 Span 的 Trace 占比。
  • Span 错误率: 每个服务节点的错误 Span 比例。
  • 端到端延迟: 从入口 Span 开始到最后一个 Span 结束的耗时。

4.4.2 采样策略对 SLI 的影响

由于全量追踪成本极高,生产环境通常采用采样策略。不同采样方式对 SLI 精度的影响如下:

采样策略 描述 对 SLI 的影响
固定比例采样 随机保留 1%~10% 的 Trace 低流量服务可能样本不足,导致 SLI 波动大
自适应采样 根据流量动态调整采样率 高流量时降低采样率,低流量时提高,SLI 更稳定
头部采样 在 Trace 入口决定是否采样 无法保证完整 Trace 被采集,可能遗漏尾部错误
尾部采样 根据 Span 结果决定是否保留 能捕获异常 Trace,但延迟较高,适合错误分析
实践建议: 对于 SLO 监控,推荐使用自适应采样 + 尾部采样的组合。自适应采样保证基数,尾部采样确保错误 Trace 不丢失。

4.5 基于探针的 SLI 采集

探针(Probe)通过模拟真实用户请求,从外部主动探测服务可用性和性能。这种方式不依赖应用内部埋点,适合验证用户侧体验。

4.5.1 探针类型

  • HTTP 探针: 发送 HTTP GET/POST 请求,检查状态码、响应时间、响应体内容。
  • TCP 探针: 检查端口是否可达,用于基础设施可用性 SLI。
  • ICMP 探针: Ping 探测,用于网络延迟和丢包率。
  • 浏览器脚本探针: 执行完整的用户操作流程(登录、搜索、下单),验证功能正确性。

4.5.2 探针部署位置

探针的部署位置直接影响 SLI 的语义:

部署位置 模拟的用户视角 典型 SLI
同机房内网 内部服务调用 服务间延迟 < 10ms
同区域公有云 区域用户 区域可用性 > 99.9%
全球多节点 全球真实用户 全球 p95 延迟 < 500ms

4.6 四种采集方法的协同架构

下图展示了一个生产级 SLI 采集系统的典型架构,四种方法各司其职,共同支撑 SLO 监控。

SLI 采集协同架构 应用服务层 微服务 A / B / C · 数据库 · 缓存 · 消息队列 日志采集 Filebeat / Fluentd 指标采集 Prometheus / Telegraf 追踪采集 OpenTelemetry Collector 探针采集 Blackbox / Synthetics 存储与聚合层 Elasticsearch · Loki · Prometheus TSDB · Jaeger 后端 · 时序聚合器 SLI 计算与 SLO 评估层 PromQL · LogQL · 自定义聚合器 · 误差预算计算 告警 · 仪表盘 · 事件响应

4.7 方法选择决策树

在实际项目中,可以根据以下条件快速选择采集方法:

  1. 是否需要验证用户侧体验? → 是 → 优先使用探针;否 → 进入下一步。
  2. 是否已有结构化日志? → 是 → 使用日志快速提取 SLI;否 → 进入下一步。
  3. 是否需要毫秒级精度和低存储成本? → 是 → 使用指标;否 → 进入下一步。
  4. 是否需要跨服务依赖分析? → 是 → 补充追踪采集。
最佳实践: 建议至少同时使用指标 + 探针的组合。指标提供高密度、低延迟的内部视图,探针提供真实用户视角的外部验证。日志和追踪作为补充,用于错误根因分析。