4. SLI 基础概念:服务等级指标定义与黄金信号
服务等级指标(Service Level Indicator, SLI)是衡量系统某一特定维度服务质量的量化度量。它是 SRE 实践中最基础的观测单元,直接决定了我们能否客观判断服务是否“健康”。
4.1 SLI 定义与核心特征
SLI 是对服务行为的某个方面进行直接测量的数值,通常表示为一段时间内的比率、计数或分布。一个合格的 SLI 必须满足以下特征:
- 可测量:能从监控系统或日志中直接采集,而非主观推断。
- 面向用户:优先测量用户可见的请求路径,而非内部组件指标。
- 时间聚合:通常以窗口期(如 1 分钟、5 分钟、30 天)聚合为比率。
- 可区分好坏:能明确判定单次请求或采样点是否“成功”。
4.2 SLI 与 SLO、错误预算的关系
SLI、SLO(服务等级目标)和错误预算构成了 SRE 质量管理的三角模型。三者关系如下表所示:
| 概念 | 定义 | 典型示例 | 作用 |
|---|---|---|---|
| SLI | 服务质量的实际测量值 | 请求成功率 = 99.95% | 反映当前真实状态 |
| SLO | SLI 的目标阈值 | SLI ≥ 99.9% | 定义可接受的服务质量下限 |
| 错误预算 | SLO 允许的失败额度 | 30 天内允许 0.1% 的请求失败 | 平衡可靠性与迭代速度 |
三者的核心关系可以概括为:SLI 是实际观测值,SLO 是期望目标,错误预算是 SLO 未达标部分的量化额度。当 SLI 持续高于 SLO 时,错误预算累积;当 SLI 跌破 SLO 时,错误预算消耗殆尽,应触发质量门禁或发布暂停。
错误预算 = 1 - SLO(以小数表示)
例如:SLO = 99.9% → 错误预算 = 0.1% = 0.001
在 30 天窗口内,总请求数为 10,000,000,则允许失败请求数 = 10,000,000 × 0.001 = 10,000 次。
4.3 SLI 的黄金信号(The Four Golden Signals)
Google SRE 经典著作《Site Reliability Engineering》提出了监控分布式系统的四个黄金信号。这四类指标覆盖了用户可感知的服务质量全貌,是定义 SLI 的首选维度。
| 黄金信号 | 英文 | 测量对象 | 典型 SLI 示例 |
|---|---|---|---|
| 延迟 | Latency | 请求处理耗时 | P95 延迟 < 500ms;平均延迟 < 200ms |
| 流量 | Traffic | 请求负载量 | QPS > 1000;每秒活跃连接数 |
| 错误 | Errors | 请求失败率 | HTTP 5xx 率 < 0.1%;超时率 < 0.05% |
| 饱和度 | Saturation | 资源耗尽程度 | CPU 使用率 < 80%;内存使用率 < 75% |
4.3.1 延迟(Latency)
延迟衡量请求从发出到收到完整响应所花费的时间。延迟 SLI 通常使用百分位值(P50、P95、P99)而非平均值,因为平均值会掩盖长尾慢请求。在 CI/CD 流水线中,延迟 SLI 常用于判断新版本是否引入了性能退化。
4.3.2 流量(Traffic)
流量反映系统当前承载的请求量级。常见的流量 SLI 包括每秒请求数(QPS)、每秒事务数(TPS)、活跃连接数等。流量本身不是质量指标,但流量突变往往是延迟或错误率恶化的前兆。
4.3.3 错误(Errors)
错误信号直接衡量请求失败的比例。错误 SLI 的定义必须明确“什么是失败”:显式错误(HTTP 5xx)、隐式错误(返回 200 但业务逻辑异常)、超时、连接拒绝等。在质量门禁中,错误率是最常用的阻断条件。
4.3.4 饱和度(Saturation)
饱和度衡量系统资源被消耗的程度,通常与容量规划直接相关。常见的饱和度 SLI 包括 CPU 利用率、内存使用率、磁盘 I/O 等待时间、连接池使用率等。当饱和度接近 100% 时,延迟和错误率通常会急剧上升。
4.4 黄金信号在 CI/CD 质量门禁中的应用
在质量门禁驱动的流水线中,黄金信号被转化为具体的 SLI 口径和门禁阈值。以下是一个典型的门禁配置示例:
# 质量门禁 SLI 配置示例(YAML 格式)
quality_gates:
- name: "延迟门禁"
sli_type: latency
metric: "http_request_duration_seconds_p99"
threshold: 0.5 # 单位:秒
window: "5m" # 评估窗口
action: "block" # 阻断发布
- name: "错误率门禁"
sli_type: errors
metric: "http_requests_total{status=~'5..'}"
threshold: 0.001 # 0.1%
window: "10m"
action: "block"
- name: "饱和度门禁"
sli_type: saturation
metric: "node_cpu_utilization"
threshold: 0.8 # 80%
window: "5m"
action: "warn" # 仅告警,不阻断
4.5 定义 SLI 的通用步骤
- 识别用户关键路径:确定用户最常使用的 API、页面或功能。
- 选择黄金信号维度:从延迟、错误、流量、饱和度中选取 1~3 个最相关的维度。
- 确定测量口径:明确计数方式(请求总数 vs 成功数)、时间窗口、聚合方式(平均值 vs 百分位)。
- 设定好坏判定标准:定义单次请求“成功”和“失败”的精确条件。
- 验证可测量性:确认监控系统能稳定采集该指标,且延迟在可接受范围内。
通过以上步骤定义的 SLI,才能可靠地驱动 SLO 和错误预算的计算,最终成为质量门禁的量化依据。