深色模式
SLO 与发布门禁
摘要:服务已经不稳了,还往上发版本只会更糟。把“错误预算剩余 > 0”作为发布门禁:预算耗尽就冻结非紧急发布,等恢复或走特批。这是错误预算最实用的落地场景之一。
适用环境
- 已定义 SLO 并能源剩余预算(见前文错误预算计算)
- 有 CI/CD 流水线(如 GitLab CI / Argo CD)
操作步骤
1. 暴露预算指标
promql
# 剩余预算比例(0~1),导出为 gauge
slo_error_budget_remaining{service="order"} # 由外部脚本定时算并 push1
2
2
2. CI 里加门禁步骤
yaml
# .gitlab-ci.yml 片段
release_gate:
script:
- |
REMAIN=$(curl -s "prometheus:9090/api/v1/query?query=slo_error_budget_remaining{service=\"$SERVICE\"}" | jq '.data.value[1]')
if awk "BEGIN{exit !($REMAIN > 0)}"; then
echo "预算充足,允许发布"
else
echo "错误预算耗尽,发布被门禁拦截" >&2
exit 1
fi1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
3. 定义豁免通道
text
紧急修复(Sev1 事故)可走“break-glass”特批,绕过门禁但需记录原因。1
DANGER
门禁拦截后必须有“人工特批 + 记录”通道,否则事故抢修时反而被自己系统挡住,耽误止损。
验证
bash
# 手动把预算指标置 0,触发一次发布,应被拦截
# 再置 >0,发布恢复1
2
2
常见坑
WARNING
- 门禁只在“非紧急发布”生效,把紧急修复也卡死会适得其反,需区分发布类型。
- 预算指标本身要可靠,采集中断导致误判“耗尽”会误拦正常发布。