留下一份别人能重新跑起来的记录
目标
将调查结果整理成后续人员能够再次执行的形式。把理论课程中介绍的四类记录 (复现命令、排除清单、测量值、交接文档)制作成实际文件。
在最后一个步骤中,评分器将扮演后续接手者。它会在并非你当前 shell 的环境中 运行你编写的复现命令,并检查是否得到相同的数字。实际工作中最常见的记录缺陷 就出在这里——它只能在记录编写者自己的环境中运行。
环境
/opt/app/flaky.py 模拟客户的报价 API。它不是要修复的对象,
而是需要复现的对象。
mkdir -p /root/record
nohup python3 /opt/app/flaky.py > /tmp/flaky.log 2>&1 &
sleep 1
curl -s http://127.0.0.1:8001/health
GET /health 항상 200
GET /quote 일정 주기로 503 — 본문은 upstream pool exhausted
GET /counter 지금까지 받은 /quote 요청 수
要创建的文件
所有文件都位于 /root/record/ 下。
repro.sh 증상을 다시 일으키는 명령 하나. 사람 없이 끝나고 숫자만 출력한다
before.txt 측정값과 '어떻게 쟀는지'
ruled_out.md 지운 계층과 그 근거 명령
evidence.txt 실패 응답의 상태 코드와 본문 원문
runbook.md 이 증상이 다시 났을 때 첫 30분
handoff.md 넘기는 문서
步骤
- 创建工作目录并启动目标服务。
- 编写
repro.sh。调用/quote20 次,只输出非 200 响应的数量。 它必须无需询问任何问题即可结束。 - 将结果写入
before.txt,并同时写明该数值是调用多少次后得到的,以及调用了什么。 如果只有数字,后续人员就无法用同一基准重新测量。 - 在
ruled_out.md中写下至少两个已排除的层级,并附上作为依据的命令。 - 在
evidence.txt中不要概括失败响应的状态码和正文,而要原样保留。 - 评分器将在另一个目录中、不设置环境变量的情况下运行
repro.sh。 - 在
runbook.md中写明症状、要执行的命令、判定标准,以及受阻时应前往何处。 - 在
handoff.md中写明当前状态、下一步、不要改动的内容,以及指向前面所留文件的说明。
参考
第 6 步就是本实验的核心。如果脚本依赖当前所在的 cd 目录、shell 别名或预先 export 的
变量——哪怕只依赖其中一个,也会在这里失败。数据路径必须使用绝对路径,
所需的值请在脚本内部生成。
工作目录和目标服务
创建工作目录并启动目标服务。
创建 /root/record 并启动 /opt/app/flaky.py。让它在后台运行,并确认 /health 返回 200。
将复现操作固定为一条命令
编写 repro.sh。调用 /quote 20 次,只输出非 200 响应的数量。
它必须无需询问任何问题即可结束。
调用 20 次,只输出非 200 响应的数量。使用 curl -o /dev/null -w '%{http_code}' 只获取状态码并计数即可。脚本必须在无人操作时也能结束,因此不要加入等待输入的语句。
同时记录测量值和测量方法
将结果写入 before.txt,并同时写明该数值是调用多少次后得到的,以及调用了什么。
如果只有数字,后续人员就无法用同一基准重新测量。
如果只留下数字,后续人员便无法用同一基准重新测量。请在同一文件中写明调用次数和调用的路径。
已排除的层级及其依据
在 ruled_out.md 中写下至少两个已排除的层级,并附上作为依据的命令。
仅写“检查后已排除”还不够。如果没有说明用什么排除,后续人员就会再次检查该层级。服务处于运行状态可通过 /health 证明。
原样保留失败证据
在 evidence.txt 中不要概括失败响应的状态码和正文,而要原样保留。
“出现了 503”属于概括。必须原样保留状态码和响应正文,后续人员才能确认彼此看到的是同一现象。
在另一个环境中重新运行
评分器将在另一个目录中、不设置环境变量的情况下运行 repro.sh。
评分器会先执行 cd /tmp,再清空环境变量并运行 repro.sh。如果脚本依赖相对路径或预先 export 的变量,就会在这里失败——这正是本实验的要点。
症状再次出现后的前 30 分钟
在 runbook.md 中写明症状、要执行的命令、判定标准,以及受阻时应前往何处。
Runbook 是客户在交接文档中最常重新打开的内容。它不能只有说明,还必须包含要执行的命令以及如何解读结果,这样在凌晨才真正有用。
交接文档
在 handoff.md 中写明当前状态、下一步、不要改动的内容,以及指向前面所留文件的说明。
交接中最常遗漏、代价也最高的项目是“不要改动的内容”。此外,如果只交付文档而不交付复现命令,后续人员就必须从头再来。