3. 核心概念:SLI(Service Level Indicator)的定义、分类与选择原则
3.1 SLI 的定义与本质
Service Level Indicator(服务等级指标) 是对服务某个特定维度进行量化测量的原始指标。它是可观测性数据中最基础的“信号”,直接反映系统在请求延迟、吞吐量、错误率、饱和度等方面的真实表现。
SLI 的核心特征:
- 可测量:必须能够通过工具(如 OpenTelemetry SDK、Prometheus、StatsD)采集到具体数值。
- 可聚合:支持按时间窗口(如 5 分钟、1 小时)或维度(如服务、实例、地域)进行统计。
- 面向用户:优先选择直接影响终端用户体验的指标,而非内部实现细节。
关键认知:SLI 是“原始数据”,SLO 是“目标阈值”,SLI 是 SLO 的输入。没有准确的 SLI,SLO 就是空中楼阁。
3.2 SLI 的四大分类(Google SRE 黄金指标)
| 分类 | 英文 | 定义 | 典型 OpenTelemetry 信号 |
|---|---|---|---|
| 延迟 | Latency | 请求从发出到收到完整响应所花费的时间 | http.server.duration(Histogram) |
| 流量 | Traffic | 系统处理的请求数量或数据量 | http.server.request_count(Counter) |
| 错误 | Errors | 请求失败的比率(显式错误 + 隐式错误) | http.server.error_count(Counter) |
| 饱和度 | Saturation | 系统资源被占用的程度,接近瓶颈的程度 | process.cpu.utilization、jvm.memory.used(Gauge) |
实践要点:
• 延迟 SLI 应关注 高百分位(如 p99、p95),而非平均值。
• 错误 SLI 需包含 隐式错误:如 HTTP 200 但响应体包含错误码、超时未返回等。
• 饱和度 SLI 通常作为 预警指标,在达到 SLO 阈值前提前告警。
• 延迟 SLI 应关注 高百分位(如 p99、p95),而非平均值。
• 错误 SLI 需包含 隐式错误:如 HTTP 200 但响应体包含错误码、超时未返回等。
• 饱和度 SLI 通常作为 预警指标,在达到 SLO 阈值前提前告警。
3.3 SLI 的选择原则
选择正确的 SLI 是质量门禁建设的第一步。以下是经过大规模生产验证的 5 条核心原则:
- 用户视角优先:选择用户能直接感知的指标。例如,API 网关的 p99 延迟比数据库连接池大小更贴近用户体验。
- 可观测性覆盖:确保所选 SLI 能被 OpenTelemetry 或其他采集工具完整覆盖,避免“盲区”。
- 区分信号与噪声:避免将基础设施级指标(如 CPU 温度)直接作为服务 SLI,除非它直接导致用户可见故障。
- 保持精简:每个服务建议选择 3~5 个核心 SLI,过多会导致监控疲劳和告警风暴。
- 可操作性:SLI 下降时,团队必须能快速定位根因并采取行动。无法响应的 SLI 是无效的。
3.4 SLI 在质量门禁中的角色
在质量门禁流程中,SLI 是数据校验的起点。OpenTelemetry 采集的原始指标经过以下链路进入门禁:
3.5 常见 SLI 选择示例
| 服务类型 | 推荐 SLI | OpenTelemetry 指标名示例 | 采集方式 |
|---|---|---|---|
| HTTP API 服务 | p99 延迟、错误率、请求量 | http.server.duration、http.server.error_ratio |
OTel SDK 自动插桩 |
| 消息队列消费者 | 消费延迟、处理失败率、积压量 | messaging.consumer.lag、messaging.consumer.error_count |
OTel SDK + 自定义指标 |
| 数据库服务 | 查询延迟、连接池使用率、慢查询数 | db.client.duration、db.client.connections.usage |
OTel 数据库插件 |
| 批处理作业 | 作业完成率、处理时长、失败重试次数 | job.completion.ratio、job.duration |
自定义 OTel 指标 |
常见误区:不要将“所有可采集的指标”都定义为 SLI。SLI 是经过筛选的、与用户承诺直接挂钩的关键指标。过多的 SLI 会导致门禁规则复杂化,降低运维效率。
3.6 SLI 与 OpenTelemetry 的数据模型映射
OpenTelemetry 使用三种核心信号类型承载 SLI:
- Counter(计数器):适用于流量、错误数等单调递增的 SLI。例如
http.server.request_count。 - Histogram(直方图):适用于延迟 SLI,支持计算 p50/p90/p99 等百分位。例如
http.server.duration。 - Gauge(仪表盘):适用于饱和度 SLI,反映当前瞬时值。例如
process.cpu.utilization。
// OpenTelemetry 定义延迟 SLI 的典型代码片段(Java SDK)
Histogram requestDuration = meter
.histogramBuilder("http.server.duration")
.setUnit("ms")
.setDescription("HTTP 请求延迟分布")
.setExplicitBucketBoundariesAdvice(List.of(5.0, 10.0, 25.0, 50.0, 100.0, 250.0, 500.0, 1000.0, 2500.0, 5000.0))
.build();
// 记录请求延迟
requestDuration.record(durationMs, Attributes.of(
AttributeKey.stringKey("http.method"), "GET",
AttributeKey.stringKey("http.route"), "/api/v1/orders"
));
通过合理选择 SLI 分类、遵循选择原则、并与 OpenTelemetry 数据模型对齐,团队可以构建出既精确又实用的质量门禁校验体系。