3. SLI 口径设计原则:从用户视角定义可用性,避免口径污染

SLI(Service Level Indicator)是服务等级指标,其口径设计直接决定了后续异常检测的准确性和SLO(服务等级目标)的可信度。一个被“污染”的SLI口径,即使拥有最先进的检测算法,也无法反映真实的用户体验。本章核心原则是:始终从用户视角出发,定义“可用”与“不可用”的边界,并严格隔离干扰信号。

3.1 用户视角 vs. 基础设施视角

传统监控往往从基础设施视角定义指标(如CPU使用率、内存占用),但这些指标与用户实际体验之间存在巨大鸿沟。SLI口径必须映射到用户可感知的行为。

视角 典型指标 用户关联度 口径污染风险
基础设施视角 CPU > 80%、磁盘IO等待、内存页错误 低(间接关联) 高(健康但用户不可用)
应用组件视角 HTTP 5xx率、请求延迟P99、错误日志数 中(部分关联) 中(忽略客户端问题)
用户视角(SLI) 首屏加载成功、登录完成率、搜索无结果率 高(直接关联) 低(聚焦用户旅程)
关键校准点: 当服务器CPU为100%但用户请求仍被快速响应时,基础设施视角会触发告警,而用户视角的SLI不应告警。反之,当用户端网络延迟导致请求超时,即使服务器指标正常,用户视角SLI也必须标记为“不可用”。

3.2 口径污染的三大来源

口径污染是指SLI中混入了与用户可用性无关的信号,导致指标失真。以下是三大主要污染源:

  1. 内部流量污染: 健康检查、监控探针、CI/CD部署流量、内部运维脚本等非用户请求被计入SLI分母。
  2. 非关键路径污染: 将用户不关心的次要功能(如页面底部的“友情链接”加载失败)计入核心可用性计算。
  3. 异常模式污染: 爬虫攻击、DDoS流量、预加载请求等非正常用户行为扭曲了SLI的基线。
典型事故案例: 某电商平台将“所有API请求”作为SLI分母,导致一次大规模爬虫攻击使请求量暴增100倍,SLI可用性从99.9%骤降至85%。实际上,真实用户的购物流程完全正常。这就是典型的“分母膨胀”污染。

3.3 用户旅程映射与SLI定义

避免口径污染的最佳实践是:先绘制用户关键旅程(Critical User Journey, CUJ),再为每个旅程定义SLI。

用户旅程驱动的SLI口径设计流程 1. 识别关键用户旅程 登录、搜索、下单、支付 2. 分解旅程步骤 页面加载 → 接口调用 → 渲染 3. 定义SLI口径 成功/总请求,仅限用户 4. 过滤污染源 排除爬虫、内部流量 5. 设定基线阈值 基于历史数据校准 6. 持续校准口径 随业务迭代调整 反馈校准 核心原则: 每个SLI必须对应一个完整的用户操作意图,且只包含该意图的成功/失败判断。 例如:“搜索”SLI应包含输入、请求、结果渲染全过程,而非仅后端API响应。

3.4 口径过滤策略与实现

在实际工程中,通过以下策略实现口径净化:

  • 标签(Label)白名单: 在指标采集时,只保留带有 user_type="real" 或 source="customer" 标签的请求。
  • 用户代理(User-Agent)过滤: 排除已知爬虫、健康检查工具(如K8s Probes)的User-Agent。
  • 速率异常剔除: 对单IP请求速率超过3σ阈值的流量,在SLI计算中标记为“非正常用户”并排除。
  • 关键路径采样: 仅对包含核心业务ID(如订单ID、会话ID)的请求进行SLI统计。
工程实践提示: 在Prometheus或类似系统中,建议使用Recording Rules预先聚合“净化后的SLI”,而不是在查询时动态过滤。例如:
# 原始指标:http_requests_total{status="200", path="/api/checkout"}
# 净化后SLI(排除内部IP和爬虫):
- record: sli:checkout_success_rate:5m
  expr: |
    sum(rate(http_requests_total{
      status="200",
      path="/api/checkout",
      client_ip!~"10.0.0.0/8|172.16.0.0/12",
      user_agent!~"bot|crawler|healthcheck"
    }[5m]))
    /
    sum(rate(http_requests_total{
      path="/api/checkout",
      client_ip!~"10.0.0.0/8|172.16.0.0/12",
      user_agent!~"bot|crawler|healthcheck"
    }[5m]))

3.5 口径基线阈值设定

在口径净化完成后,需要为SLI设定合理的基线阈值。阈值不是静态的,而是基于历史数据动态校准的。

阈值类型 计算方法 适用场景 污染敏感度
固定阈值 人工设定(如成功率 > 99.9%) 稳定、成熟的服务 高(易被污染突破)
动态基线(移动平均) 过去7天同时间窗口的加权平均 有周期性波动的服务 中(需排除异常窗口)
预测基线(时间序列) Prophet/ARIMA模型预测值 ± 置信区间 有趋势和季节性的服务 低(模型自动适应)
口径污染对基线的影响: 如果未过滤爬虫流量,动态基线会错误地将爬虫高峰期的低成功率“学习”为正常模式,导致真实用户故障时无法触发告警。因此,口径净化必须在基线计算之前完成,这是SRE领域“先净化,再计算”的铁律。

3.6 案例:电商搜索SLI口径设计

以电商平台的“搜索”功能为例,展示从用户视角定义SLI并避免污染的全过程:

  1. 用户旅程定义: 用户在搜索框输入关键词 → 点击搜索 → 等待结果列表渲染 → 看到有效商品列表。
  2. SLI口径: 搜索成功次数 / 搜索总次数,其中“成功”定义为:从用户点击搜索到页面渲染出至少1个商品,且耗时 < 3秒。
  3. 污染排除:
    • 排除内部自动化测试的搜索请求(通过Header标记)。
    • 排除搜索词为空的“无效搜索”。
    • 排除来自已知爬虫IP段的请求。
    • 排除搜索结果为空但后端正常返回(这是业务逻辑,不是可用性问题)。
  4. 基线设定: 基于过去30天净化后的数据,取P99作为告警阈值,P95作为警告阈值。
常见误区: 不要将“搜索API响应时间”直接作为SLI。API响应快不代表用户看到了结果,可能前端渲染失败或CDN缓存未命中。必须从浏览器端或APP端采集“用户感知到的搜索完成事件”作为SLI数据源。

通过严格遵循“用户视角定义、污染源隔离、动态基线校准”的三步法,SLI口径才能真正成为异常检测的可靠基石,避免“数据说谎”的陷阱。