深色模式
混沌实验设计
摘要:没有设计的实验只是破坏。本文给出实验设计的五个要素(假设、变量、稳态指标、爆炸半径、中止条件),以及一份可复制到实验库的模板卡片。
适用环境
bash
mkdir -p chaos-experiments
# 指标查询能力是设计的硬前提
curl -sS http://127.0.0.1:9090/-/healthy && echo "Prometheus 可用"1
2
3
2
3
操作步骤
第 1 步:写出可证伪的假设
bash
# 坏:注入延迟看看系统扛不扛得住
# 好:
cat > exp-012.md <<'EOF'
## 假设
对 pay 服务注入 500ms 网络延迟后,下单接口:
- 错误率 < 1%
- P99 < 2s
- 30 秒内 HPA 扩容至 6 副本
EOF1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
假设必须可证伪:有明确阈值,能判定成立或不成立。
第 2 步:确定变量与对照
bash
cat >> exp-012.md <<'EOF'
## 变量
- 注入类型:network delay
- 注入强度:500ms ± 50ms
- 作用范围:test 命名空间 app=pay,mode=one
- 持续时间:300s
## 对照
- 基线:注入前 10 分钟同一指标
- 对照组:未注入的 order 服务
EOF1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
第 3 步:定义稳态指标与查询
bash
cat >> exp-012.md <<'EOF'
## 稳态指标
- 错误率:sum(rate(http_requests_total{job="pay",code=~"5.."}[5m]))/sum(rate(http_requests_total{job="pay"}[5m]))
- P99:histogram_quantile(0.99, rate(http_request_duration_seconds_bucket{job="pay"}[5m]))
EOF1
2
3
4
5
6
2
3
4
5
6
bash
# 查询基线值并填入卡片
curl -sS --data-urlencode 'query=histogram_quantile(0.99, rate(http_request_duration_seconds_bucket{job="pay"}[5m]))' \
http://127.0.0.1:9090/api/v1/query | jq -r '.data.result[].value[1]'1
2
3
2
3
第 4 步:写清中止条件与清理步骤
bash
cat >> exp-012.md <<'EOF'
## 中止条件
- 错误率 > 5% 持续 1 分钟
- P99 > 6s
- 人工随时可执行 ./abort.sh
## 清理
kubectl -n test delete networkchaos pay-delay
EOF1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
第 5 步:填写结论
bash
cat >> exp-012.md <<'EOF'
## 结论(实验后填写)
- 假设是否成立:不成立
- 实际观测:P99 达到 5.4s,HPA 未触发(指标未接入)
- 发现:HPA 依赖的自定义指标采集缺失
- 改进项:接入 P99 指标到 HPA(负责人 @a,截止 2026-10-27)
EOF1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
验证
bash
# 1. 实验卡片五要素齐全
for s in '## 假设' '## 变量' '## 稳态指标' '## 中止条件' '## 结论'; do
grep -q "$s" exp-012.md && echo "$s OK" || echo "$s 缺失"
done
# 2. 假设含可判定阈值
grep -cE '<|>' exp-012.md
# 3. 结论非空
sed -n '/## 结论/,$p' exp-012.md | wc -l1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
常见坑
假设写成"系统应该没问题"
无法证伪的假设无法产出结论。必须有数字阈值。
没有对照组,把波动当结果
业务指标本身有波动。对照未注入的服务,才能确认变化来自实验。
只记录成功的实验
失败的实验(假设不成立)才是最有价值的产出。实验库必须同时收录两者,否则会重复踩坑。