SLI 指标采集的粒度与窗口期如何选取,才能既灵敏又避免误报

解读

国内生产环境普遍采用 10s 或 15s 级 Prometheus 拉取,配合 Grafana+Alertmanager 做告警。面试时,面试官想确认候选人是否能把“测得准”与“报得准”同时落地:

  1. 粒度(采样间隔)决定你能多快看到异常;
  2. 窗口期(统计区间)决定告警公式对抖动有多敏感;
  3. 两者必须跟业务峰值、用户容忍度、发布节奏、值班压力一起权衡,否则要么漏掉真故障,要么半夜被“狼来了”叫醒。

知识点

  1. SLI 定义:服务等级指标,直接对应用户体验,如“登录接口 99th 延迟≤600 ms”。
  2. 采样粒度:最小可观测时间单位,常见 10s、30s、1min。
  3. 窗口期:对指标做聚合(avg、p99、success_rate)的时间长度,如 1min、5min、10min。
  4. 误报根因:
    • 粒度太细 → 单点尖刺被放大;
    • 窗口太短 → 样本量不足,随机抖动被当成故障;
    • 阈值过严 → 正常毛刺越线。
  5. 灵敏度保障:
    • 采用“双窗口”策略:短窗口(1min)做快速探测,长窗口(5min)做确认;
    • 引入“多条件组合”,如连续 3 个短窗口越线且长窗口也越线才告警;
    • 对成功率类指标使用“置信区间”或“贝叶斯平滑”,避免分子为 0 时突变。
  6. 国内落地细节:
    • 夜间的离线批处理、秒杀、红包雨等属于周期性脉冲,需在 Prometheus 里用 record rule 先过滤掉已知脉冲段;
    • 金融或政务系统常要求 1min 内告警,因此粒度不能低于 15s,窗口不能长于 3min;
    • 多云/混合云场景下,若专线抖动导致瞬时丢包,需把“重传率”也纳入 SLI,防止只看出延迟而误判。

答案

“选型思路分三步:定目标、做实验、再调参。
第一步,先回到 SLA:如果业务要求‘核心接口 99th 延迟≤1s,月度不可用时间≤43min’,那么 SLI 必须能提前 3~5min 发现趋势性恶化,给 SRE 留出止血时间。
第二步,用历史 7 天峰值流量在测试环境回放,分别用 10s、30s、60s 三种粒度采集,再用 1min、3min、5min 窗口做 p99 聚合。对比发现:

  • 10s 粒度+1min 窗口能把 20% 以上涨幅在 90s 内检出,但误报率 8%;
  • 30s 粒度+3min 窗口误报率降到 2%,检出时间延长到 3.5min;
  • 60s 粒度+5min 窗口误报率 1%,检出时间 6min,不满足‘提前 5min’要求。
    最终线上采用‘10s 采样、双层窗口’:
  • 快速层:1min 滑动窗口,p99>阈值 且 连续 2 次触发,发‘预警’仅@值班,不电话;
  • 确认层:3min 滑动窗口,p99>阈值 且 快速层也触发,才升‘P1 告警’电话通知。
    成功率类指标额外加‘请求量≥30 才参与计算’,防止低流量下分子分母过小导致随机 100% 或 0%。上线三个月,误报率从 12% 降到 1.8%,平均检出时间 2min 40s,满足 SLA 提前量。”

拓展思考

  1. 动态阈值:结合周内同比、日内环比,用 3σ 或 EWMA 预测带,节假日自动放宽阈值,工作日收紧。
  2. 业务事件对齐:把灰度发布、定时任务、营销活动作为标签写进 Prometheus,告警规则里排除这些标签,可避免“计划内抖动”误报。
  3. 采样成本:10s 粒度对高并发服务可能带来 2~3% CPU 额外开销,可通过“直方图预聚合”+“联邦集群”下沉到边缘 Prometheus,减轻中心端压力。
  4. 容量测试反向验证:在压测平台里模拟“窗口期”内逐步提升并发,观察 SLI 何时突破阈值,把压测得出的“拐点 QPS”作为告警阈值的理论上限,再留 20% buffer,形成“测试—防护”闭环。