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的典型架构

健康检查探针SLI vs 用户请求SLI 架构对比 用户请求路径(真实SLI) 用户 / 客户端 API网关 后端服务实例 SLI口径:200/非200(含业务语义) 数据源:访问日志 / 链路追踪 探针检测路径(辅助SLI) 负载均衡器 健康检查端点 后端服务实例 SLI口径:探针端点返回200即视为健康 数据源:Prometheus / 监控系统

4.3.2 探针口径的三大风险

  1. 路径不一致:探针只检测/healthz端点,而用户请求经过完整的中间件链路(认证、限流、数据库),探针健康不代表业务可用。
  2. 状态码简化:探针通常只返回200或503,丢失了4xx/5xx的细粒度语义,无法反映限流(429)或依赖故障(502)等场景。
  3. 采样偏差:探针以固定间隔(如15s)发起请求,无法捕获两次探针之间的瞬时故障,SLI会偏乐观。
最佳实践:将探针SLI作为告警触发条件,而非SLO的最终依据。SLO的SLI必须基于用户请求日志计算。

4.4 口径案例:从原始日志到SLI的完整链路

可用性SLI计算流水线:从原始日志到最终指标 原始访问日志 Nginx / Envoy 状态码提取 正则 / 解析器 业务语义映射 规则引擎 SLI聚合计算 窗口 / 滑动 SLO 口径关键决策点 1. 是否过滤健康检查探针的请求?(避免探针流量稀释真实SLI) 2. 3xx状态码是否计入成功?(需业务确认) 3. 4xx中429是否视为失败?(限流策略决定)

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状态码的单独监控。”