深色模式
多窗口多燃尽告警 MWMB
摘要:单窗口告警要么慢、要么抖。Google SRE 推荐的 MWMB:用“长窗口+短窗口”两个时间尺度,配不同燃尽率阈值,既能在事故早期快速响应,又不会因瞬时抖动误报。
适用环境
- 已定义 SLI/SLO 与错误预算(见前文)
- Prometheus 支持
burnrate()函数(或手动多窗口)
操作步骤
1. 理解阈值表
以 99.9% SLO、30 天预算为例:
| 燃尽率 | 短窗口 | 长窗口 | 含义 |
|---|---|---|---|
| 14.4 | 1h | 5m | 1h 烧光预算,最快 |
| 6 | 6h | 30m | 6h 烧光 |
| 3 | 1d | 2h | 1d 烧光 |
| 1 | 3d | 6h | 3d 烧光 |
2. 写告警规则(短+长配对)
yaml
groups:
- name: slo-mwmb
rules:
- alert: SloFastBurn
# 短窗口 5m 与长窗口 1h 同时超 14.4/14.4
expr: |
(1 - (sum(rate(http_requests_total{code!~"5.."}[5m]))
/ sum(rate(http_requests_total[5m])))) > (1-0.999)*14.4
and
(1 - (sum(rate(http_requests_total{code!~"5.."}[1h]))
/ sum(rate(http_requests_total[1h])))) > (1-0.999)*14.4
for: 2m
labels: { severity: critical }
- alert: SloSlowBurn
expr: |
(1 - (sum(rate(http_requests_total{code!~"5.."}[2h]))
/ sum(rate(http_requests_total[2h])))) > (1-0.999)*3
and
(1 - (sum(rate(http_requests_total{code!~"5.."}[1d]))
/ sum(rate(http_requests_total[1d])))) > (1-0.999)*3
for: 15m
labels: { severity: warning }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
3. 用 burnrate 函数更简洁
promql
# Prometheus 新版支持
burnrate(http_requests_total{code!~"5.."}[5m]) > (1-0.999)*14.41
2
2
DANGER
and 要求两个窗口同时超阈值,少写一个窗口会退化为单窗口,误报率飙升。
验证
bash
amtool alert add alertname=SloFastBurn severity=critical
# 在 Grafana 用 burnrate 面板观察速率是否触发1
2
2
常见坑
WARNING
- 阈值系数与 SLO、窗口强绑定,复制别人的数值前先按公式重算。
- 慢速窗口
for太短会变成“快速窗口”,失去分层意义。