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 采集流程
- 日志产生: 应用在关键路径输出结构化日志,包含请求 ID、耗时、状态码。
- 日志采集: Filebeat / Fluentd 等 Agent 将日志发送到中心存储。
- 日志解析: 使用 Logstash / Loki 的查询语言提取字段。
- 指标聚合: 对解析后的字段做计数、分位数计算,生成 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 监控。
4.7 方法选择决策树
在实际项目中,可以根据以下条件快速选择采集方法:
- 是否需要验证用户侧体验? → 是 → 优先使用探针;否 → 进入下一步。
- 是否已有结构化日志? → 是 → 使用日志快速提取 SLI;否 → 进入下一步。
- 是否需要毫秒级精度和低存储成本? → 是 → 使用指标;否 → 进入下一步。
- 是否需要跨服务依赖分析? → 是 → 补充追踪采集。
最佳实践: 建议至少同时使用指标 + 探针的组合。指标提供高密度、低延迟的内部视图,探针提供真实用户视角的外部验证。日志和追踪作为补充,用于错误根因分析。