1. SLI 与 SLO 基础概念
在可观测性与站点可靠性工程(SRE)体系中,SLI(Service Level Indicator,服务等级指标)与SLO(Service Level Objective,服务等级目标)是定义系统健康度、指导运维决策的核心度量框架。没有明确的 SLI 与 SLO,任何调用链数据、指标与日志都只是噪声,无法转化为可执行的可靠性行动。
1.1 什么是 SLI(服务等级指标)
SLI 是对服务某一维度真实表现的量化度量。它回答一个基本问题:“用户此刻感受到的服务质量如何?”。SLI 必须可采集、可计算、可对比,通常以比率或分布形式呈现。
| SLI 类别 | 典型指标 | 采集来源 |
|---|---|---|
| 延迟(Latency) | 请求 p50 / p95 / p99 响应时间 | Jaeger Span 耗时、APM 直方图 |
| 错误率(Error Rate) | HTTP 5xx 占比 / gRPC 错误码占比 | Jaeger Span 状态、日志错误计数 |
| 吞吐量(Throughput) | 每秒请求数(RPS)、每秒事务数(TPS) | 调用链入口 Span 计数 |
| 可用性(Availability) | 成功请求数 / 总请求数 | 健康检查、调用链完成率 |
| 饱和度(Saturation) | CPU 使用率、连接池占用率、队列深度 | 基础设施指标、Jaeger 采样率变化 |
关键认知: SLI 必须从用户视角定义。例如,数据库查询延迟的 SLI 不应只采集服务端平均耗时,而应采集用户端感知到的 p99 延迟,后者通常包含网络开销与排队等待时间。
1.2 什么是 SLO(服务等级目标)
SLO 是为 SLI 设定的目标阈值,它定义了“多好才算足够好”。SLO 不是一个固定值,而是基于业务容忍度、成本与风险平衡后确定的承诺边界。SLO 通常以“在时间窗口内,SLI 达到或超过目标值的比例”来表达。
# SLO 典型表达格式
SLO = "在 [滚动窗口] 内,[SLI 名称] ≥ [目标值] 的比例 ≥ [达标比例]"
# 示例
SLO = "在 28 天滚动窗口内,HTTP 请求 p99 延迟 ≤ 500ms 的比例 ≥ 99.9%"
| SLO 严格程度 | 典型目标值 | 适用场景 |
|---|---|---|
| 严格 SLO | 99.99% 以上(四个九) | 支付、实时交易、核心数据库 |
| 中等 SLO | 99.9% ~ 99.99%(三个九) | API 网关、用户认证、商品查询 |
| 宽松 SLO | 99% ~ 99.9%(两个九) | 日志收集、非实时报表、后台批处理 |
| 尽力 SLO | < 99% | 开发环境、实验性功能、内部工具 |
常见误区: 不要将 SLO 设定为 100%。100% 可用性意味着零故障容忍,这在分布式系统中既不现实,也会导致过度投入成本。SRE 实践推荐使用错误预算(Error Budget)来管理 SLO 的剩余空间。
1.3 SLI 与 SLO 在可观测性中的核心地位
可观测性(Observability)的三大支柱——指标(Metrics)、日志(Logs)、调用链(Traces)——只有在 SLI/SLO 框架下才能形成闭环。调用链数据(如 Jaeger 采集的 Span)是构建 SLI 最精细的数据源,因为它能穿透服务拓扑,定位到每一次请求的完整路径。
核心关系链:
Jaeger 调用链数据 → 提取 SLI(延迟/错误率/吞吐量) → 对比 SLO 目标 → 触发告警或错误预算消耗 → 驱动基线校准与容量规划
Jaeger 调用链数据 → 提取 SLI(延迟/错误率/吞吐量) → 对比 SLO 目标 → 触发告警或错误预算消耗 → 驱动基线校准与容量规划
1.4 为什么调用链数据是 SLI 的最佳载体
相比聚合指标与日志,调用链数据在 SLI 构建中具有不可替代的优势:
- 端到端穿透:一次用户请求经过多个微服务,调用链能将各阶段延迟与错误串联,构建真实用户 SLI,而非单点指标。
- 错误根因定位:当 SLI 违反 SLO 时,调用链可直接定位到故障 Span,无需人工排查日志关联。
- 依赖拓扑可视化:通过调用链数据可自动生成服务依赖图,辅助识别 SLI 瓶颈节点。
- 高基数维度:调用链携带 Trace ID、Span ID、用户 ID、请求参数等标签,支持按任意维度切分 SLI。
1.5 SLI 口径基线校准的必要性
SLI 口径基线校准是指:基于历史调用链数据,为 SLI 建立动态的、可自适应的基准线,而非依赖固定阈值。原因如下:
- 业务周期性波动:白天与夜晚、工作日与周末的流量模式不同,固定阈值会导致误告警或漏告警。
- 服务拓扑变化:新服务上线、旧服务下线、依赖关系变更都会改变 SLI 分布。
- 版本迭代影响:代码变更可能引入毫秒级延迟增加,固定阈值无法感知渐进式退化。
- 错误预算精细化:只有校准后的基线,才能准确计算错误预算消耗速率。
本课程核心命题: 如何利用 Jaeger 调用链数据(Span 耗时、错误状态、服务依赖)自动构建 SLI 口径基线,并在 SLO 违反前给出预警,实现从“被动响应”到“主动校准”的 SRE 能力升级。