深色模式
混沌与 SLO 结合
摘要:错误预算是混沌实验的准生证:预算充足才做实验,预算紧张就先修稳定性。本文给出 SLO 与预算的查询方式、实验准入规则,以及实验消耗预算的统计方法。
适用环境
bash
# SLO 通常以 PromQL recording rule 形式存在
grep -rn 'slo' /etc/prometheus/rules/*.yml | head
curl -sS http://127.0.0.1:9090/api/v1/rules | jq -r '.data.groups[].rules[].name' | grep -i slo1
2
3
2
3
操作步骤
第 1 步:定义并查询 SLI/SLO
yaml
# 例子:下单成功率 SLO = 99.9% / 30 天
- record: slo:order_success_ratio:rate30d
expr: >
sum(rate(http_requests_total{job="order",code!~"5.."}[30d]))
/ sum(rate(http_requests_total{job="order"}[30d]))1
2
3
4
5
2
3
4
5
bash
curl -sS --data-urlencode 'query=slo:order_success_ratio:rate30d' \
http://127.0.0.1:9090/api/v1/query | jq -r '.data.result[].value[1]'1
2
2
第 2 步:计算剩余错误预算
bash
cat > budget.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
# 用法: ./budget.sh <slo目标 0.999> <实测值>
target=$1; actual=$2
awk -v t="$target" -v a="$actual" 'BEGIN{
allowed = (1-t)*100; used = (1-a)*100;
left = allowed - used;
printf "允许错误率: %.3f%%\n实际错误率: %.3f%%\n剩余预算: %.3f%%\n", allowed, used, left;
if (left <= 0) print "预算耗尽,禁止非必要混沌实验"; else print "预算充足,可开展实验";
}'
EOF
chmod +x budget.sh && ./budget.sh 0.999 0.99951
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
第 3 步:制定准入规则
bash
cat > admission.md <<'EOF'
| 剩余预算 | 允许的实验 |
| --- | --- |
| > 50% | 正常实验,含生产小范围 |
| 20%~50% | 仅限测试/预发环境 |
| < 20% | 仅允许只读、可即时中止的实验 |
| 0(耗尽) | 暂停一切实验,先做稳定性改造 |
EOF1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
第 4 步:统计实验消耗的预算
bash
# 实验窗口内的错误率增量即消耗量
cat > spend.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
PROM=${PROM:-http://127.0.0.1:9090}
start=$1; end=$2 # RFC3339
q="sum(rate(http_requests_total{job=\"order\",code=~\"5..\"}[1m]))/sum(rate(http_requests_total{job=\"order\"}[1m]))"
curl -sS --data-urlencode "query=$q" --data-urlencode "time=$end" "$PROM/api/v1/query" \
| jq -r '.data.result[].value[1]'
EOF
chmod +x spend.sh1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
第 5 步:把结论写进报告
bash
cat >> exp-012.md <<'EOF'
## 预算影响
- 实验前剩余预算:62%
- 本次消耗:约 3%
- 实验后剩余:59%(仍在准入线以上)
EOF1
2
3
4
5
6
7
2
3
4
5
6
7
验证
bash
# 1. SLO recording rule 存在且可查询
curl -sS http://127.0.0.1:9090/api/v1/rules | jq -r '.data.groups[].rules[] | select(.name|test("slo")) | .name'
# 2. 预算脚本输出合理
./budget.sh 0.999 0.998
# 3. 准入判定被写进实验卡片
grep -c '预算' exp-012.md1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
常见坑
预算耗尽仍在强推实验
这是对稳定性目标的直接违背。预算为 0 时唯一该做的事是修复稳定性。
只统计"实验期间"的消耗
实验引发的延迟恢复期也算消耗。统计窗口要覆盖实验结束后至少 30 分钟。
SLO 定义本身错误导致判断颠倒
指标口径错了(如把 4xx 也算失败),预算计算全盘失真。先校准 SLI 口径,再用它做准入。