ЁЯФН рдзрдбрд╛ 11 тАФ Root-cause analysis: рд╣реЗ рдЦрд░реЛрдЦрд░ рдХрд╛ рдШрдбрд▓реЗ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 11 ┬╖ рдорд╛рдЧреАрд▓: lesson-10-incident-response ┬╖ рдкреБрдвреАрд▓: lesson-12-postmortems
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ10, рдЖрдгрд┐ рдЦрд░реЗ рдХрд╛рд░рдг рд╢реЛрдзрдгреЗ: change correlation (рдЕрдЧрджреА рдЖрдзреА рдХрд╛рдп
рдмрджрд▓рд▓реЗ?), рдкрд╛рдЪ рдХрд╛, рдЖрдгрд┐ рдЙрддреНрддрд░ рдЬрд╡рд│рдЬрд╡рд│ рдиреЗрд╣рдореАрдЪ рд╡реНрдпрдХреНрддреА рдирд╡реНрд╣реЗ рддрд░ process рдордзрд▓реЗ рдирд╕рд▓реЗрд▓реЗ
рд╕рдВрд░рдХреНрд╖рдг рдХрд╛ рдЕрд╕рддреЗ. first_bad_minute(), suspect_changes() рдЖрдгрд┐ five_whys()
obs/reliability.py рдордзреНрдпреЗ рдЖрд╣реЗрдд;
obs/demo.py рдордзрд▓реЗ rootcause() рддреНрдпрд╛рдВрдирд╛ рдирд┐рдХрд╛рд▓рд╛рдЪреНрдпрд╛ рджрд┐рд╡рд╕рд╛рд╡рд░ рдЪрд╛рд▓рд╡рддреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╕рд░рд╛рд╡рд╛рдирдВрддрд░ рд╕рдЧрд│реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдЖрд╣реЗрдд. рдЖрддрд╛ рдХрддрд░рд┐рдирд╛ рд╡рд┐рдЪрд╛рд░рддреЗ: рд╣реЗ рдХрд╛ рдШрдбрд▓реЗ?
рдЖрдзреА рддреА рдШрдбреНрдпрд╛рд│ рдЖрдгрд┐ рднреЗрдЯ рдиреЛрдВрджрд╡рд╣реА рдкрд╛рд╣рддреЗ. рдзреВрд░ 11:40 рд▓рд╛ рд╕реБрд░реВ рдЭрд╛рд▓рд╛. 11:40 рдЪреНрдпрд╛ рдЕрдЧрджреА рдЖрдзреА рдХреЛрдг рдЖрдд рдЖрд▓реЗ рдХрд┐рдВрд╡рд╛ рдХреЛрдгреА рдХрд╛рд╣реАрддрд░реА рдмрджрд▓рд▓реЗ? рдиреЛрдВрджрд╡рд╣реА рд╕рд╛рдВрдЧрддреЗ: 11:38 рд▓рд╛, staff room рдордзреНрдпреЗ рдПрдХ рдирд╡рд╛ toaster рд▓рд╛рд╡рд▓рд╛ рдЧреЗрд▓рд╛. рддреЛ рдкрд╣рд┐рд▓рд╛ рд╕рдВрд╢рдпрд┐рдд.
рдордЧ рддреА рд╡рд┐рдЪрд╛рд░рддреЗ "рдХрд╛?" тАФ рдЖрдгрд┐ рдкреБрдиреНрд╣рд╛ рд╡рд┐рдЪрд╛рд░рддреЗ, рдкреБрдиреНрд╣рд╛ рдкреБрдиреНрд╣рд╛:
- рдзреВрд░ рдХрд╛ рдЖрд▓рд╛? Toaster рдиреЗ рдкрд╛рд╡ рдЬрд╛рд│рд▓рд╛.
- рддреЛ рдХрд╛ рдЬрд│рд▓рд╛? Toaster 20 рдорд┐рдирд┐рдЯреЗ рдЪрд╛рд▓реВ рд░рд╛рд╣рд┐рд▓рд╛.
- рддреЛ рдЪрд╛рд▓реВ рдХрд╛ рд░рд╛рд╣рд┐рд▓рд╛? рддреНрдпрд╛рд▓рд╛ рдмрдВрдж рдХрд░рдгрд╛рд░рд╛ timer рдирд╛рд╣реА.
- Timer рдирд╕рд▓реЗрд▓реНрдпрд╛ toaster рд▓рд╛ рдкрд░рд╡рд╛рдирдЧреА рдХрд╛ рдорд┐рд│рд╛рд▓реА? рд╕реНрд╡рдпрдВрдкрд╛рдХрдШрд░рд╛рдЪреНрдпрд╛ рдирд╡реНрдпрд╛ рд╡рд╕реНрддреВ рдХреЛрдгреАрдЪ рддрдкрд╛рд╕рдд рдирд╛рд╣реА.
- рдХреЛрдгреАрдЪ рдХрд╛ рддрдкрд╛рд╕рдд рдирд╛рд╣реА? рд╕реНрд╡рдпрдВрдкрд╛рдХрдШрд░рд╛рдЪреНрдпрд╛ рдирд╡реНрдпрд╛ рд╡рд╕реНрддреВрдВрд╕рд╛рдареА рдХреЛрдгрддреАрд╣реА checklist рдирд╛рд╣реА.
рдХрддрд░рд┐рдирд╛ "рдХреБрдгреАрддрд░реА рддреЛ рдЪрд╛рд▓реВ рдареЗрд╡рд▓рд╛" рдЗрдереЗ рдерд╛рдВрдмрдд рдирд╛рд╣реА. рдорд╛рдгрд╕реЗ рдЧреЛрд╖реНрдЯреА рд╡рд┐рд╕рд░рддрд╛рдд; рддреЗ рдЙрджреНрдпрд╛рд╣реА рдкреБрдиреНрд╣рд╛ рдШрдбреЗрд▓. Timer рдЖрдгрд┐ checklist рд╣реЗ рд╕рдЧрд│реНрдпрд╛рдВрд╕рд╛рдареА рджреБрд░реБрд╕реНрдд рдХрд░рддрд╛рдд.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
spike["ЁЯУИ error ratio first above 5% at minute 400"]
ch["ЁЯЧВя╕П changes in the 30 minutes before<br/>398 deploy results-api v42 тЬЕ suspect<br/>(90 config ┬╖ 250 v41 ┬╖ 430 rollback тАФ outside)"]
spike --> ch
ch --> w1["why 1? parents saw 504 on /results"]
w1 --> w2["why 2? the grade service call took 1 s and timed out"]
w2 --> w3["why 3? v42 removed the grade cache"]
w3 --> w4["why 4? the load test used 3 classes, not 900"]
w4 --> w5["why 5? no production-like load test in the release checklist"]
w5 --> fix["ЁЯФз fix the PROCESS, not the person"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/observability/lesson-diagrams.html#l11
тЭУ рдХрд╛рдп
- Root-cause analysis (RCA) тАФ incident рдХрд╛ рдШрдбрд▓реЗ рддреЗ рдЗрддрдХреНрдпрд╛ рдЦреЛрд▓рд╡рд░ рд╢реЛрдзрдгреЗ рдХреА рдПрдЦрд╛рджрд╛ fix рддреЗ (рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЗрддрд░) рдкрд░рдд рдпреЗрдгреНрдпрд╛рдкрд╛рд╕реВрди рдерд╛рдВрдмрд╡реЗрд▓.
- Change correlation тАФ рдмрд╣реБрддреЗрдХ incidents рдПрдЦрд╛рджреНрдпрд╛ рдмрджрд▓рд╛рдирдВрддрд░ рдпреЗрддрд╛рдд: deploy, config рдмрджрд▓, feature flag, dependency upgrade, infrastructure рдмрджрд▓, certificate рдХрд┐рдВрд╡рд╛ data migration. рдореНрд╣рдгреВрди рдкрд╣рд┐рд▓рд╛ рдкреНрд░рд╢реНрди рдЖрд╣реЗ "рд╣рд╛рдиреА рд╕реБрд░реВ рд╣реЛрдгреНрдпрд╛рдЪреНрдпрд╛ рдЕрдЧрджреА рдЖрдзреА рдХрд╛рдп рдмрджрд▓рд▓реЗ?". рддреБрдореНрд╣рд╛рд▓рд╛ рд▓рд╛рдЧрддреЗ: рд╣рд╛рдиреАрдЪреА рдиреЗрдордХреА рд╕реБрд░реБрд╡рд╛рдд (SLI рдордзреВрди, page рдордзреВрди рдирд╛рд╣реА тАФ page 9 рдорд┐рдирд┐рдЯрд╛рдВрдиреА рдЙрд╢рд┐рд░рд╛ рдЖрд▓реЗ) рдЖрдгрд┐ рд╡реЗрд│реЗрд╕рд╣ рдкреНрд░рддреНрдпреЗрдХ рдмрджрд▓рд╛рдЪреА рдиреЛрдВрдж.
- Lookback тАФ рд╕реБрд░реБрд╡рд╛рддреАрдЪреНрдпрд╛ рдХрд┐рддреА рдЖрдзреАрдкрд░реНрдпрдВрдд рддреБрдореНрд╣реА рдкрд╛рд╣рддрд╛. рдЦреВрдк рдХрдореА рдареЗрд╡рд▓реЗ рддрд░ рд╣рд│реВ рдкрд░рд┐рдгрд╛рдо рд╕реБрдЯрддреЛ (рдПрдХ cache TTL рдЬреНрдпрд╛рдЪрд╛ рдкрд░рд┐рдгрд╛рдо рджрд┐рд╕рд╛рдпрд▓рд╛ рдПрдХ рддрд╛рд╕ рд▓рд╛рдЧрддреЛ); рдЦреВрдк рдЬрд╛рд╕реНрдд рдареЗрд╡рд▓реЗ рддрд░ рд╕рдЧрд│реНрдпрд╛рдЪ рдЧреЛрд╖реНрдЯреАрдВрдЪреА рдпрд╛рджреА рдорд┐рд│рддреЗ.
- Correlation рдореНрд╣рдгрдЬреЗ рдкреБрд░рд╛рд╡рд╛ рдирд╡реНрд╣реЗ тАФ spike рдЪреНрдпрд╛ рдЕрдЧрджреА рдЖрдзреАрдЪрд╛ рдмрджрд▓ рд╣рд╛ рд╕рдВрд╢рдпрд┐рдд рдЕрд╕рддреЛ. рддреНрдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рд╛: rollback рдиреЗ рд╣рд╛рдиреА рдерд╛рдВрдмрд▓реА рдХрд╛? Diff рдиреЗ symptom рд╕реНрдкрд╖реНрдЯ рд╣реЛрддреЛ рдХрд╛? рддреБрдореНрд╣реА рддреЗ staging рдордзреНрдпреЗ рдкреБрдиреНрд╣рд╛ рдШрдбрд╡реВ рд╢рдХрддрд╛ рдХрд╛?
- рдкрд╛рдЪ рдХрд╛ тАФ рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрддрд░рд╛рдмрджреНрджрд▓ "рдХрд╛?" рд╡рд┐рдЪрд╛рд░рд╛, рд╕реБрдорд╛рд░реЗ рдкрд╛рдЪ рд╡реЗрд│рд╛, рдЬреЛрдкрд░реНрдпрдВрдд рддреБрдореНрд╣реА рд╕рдВрд╕реНрдерд╛ рдмрджрд▓реВ рд╢рдХреЗрд▓ рдЕрд╢рд╛ рдЧреЛрд╖реНрдЯреАрдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрдд рдирд╛рд╣реА (test, рд╕рдВрд░рдХреНрд╖рдг, checklist, alert, limit). рдкрд╛рдЪ рд╣реА рд╕рд╡рдп рдЖрд╣реЗ, рдХрд╛рдпрджрд╛ рдирд╛рд╣реА: рдкреБрдврдЪрд╛ "рдХрд╛" рддреБрдордЪреНрдпрд╛ рдирд┐рдпрдВрддреНрд░рдгрд╛рдмрд╛рд╣реЗрд░ рдЧреЗрд▓рд╛ рдХреА рдерд╛рдВрдмрд╛.
- Contributing factors тАФ рдЦрд▒реНрдпрд╛ incidents рдордзреНрдпреЗ рд╕рд╣рд╕рд╛ рдЕрдиреЗрдХ causes рдПрдХрддреНрд░ рдЬреБрд│рд▓реЗрд▓реЗ рдЕрд╕рддрд╛рдд (deploy рдЖрдгрд┐ рдЦреВрдкрдЪ рд▓рд╣рд╛рди load test рдЖрдгрд┐ canary рдирд╛рд╣реА). рдореНрд╣рдгреВрдирдЪ рдЕрдиреЗрдХ teams рдПрдХрд╛рдЪ "root cause" рдРрд╡рдЬреА "contributing factors" рдореНрд╣рдгрддрд╛рдд.
- "Human error" рд╣реЗ рдХрдзреАрдЪ root cause рдирд╕рддреЗ тАФ рддрд┐рдереВрди рд╢реЛрдз рд╕реБрд░реВ рд╣реЛрддреЛ. рд╡рд┐рдЪрд╛рд░рд╛ рдХреА рдПрдХрд╛ рд╡реНрдпрдХреНрддреАрдЪреА рд╕рд╛рдорд╛рдиреНрдп рдЪреВрдХ users рдкрд░реНрдпрдВрдд system рдиреЗ рдХрд╛ рдкреЛрд╣реЛрдЪреВ рджрд┐рд▓реА.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рддреБрдореНрд╣реА рдирд┐рд╡рдбрд▓реЗрд▓рд╛ fix рддреБрдореНрд╣реА рдХрд┐рддреА рдЦреЛрд▓ рдЬрд╛рддрд╛ рдпрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЛ. "v42 рд╡рд╛рдИрдЯ рд╣реЛрддреЗ" рдЗрдереЗ рдерд╛рдВрдмрд▓рд╛рдд рддрд░ рддреБрдореНрд╣реА roll back рдХрд░рддрд╛ рдЖрдгрд┐ v43 рдиреЗ рддреЗрдЪ рдХрд░рдгреНрдпрд╛рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рддрд╛. "engineer cache рд╡рд┐рд╕рд░рд▓рд╛" рдЗрдереЗ рдерд╛рдВрдмрд▓рд╛рдд рддрд░ рддреБрдореНрд╣реА рдПрдХрд╛ рд╡реНрдпрдХреНрддреАрд▓рд╛ рджреЛрд╖ рджреЗрддрд╛, рд▓реЛрдХ рдкреБрдврдЪреА рдЪреВрдХ рд▓рдкрд╡рддрд╛рдд, рдЖрдгрд┐ рдХрд╛рд╣реАрдЪ рдмрджрд▓рдд рдирд╛рд╣реА. "release checklist рдордзреНрдпреЗ production рд╕рд╛рд░рдЦреА load test рдирд╛рд╣реА" рдЗрдердкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрд╛ рдЖрдгрд┐ рддреБрдореНрд╣реА рдЕрд╢реА рдкреЛрдХрд│реА рднрд░рддрд╛ рдЬрд┐рдиреЗ рд╣рд╛ deploy рдкрдХрдбрд▓рд╛ рдЕрд╕рддрд╛ тАФ рдЖрдгрд┐ рдкреБрдврдЪреЗ рдкрд╛рдЪрд╣реА.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
obs/reliability.py рдордзрд▓реЗ
first_bad_minute(errors, requests, ratio=0.05) error ratio
ratio рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЕрд╕рд▓реЗрд▓рд╛ рдкрд╣рд┐рд▓рд╛ minute рджреЗрддреЗ тАФ рд╣рд╛рдиреАрдЪреА рд╕реБрд░реБрд╡рд╛рдд. suspect_changes(changes, spike_minute, lookback=30) рддреНрдпрд╛ minute рдкрд░реНрдпрдВрдд рдЖрдгрд┐ рддреЛ рдзрд░реВрди, lookback рдорд┐рдирд┐рдЯрд╛рдВрддреАрд▓ рдкреНрд░рддреНрдпреЗрдХ (minute, what) рдмрджрд▓
рджреЗрддреЗ (рджрд┐рд▓реЗрд▓реНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ). five_whys(chain) рдЙрддреНрддрд░рд╛рдВрдЪреНрдпрд╛ рд╕рд╛рдЦрд│реАрд▓рд╛ рдХреНрд░рдорд╛рдВрдХ рджреЗрддреЗ.
obs/demo.py рдордзрд▓реЗ CHANGES рджрд┐рд╡рд╕рд╛рддрд▓реЗ рдЪрд╛рд░ рдмрджрд▓ рдиреЛрдВрджрд╡рддреЗ: 90 рд▓рд╛ рдПрдХ cache TTL
config, 250 рдЖрдгрд┐ 398 рд▓рд╛ deploys, рдЖрдгрд┐ rollback.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
Minute 385 рд▓рд╛ рдПрдХ feature flag рдЬреЛрдбрд╛ (рджреБрд╕рд░рд╛ рд╕рдВрд╢рдпрд┐рдд), рдЖрдгрдЦреА рдорд╛рдЧреЗ рдкрд╛рд╣рд╛ тАФ рдордЧ рддреАрдЪ tools slow leak рдХрдбреЗ рд╡рд│рд╡рд╛ (0.5% рдЪреА рд░реЗрд╖рд╛), рдЖрдгрд┐ рдЦреВрдк рд▓рд╡рдХрд░ рдерд╛рдВрдмрдгрд╛рд░реА рд╕рд╛рдЦрд│реА рд▓рд┐рд╣рд╛:
python3 obs/demo.py rootcause
python3 - <<'EOF'
import sys; sys.path.insert(0, "obs"); from demo import ERR, REQ, CHANGES; from reliability import first_bad_minute, suspect_changes, five_whys
changes = sorted(CHANGES + [(385, "feature flag: new PDF certificates ON")])
for ratio in (0.05, 0.005):
spike = first_bad_minute(ERR, REQ, ratio)
print(f"first minute above {ratio:.1%}: {spike}")
for lookback in (30, 180):
print(f" changes in the {lookback} min before тЖТ {suspect_changes(changes, spike, lookback)}")
for w in five_whys(["the results page returned 504", "the grade service was slow", "Katrina pressed deploy"]): print(w)
EOF
python3 obs/test_obs.py
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
rootcause рд╣реЗ print рдХрд░рддреЗ:
тФАтФА the error ratio first crosses 5% at minute 400
changes in the 30 minutes before: [(398, 'deploy results-api v42')]
why 1? parents saw 504 on /results
why 2? the grade service call took 1 s and timed out
why 3? v42 removed the grade cache, so every view hit the grade service
why 4? the load test used 3 classes, not 900
why 5? there is no production-like load test in the release checklist
the root cause is usually a missing guard in the PROCESS, not a person
рддреБрдордЪрд╛ snippet рд╣реЗ print рдХрд░рддреЛ:
first minute above 5.0%: 400
changes in the 30 min before тЖТ [(385, 'feature flag: new PDF certificates ON'), (398, 'deploy results-api v42')]
changes in the 180 min before тЖТ [(250, 'deploy results-api v41'), (385, 'feature flag: new PDF certificates ON'), (398, 'deploy results-api v42')]
first minute above 0.5%: 100
changes in the 30 min before тЖТ [(90, 'config: cache TTL 60 s тЖТ 5 s')]
changes in the 180 min before тЖТ [(90, 'config: cache TTL 60 s тЖТ 5 s')]
why 1? the results page returned 504
why 2? the grade service was slow
why 3? Katrina pressed deploy
Tests рдордзреНрдпреЗ тЬЕ L10/L11 incident maths and the suspect change рдЕрд╕рддреЛ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
Window рдордзреНрдпреЗ рдПрдХрдЪ рдмрджрд▓ рдЕрд╕реЗрд▓ рддрд░ рд╕рдВрд╢рдпрд┐рдд рд╕рд╣рдЬ рдорд┐рд│рддреЛ. рдПрдХ flag рдЬреЛрдбрд╛ рдЖрдгрд┐ рджреЛрди рд╣реЛрддрд╛рдд, рдЖрдгрд┐ 180-minute lookback рддрд┐рд╕рд░рд╛ рдЬреЛрдбрддреЛ тАФ correlation рдпрд╛рджреА рд▓рд╣рд╛рди рдХрд░рддреЗ; рддреЗ рдирд┐рд╡рдб рдХрд░рдд рдирд╛рд╣реА. v42 рдЪреНрдпрд╛ rollback рдиреЗ errors рд╕рдВрдкрд▓реЗ, рдпрд╛рдиреЗрдЪ рдЦрд╛рддреНрд░реА рд╣реЛрддреЗ. Slow leak рд╡рд░ рддреАрдЪ tools рдХрд╛рд╣реАрддрд░реА рдирд╡реЗ рджрд╛рдЦрд╡рддрд╛рдд: minute 90 рдЪрд╛ cache TTL рдмрджрд▓, 0.9% errors рд╕реБрд░реВ рд╣реЛрдгреНрдпрд╛рдЪреНрдпрд╛ рджрд╣рд╛ рдорд┐рдирд┐рдЯреЗ рдЖрдзреА тАФ incident рдиреЗ рдХрдзреАрдЪ рди рдкрд╛рд╣рд┐рд▓реЗрд▓рд╛ рдзрд╛рдЧрд╛, рдХрд╛рд░рдг leak рдиреЗ рдХрдзреАрдЪ page рдХреЗрд▓реЗ рдирд╛рд╣реА. рдЖрдгрд┐ рддреАрди-рдХрд╛ рдЪреА рд╕рд╛рдЦрд│реА рдПрдХрд╛ рд╡реНрдпрдХреНрддреАрд╡рд░ рдерд╛рдВрдмрд▓реА. рддреНрдпрд╛рддрд▓реЗ рдХрд╛рд╣реАрдЪ рдХрддрд░рд┐рдирд╛рд▓рд╛ рджреЛрд╖ рджрд┐рд▓реНрдпрд╛рд╢рд┐рд╡рд╛рдп рджреБрд░реБрд╕реНрдд рдХрд░рддрд╛ рдпреЗрдд рдирд╛рд╣реА. рд╡рд┐рдЪрд╛рд░рдд рд░рд╛рд╣рд╛: рдХреЛрдгрддреАрд╣реА test fail рди рд╣реЛрддрд╛ рдПрдХрд╛ deploy рдиреЗ cache рдХрд╕реЗ рдХрд╛рдвреВрди рдЯрд╛рдХрд▓реЗ?
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рд╣рд╛рдиреАрдЪреА рд╕реБрд░реБрд╡рд╛рдд SLI (400) рдРрд╡рдЬреА page рдЪреНрдпрд╛ рд╡реЗрд│реЗрд╡рд░реВрди (409) рдШреЗрдгреЗ
- config рдмрджрд▓ рдЖрдгрд┐ feature flags рдЪреА рдиреЛрдВрдж рдирд╛рд╣реА тАФ рдлрдХреНрдд deploys рджрд┐рд╕рддрд╛рдд
- рддреЛ рдмрджрд▓ рдЙрд▓рдЯрд╡рд▓реНрдпрд╛рдиреЗ рд╣рд╛рдиреА рдерд╛рдВрдмрд▓реА рдХрд╛ рд╣реЗ рди рддрдкрд╛рд╕рддрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рд╕рдВрд╢рдпрд┐рддрд╛рд▓рд╛ рд╕рд┐рджреНрдз рдорд╛рдирдгреЗ
- "root cause: human error" тАФ рдордЧ "action item: рдЕрдзрд┐рдХ рдХрд╛рд│рдЬреА рдШреНрдпрд╛"
- рддреАрди contributing factors рдЕрд╕рд▓реЗрд▓реНрдпрд╛ incident рд╡рд░ рдЬрдмрд░рджрд╕реНрддреАрдиреЗ рдПрдХрдЪ root cause рд▓рд╛рджрдгреЗ
- рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдПрдХрдЯреНрдпрд╛рдиреЗ рдХрд░рдгреЗ; рддрд┐рдереЗ рд╣рдЬрд░ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд▓реЛрдХрд╛рдВрдирд╛ graphs рди рджрд╛рдЦрд╡рдгрд╛рд▒реНрдпрд╛ рдЧреЛрд╖реНрдЯреА рдорд╛рд╣реАрдд рдЕрд╕рддрд╛рдд
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рдЦрд▒реНрдпрд╛ account рд╡рд░ тАФ рдкреНрд░рддреНрдпреЗрдХ рдмрджрд▓ рдкреНрд░рддреНрдпреЗрдХ graph рд╡рд░ рдЯрд╛рдХрд╛. Grafana annotation рдЬреЛрдбрдгрд╛рд░реА deploy pipeline step (рд╡реЗрд│ epoch milliseconds рдордзреНрдпреЗ):
curl -s -X POST https://grafana.example.school/api/annotations \
-H "Authorization: Bearer $GRAFANA_TOKEN" -H 'Content-Type: application/json' \
-d "{\"time\": $(date +%s000), \"tags\": [\"deploy\", \"results-api\"], \"text\": \"deploy results-api v42\"}"
рд╣рд╛рдиреАрдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрдЪреНрдпрд╛ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдп рдмрджрд▓рд▓реЗ рддреЗ рд╢реЛрдзрд╛:
kubectl rollout history deployment/results-api
git log --since="2026-09-27 11:00" --until="2026-09-27 11:45" --oneline -- services/results-api
aws cloudtrail lookup-events --start-time 2026-09-27T05:30:00Z --end-time 2026-09-27T06:15:00Z \
--lookup-attributes AttributeKey=ReadOnly,AttributeValue=false \
--query 'Events[].[EventTime,EventName,Username]' --output table
Error ratio version рдиреБрд╕рд╛рд░ рддреБрд▓рдирд╛ рдХрд░рд╛ тАФ рдлрдХреНрдд v42 fail рд╣реЛрдд рдЕрд╕реЗрд▓, рддрд░ рд╕рдВрд╢рдпрд┐рддрд╛рдЪреА рдЦрд╛рддреНрд░реА рд╣реЛрддреЗ (рдпрд╛рд╕рд╛рдареА
metric рд╡рд░ version label рд▓рд╛рдЧрддреЛ, рдЬреЛ low-cardinality рдЖрд╣реЗ рдЖрдгрд┐ рдареЗрд╡рдгреНрдпрд╛рд╕рд╛рд░рдЦрд╛ рдЖрд╣реЗ):
sum by (version) (rate(http_requests_total{job="results-api", status=~"5.."}[5m]))
/
sum by (version) (rate(http_requests_total{job="results-api"}[5m]))
Datadog graphs рд╡рд░ deploys events рдореНрд╣рдгреВрди рджрд╛рдЦрд╡рддреЛ рдЖрдгрд┐ APM рдЪреНрдпрд╛ Deployment Tracking рдордзреНрдпреЗ versions рдЪреА рддреБрд▓рдирд╛ рдХрд░рддреЛ; CloudWatch Amazon DevOps Guru рдХрд┐рдВрд╡рд╛ change events рдЕрд╕рд▓реЗрд▓реНрдпрд╛ dashboard рдордзреВрди CloudTrail рдмрджрд▓ рд╡рд░ рдорд╛рдВрдбреВ рд╢рдХрддреЛ. Feature flag tools (LaunchDarkly, Unleash, OpenFeature providers) audit log рдареЗрд╡рддрд╛рдд тАФ рддреЛрд╣реА рд╢реЛрдзрд╛рдд рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рд╛.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдПрдЦрд╛рджреНрдпрд╛ рдмрджрд▓рд╛рдЪреА рд╡реЗрд│реЗрд╕рд╣ рдиреЛрдВрдж рдирд╕реЗрд▓, рддрд░ рддреНрдпрд╛рдЪреА correlation рдХрд░рддрд╛ рдпреЗрдд рдирд╛рд╣реА. рдкреНрд░рддреНрдпреЗрдХ deploy, config рдмрджрд▓ рдЖрдгрд┐ flag flip рдиреЗ рдЕрд╕рд╛ timestamped event рд╕реЛрдбрд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ рдЬреЛ graphs рджрд╛рдЦрд╡реВ рд╢рдХрддреАрд▓.
тПня╕П рдкреБрдвреЗ
Cause рд╕рд╛рдкрдбрд▓реЗ. рдЖрддрд╛ рддреЗ рд▓рд┐рд╣реВрди рдареЗрд╡рд╛ тАФ рджреЛрд╖ рди рджреЗрддрд╛ тАФ рдЕрд╢рд╛ fixes рд╕рд╣ рдЬреНрдпрд╛рдВрдирд╛ owner рдЖрдгрд┐ date рдЖрд╣реЗ, рдореНрд╣рдгрдЬреЗ рддреАрдЪ рдЖрдЧ рдкреБрдиреНрд╣рд╛ рдХрдзреАрдЪ рд▓рд╛рдЧрдгрд╛рд░ рдирд╛рд╣реА.
git checkout lesson-12-postmortems