4. 可用性SLI口径案例:基于HTTP状态码的可用性SLI定义
在SRE实践中,可用性SLI是最基础也是最容易产生歧义的指标。本章以“HTTP状态码判定”为切入点,解析从原始日志到最终SLI数值的完整口径工程链路,重点对比200/非200判定逻辑与健康检查探针口径的差异。
4.1 核心概念:可用性SLI的两种定义模式
| 定义模式 | 判定依据 | 典型场景 | 口径风险 |
|---|---|---|---|
| 请求视角 | 用户请求的HTTP响应码 | API网关、Web应用 | 忽略非200但业务正常的响应(如301/302) |
| 探针视角 | 健康检查端点的返回码 | 负载均衡、K8s ReadinessProbe | 探针路径与真实用户路径不一致 |
关键原则:可用性SLI必须反映真实用户体验。探针视角仅作为补充,不能替代请求视角的SLI。
4.2 200/非200判定逻辑的工程陷阱
最简单的SLI公式:可用性 = 成功请求数 / 总请求数。但“成功请求”的定义远不止“HTTP 200”。
4.2.1 状态码分类与业务语义映射
| 状态码范围 | 典型码 | 是否计入成功 | 工程处理建议 |
|---|---|---|---|
| 2xx | 200, 201, 204 | ✅ 是 | 直接计入成功 |
| 3xx | 301, 302, 304 | ⚠️ 视业务而定 | 重定向若未中断用户流程,应计入成功 |
| 4xx | 400, 401, 403, 404 | ❌ 否(客户端错误) | 通常不计入成功,但需区分是否由服务端缺陷导致 |
| 5xx | 500, 502, 503, 504 | ❌ 否 | 明确的服务端故障,必须计入失败 |
常见错误:直接将“非200”全部判定为失败。例如,301重定向在短链接服务中是正常行为,若计入失败会严重扭曲SLI。
4.2.2 判定逻辑的代码实现示例
# 伪代码:可用性SLI计算核心逻辑
def is_request_successful(status_code, business_context):
# 基础规则:2xx 全部成功
if 200 <= status_code < 300:
return True
# 业务规则:3xx 根据上下文判断
if 300 <= status_code < 400:
if business_context == "redirect_service":
return True # 短链接重定向视为成功
return False # 其他场景视为异常
# 4xx:客户端错误,通常不计入服务端失败
if 400 <= status_code < 500:
# 但429(限流)可视为服务端容量不足
if status_code == 429:
return False
return True # 默认不计入服务端失败
# 5xx:服务端错误,全部失败
if status_code >= 500:
return False
return False # 未知状态码视为失败
4.3 健康检查探针口径:独立于用户请求的SLI
健康检查探针(Health Check Probe)是基础设施层面的可用性检测手段,其SLI口径与用户请求SLI存在本质区别。
4.3.1 探针SLI的典型架构
4.3.2 探针口径的三大风险
- 路径不一致:探针只检测
/healthz端点,而用户请求经过完整的中间件链路(认证、限流、数据库),探针健康不代表业务可用。 - 状态码简化:探针通常只返回200或503,丢失了4xx/5xx的细粒度语义,无法反映限流(429)或依赖故障(502)等场景。
- 采样偏差:探针以固定间隔(如15s)发起请求,无法捕获两次探针之间的瞬时故障,SLI会偏乐观。
最佳实践:将探针SLI作为告警触发条件,而非SLO的最终依据。SLO的SLI必须基于用户请求日志计算。
4.4 口径案例:从原始日志到SLI的完整链路
4.5 口径评审清单
在可靠性评审报告中,针对可用性SLI口径,必须逐项确认以下内容:
| 评审项 | 检查要点 | 通过标准 |
|---|---|---|
| 状态码映射规则 | 是否明确2xx/3xx/4xx/5xx的成败归属 | 有文档化的规则表,且经过业务方确认 |
| 探针过滤 | SLI计算是否排除了健康检查探针的请求 | 日志中标记了User-Agent或来源IP,可区分 |
| 数据源完整性 | 是否覆盖所有用户入口(网关、CDN、直连) | 数据源覆盖率 ≥ 99% 的请求量 |
| 窗口与聚合 | SLI计算窗口(1min/5min/1h)是否与SLO对齐 | 窗口长度 ≤ SLO评估周期的1/10 |
评审结论示例:“当前可用性SLI基于API网关访问日志,采用200/非200判定逻辑,已排除探针流量,3xx按业务规则计入成功。口径定义清晰,建议在SLO中增加对429状态码的单独监控。”