ЁЯзп рдзрдбрд╛ 10 тАФ Incident response: рдЕрдЧреНрдирд┐рд╢рдорди рд╕рд░рд╛рд╡
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 10 ┬╖ рдорд╛рдЧреАрд▓: lesson-09-slos ┬╖ рдкреБрдвреАрд▓: lesson-11-root-cause
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ09, рдЖрдгрд┐ page рд╡рд╛рдЬрд▓реНрдпрд╛рд╡рд░ рдХрд╛рдп рд╣реЛрддреЗ: severity levels, incident рдЪреНрдпрд╛
рднреВрдорд┐рдХрд╛ (incident commander, operations lead, communications lead, scribe), рдЖрдзреА
mitigate, status page, рдЖрдгрд┐ рдЪрд╛рд░ рдШрдбреНрдпрд╛рд│реЗ тАФ detect, acknowledge, mitigate, resolve
(MTTD, MTTA, MTTR). incident_metrics() рдЖрдгрд┐ SEVERITY
obs/reliability.py рдордзреНрдпреЗ рдЖрд╣реЗрдд;
obs/demo.py рдордзрд▓реЗ incident() рдирд┐рдХрд╛рд▓рд╛рдЪреНрдпрд╛ рджрд┐рд╡рд╕рд╛рдЪреЗ incident рдЪрд╛рд▓рд╡рддреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдЖрдЧреАрдЪреА рдШрдВрдЯрд╛ рд╡рд╛рдЬрддреЗ. рдХрд╛рдп рд╡реНрд╣рд╛рдпрд▓рд╛ рд╣рд╡реЗ? 400 рд╡рд┐рджреНрдпрд╛рд░реНрдереА 400 рджрд┐рд╢рд╛рдВрдирд╛ рдкрд│рдгреЗ рдирд╡реНрд╣реЗ.
рд╢рд╛рд│рд╛ рдЕрдЧреНрдирд┐рд╢рдорди рд╕рд░рд╛рд╡ ЁЯзп рдХрд░рддреЗ, рдЖрдгрд┐ рд╕рд░рд╛рд╡рд╛рдд рдкреНрд░рддреНрдпреЗрдХ рдореЛрдареНрдпрд╛ рд╡реНрдпрдХреНрддреАрдХрдбреЗ рдПрдХрдЪ рдХрд╛рдо рдЕрд╕рддреЗ:
- рджреАрдкрд┐рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рддреЗ. рддреА рдмрд╛рджрд▓реНрдпрд╛ рд╡рд╛рд╣рдд рдирд╛рд╣реА. рддреА рдирд┐рд░реНрдгрдп рдШреЗрддреЗ: "рд╕рдЧрд│реЗ рдкреВрд░реНрд╡реЗрдЪреНрдпрд╛ рджрд░рд╡рд╛рдЬрд╛рдиреЗ рдмрд╛рд╣реЗрд░." рд╕рдВрдкреВрд░реНрдг рдЪрд┐рддреНрд░ рддреА рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рддреЗ.
- рдХрддрд░рд┐рдирд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рд╣рд╛рддрд╛рдиреЗ рдХрд╛рдо рдХрд░рддреЗ. рддреА рдЦреЛрд▓реНрдпрд╛ рддрдкрд╛рд╕рддреЗ рдЖрдгрд┐ рджрд░рд╡рд╛рдЬреЗ рдмрдВрдж рдХрд░рддреЗ.
- рдРрд╢реНрд╡рд░реНрдпрд╛ рдлрд╛рдЯрдХрд╛рд╡рд░ рдкрд╛рд▓рдХрд╛рдВрд╢реА рдмреЛрд▓рддреЗ, рджрд░ рдХрд╛рд╣реА рдорд┐рдирд┐рдЯрд╛рдВрдиреА: рдХрд╛рдп рдШрдбрдд рдЖрд╣реЗ, рдХрд╛рдп рдХрд░рд╛рдпрдЪреЗ, рдкреБрдврдЪреА рдорд╛рд╣рд┐рддреА рдХрдзреА рдорд┐рд│реЗрд▓.
- рдПрдХ рдорджрддрдиреАрд╕ рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрдгрдп clipboard рд╡рд░ рд▓рд┐рд╣реВрди рдареЗрд╡рддреЛ.
рдЖрдгрд┐ рд╕рд░рд╛рд╡рд╛рдЪрд╛ рдкрд╣рд┐рд▓рд╛ рдирд┐рдпрдо: рдЖрдзреА рд╕рдЧрд│реНрдпрд╛рдВрдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рд╛. Corridor рдзреБрд░рд╛рдиреЗ рднрд░рд▓реЗрд▓рд╛ рдЕрд╕рддрд╛рдирд╛ рдХреЛрдгреАрд╣реА рдерд╛рдВрдмреВрди "toaster рдХреЛрдгреА рдЪрд╛рд▓реВ рдареЗрд╡рд▓рд╛?" рдЕрд╕реЗ рд╡рд┐рдЪрд╛рд░рдд рдирд╛рд╣реА. рддреЛ рдкреНрд░рд╢реНрди рдирдВрддрд░ рдпреЗрддреЛ тАФ рдзрдбреЗ 11 рдЖрдгрд┐ 12 рдордзреНрдпреЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
s["тП▒я╕П 400<br/>errors start"] -->|"detect 9 min"| d["ЁЯЪи 409<br/>page fires"]
d -->|"acknowledge 2 min"| a["ЁЯСЛ 411<br/>Dipika takes command"]
a --> m["тЖйя╕П 432<br/>rollback тАФ mitigated<br/>(32 min from start)"]
m --> r["тЬЕ 470<br/>resolved<br/>(70 min from start)"]
subgraph roles["ЁЯзСтАНЁЯЪТ roles"]
ic["ЁЯОЦя╕П incident commander тАФ Dipika"]
ops["ЁЯФз operations lead тАФ Katrina"]
com["ЁЯУг communications lead тАФ Aishwarya"]
sc["ЁЯУЭ scribe"]
end
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/observability/lesson-diagrams.html#l10
тЭУ рдХрд╛рдп
- Incident тАФ рдЕрдирд┐рдпреЛрдЬрд┐рдд рдШрдЯрдирд╛ рдЬреА users рдирд╛ рдХрд┐рдВрд╡рд╛ рд╡реНрдпрд╡рд╕рд╛рдпрд╛рд▓рд╛ рддреНрд░рд╛рд╕ рджреЗрддреЗ (рдХрд┐рдВрд╡рд╛ рд▓рд╡рдХрд░рдЪ рджреЗрдИрд▓), рдЖрдгрд┐ рдЬрд┐рд▓рд╛ рд╕рдордиреНрд╡рд┐рдд рдкреНрд░рддрд┐рд╕рд╛рдж рд▓рд╛рдЧрддреЛ. рддреЗ рд▓рд╡рдХрд░ рдЖрдгрд┐ рдореЛрдареНрдпрд╛рдиреЗ declare рдХрд░рд╛ тАФ рдирдВрддрд░ рд▓рд╣рд╛рди рдард░рд▓реЗрд▓реЗ incident рдмрдВрдж рдХрд░рд╛рдпрд▓рд╛ рдлрд╛рд░рд╕реЗ рдХрд╛рд╣реА рд▓рд╛рдЧрдд рдирд╛рд╣реА.
- Severity levels тАФ рдЖрдзреАрдЪ рдард░рд╡рд▓реЗрд▓реЗ, рдореНрд╣рдгрдЬреЗ рдкрд╣рд╛рдЯреЗ 3 рд╡рд╛рдЬрддрд╛ рдХреЛрдгреА рддреНрдпрд╛рд╡рд░ рд╡рд╛рдж рдШрд╛рд▓рдд рдирд╛рд╣реА. рдпрд╛ lab рдЪреЗ:
- SEV1 тАФ рдмрд╣реБрддреЗрдХ рдкрд╛рд▓рдХрд╛рдВрдирд╛ рдирд┐рдХрд╛рд▓ рджрд┐рд╕рдд рдирд╛рд╣реАрдд: рд▓рд╛рдЧрдгрд╛рд▒реНрдпрд╛ рд╕рдЧрд│реНрдпрд╛рдВрдирд╛ page рдХрд░рд╛, status page, рджрд░ 30 рдорд┐рдирд┐рдЯрд╛рдВрдиреА updates;
- SEV2 тАФ рдЕрдиреЗрдХрд╛рдВрд╕рд╛рдареА рдПрдХ feature рддреБрдЯрд▓реЗ рдЖрд╣реЗ: on-call рд▓рд╛ page рдХрд░рд╛, рджрд░ рддрд╛рд╕рд╛рд▓рд╛ updates;
- SEV3 тАФ рдХрд╛рдордЧрд┐рд░реА рдШрд╕рд░рд▓реА рдЖрд╣реЗ, рдХрд┐рдВрд╡рд╛ рдЫреЛрдЯреНрдпрд╛ рдЧрдЯрд╛рд╡рд░ рдкрд░рд┐рдгрд╛рдо: рдХрд╛рдорд╛рдЪреНрдпрд╛ рд╡реЗрд│реЗрдд рджреБрд░реБрд╕реНрдд рдХрд░рд╛. (рдХрд╛рд╣реА companies рдЙрд▓рдЯреНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ рдореЛрдЬрддрд╛рдд, P1тАУP5, рдХрд┐рдВрд╡рд╛ SEV0 рдЬреЛрдбрддрд╛рдд. рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рд╣реЗ рдХреА рд╕рдЧрд│реЗ рдПрдХрдЪ рддрдХреНрддрд╛ рд╡рд╛рдкрд░рддрд╛рдд.)
- рднреВрдорд┐рдХрд╛ (Incident Command System рдордзреВрди, рдЬрд╢рд╛ Google SRE рдЖрдгрд┐ PagerDuty рдЪреНрдпрд╛
incident response рдордзреНрдпреЗ рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд):
- incident commander (IC) тАФ рдиреЗрддреГрддреНрд╡ рдХрд░рддреЗ рдЖрдгрд┐ рдирд┐рд░реНрдгрдп рдШреЗрддреЗ; рд╕рдВрдкреВрд░реНрдг рдЪрд┐рддреНрд░ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рддреЗ; рдХрд╛рдо рд╡рд╛рдЯреВрди рджреЗрддреЗ; рд╕реНрд╡рддрдГ debug рдХрд░рдд рдирд╛рд╣реА;
- operations lead (ops lead) тАФ systems рдордзреНрдпреЗ рдмрджрд▓ рдХрд░рдгрд╛рд░реА рдПрдХрдореЗрд╡ рд╡реНрдпрдХреНрддреА (рдХрд┐рдВрд╡рд╛ team);
- communications lead тАФ рдкреНрд░рддрд┐рд╕рд╛рдж рджреЗрдгрд╛рд▒реНрдпрд╛рдВрдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░рдЪреНрдпрд╛ рд▓реЛрдХрд╛рдВрдирд╛ updates: status page, support, leadership тАФ рдард░рд▓реЗрд▓реНрдпрд╛ рд▓рдпреАрдд;
- scribe тАФ timeline рдареЗрд╡рддреЗ: рд╡реЗрд│рд╛, рдирд┐рд░реНрдгрдп, рдХрд╛рдп рдХрд░реВрди рдкрд╛рд╣рд┐рд▓реЗ. рд▓рд╣рд╛рди incident рдордзреНрдпреЗ рдПрдХрдЪ рд╡реНрдпрдХреНрддреА рдЕрдиреЗрдХ рднреВрдорд┐рдХрд╛ рд╕рд╛рдВрднрд╛рд│реВ рд╢рдХрддреЗ; IC рдЪреА рднреВрдорд┐рдХрд╛ рдиреЗрд╣рдореА рдирд╛рд╡рд╛рдиреЗ рдард░рд▓реЗрд▓реА рдЕрд╕рддреЗ.
- рдЖрдзреА mitigate тАФ рд╕рдордЬрдгреНрдпрд╛рдкреВрд░реНрд╡реА рд╣рд╛рдиреА рдерд╛рдВрдмрд╡рд╛: рд╢реЗрд╡рдЯрдЪрд╛ рдмрджрд▓ roll back рдХрд░рд╛, feature flag рдмрдВрдж рдХрд░рд╛, рджреБрд╕рд▒реНрдпрд╛ region рд▓рд╛ fail over рдХрд░рд╛, capacity рд╡рд╛рдврд╡рд╛, рд╡рд╛рдИрдЯ client block рдХрд░рд╛. Root cause рдирдВрддрд░ рдпреЗрддреЗ (рдзрдбрд╛ 11).
- Status page тАФ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ (рдХрд┐рдВрд╡рд╛ рдЕрдВрддрд░реНрдЧрдд) page рдЬреЗ рд╕рд╛рдВрдЧрддреЗ рдХреА users рдирд╛ рдХрд╛рдп рджрд┐рд╕рддреЗ, рдХрд╛рдп рдХреЗрд▓реЗ рдЬрд╛рдд рдЖрд╣реЗ, рдЖрдгрд┐ рдкреБрдврдЪреЗ update рдХрдзреА. рддреНрдпрд╛рдореБрд│реЗ "рдмрдВрдж рдЖрд╣реЗ рдХрд╛?" рдкреНрд░рд╢реНрдирд╛рдВрдЪрд╛ рдкреВрд░рд╣реА рдХрдореА рд╣реЛрддреЛ.
- рдШрдбреНрдпрд╛рд│реЗ тАФ timeline рд╡рд░реВрди рдореЛрдЬрд▓реЗрд▓реА:
- MTTD (mean time to detect) тАФ рд╣рд╛рдиреАрдЪреА рд╕реБрд░реБрд╡рд╛рдд тЖТ detection (page);
- MTTA (mean time to acknowledge) тАФ page тЖТ рдПрдЦрд╛рджреА рд╡реНрдпрдХреНрддреА рдореНрд╣рдгрддреЗ "рдореА рдмрдШрддреЗ";
- time to mitigate тАФ рд╕реБрд░реБрд╡рд╛рдд тЖТ users рдЪрд╛ рддреНрд░рд╛рд╕ рдерд╛рдВрдмрддреЛ;
- MTTR тАФ рд╕реБрд░реБрд╡рд╛рдд тЖТ resolved. рд╕рд╛рд╡рдз: "R" repair, recover, restore рдХрд┐рдВрд╡рд╛ resolve рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ. рддреБрдордЪреНрдпрд╛ team рд▓рд╛ рдХреЛрдгрддрд╛ рдЕрд░реНрде рдЕрднрд┐рдкреНрд░реЗрдд рдЖрд╣реЗ рддреЗ рд▓рд┐рд╣реВрди рдареЗрд╡рд╛. "Mean" = рдЕрдиреЗрдХ incidents рдЪреА рд╕рд░рд╛рд╕рд░реА; рдПрдХрд╛ incident рдордзреВрди рдкреНрд░рддреНрдпреЗрдХрд╛рдЪрд╛ рдПрдХ рдирдореБрдирд╛ рдорд┐рд│рддреЛ.
- Handover тАФ рд▓рд╛рдВрдм incidents рдордзреНрдпреЗ IC рдЖрдгрд┐ ops lead рдард░рд▓реЗрд▓реНрдпрд╛ рд╡реЗрд│рд╛рдкрддреНрд░рдХрд╛рдиреБрд╕рд╛рд░, рд▓реЗрдЦреА рд╕рд╛рд░рд╛рдВрд╢рд╛рд╕рд╣ рдмрджрд▓рддрд╛рдд.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдЧреЛрдВрдзрд│ рд╣реАрдЪ рдореВрд│ рд╕реНрдерд┐рддреА рдЕрд╕рддреЗ. рднреВрдорд┐рдХрд╛ рдирд╕рддреАрд▓ рддрд░, рдкрд╛рдЪ engineers рдПрдХрд╛рдЪ рд╡реЗрд│реА рдкрд╛рдЪ рдЧреЛрд╖реНрдЯреА рдмрджрд▓рддрд╛рдд, support рд▓рд╛ рдХреЛрдгреА рд╕рд╛рдВрдЧрдд рдирд╛рд╣реА, рдЖрдгрд┐ рдХрд╛рдп рдХрд░реВрди рдкрд╛рд╣рд┐рд▓реЗ рд╣реЗ рдорд╛рд╣реАрдд рдЕрд╕рд▓реЗрд▓реА рдПрдХрдореЗрд╡ рд╡реНрдпрдХреНрддреА рдЬреЗрд╡рд╛рдпрд▓рд╛ рдЬрд╛рддреЗ. "рдЖрдзреА mitigate" рдирд╕реЗрд▓ рддрд░, team 40 рдорд┐рдирд┐рдЯреЗ cause рд╢реЛрдзрдгреНрдпрд╛рдд рдШрд╛рд▓рд╡рддреЗ рдЖрдгрд┐ рдкрд╛рд▓рдХрд╛рдВрдирд╛ errors рджрд┐рд╕рдд рд░рд╛рд╣рддрд╛рдд тАФ рдЬреЗрд╡реНрд╣рд╛ rollback рдиреЗ рддреЗ 2 рдорд┐рдирд┐рдЯрд╛рдВрдд рд╕рдВрдкрд▓реЗ рдЕрд╕рддреЗ. рдЖрдгрд┐ users рдирд╛ mitigate рдЪреА рд╡реЗрд│ рдЬрд╛рдгрд╡рддреЗ, рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рдЪреА рд╡реЗрд│ рдирд╛рд╣реА.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
obs/reliability.py рдордзрд▓реЗ incident_metrics(tl) minute stamps рдШреЗрддреЗ
тАФ started, detected, acknowledged, mitigated, resolved тАФ рдЖрдгрд┐
time_to_detect (detected тИТ started), time_to_acknowledge (acknowledged тИТ detected),
time_to_mitigate рдЖрдгрд┐ time_to_resolve (рджреЛрдиреНрд╣реА started рдкрд╛рд╕реВрди), рдЖрдгрд┐ users_hurt_minutes
(started тЖТ mitigated) рджреЗрддреЗ. SEVERITY рдордзреНрдпреЗ рддреАрди levels рдЖрд╣реЗрдд.
obs/demo.py рдордзрд▓реЗ incident() рдирд┐рдХрд╛рд▓рд╛рдЪреНрдпрд╛ рджрд┐рд╡рд╕рд╛рдЪреА рдЦрд░реА timeline рд╡рд╛рдкрд░рддреЗ: 400 рд▓рд╛ errors,
409 рд▓рд╛ page (рдзрдбрд╛ 08), 411 рд▓рд╛ acknowledged, 432 рд▓рд╛ rollback, 470 рд▓рд╛ resolved.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
рдШрдбреНрдпрд╛рд│реЗ рд╣рд▓рд╡рд╛. Bad deploy рдордзреНрдпреЗ рдорд┐рдирд┐рдЯрд╛рд▓рд╛ рд╕реБрдорд╛рд░реЗ 60 requests fail рдЭрд╛рд▓реНрдпрд╛ (1,000 рдЪреЗ 6%), рдореНрд╣рдгреВрди рд╣рд╛рдиреАрдЪреА рдорд┐рдирд┐рдЯреЗ ├Ч 60 тЙИ fail рдЭрд╛рд▓реЗрд▓реЗ рдирд┐рдХрд╛рд▓ views:
python3 obs/demo.py incident
python3 - <<'EOF'
import sys; sys.path.insert(0, "obs"); from reliability import incident_metrics
base = dict(started=400, detected=409, acknowledged=411, mitigated=432, resolved=470)
for name, change in (("today", {}), ("page after 3 min", dict(detected=403, acknowledged=405, mitigated=426)),
("auto-rollback at 404", dict(detected=403, acknowledged=405, mitigated=404)),
("found by parents on social media", dict(detected=425, acknowledged=427, mitigated=448, resolved=486))):
m = incident_metrics({**base, **change})
print(f"{name:<34} detect {m['time_to_detect']:>2} ┬╖ ack {m['time_to_acknowledge']} ┬╖ mitigate {m['time_to_mitigate']:>2} ┬╖ resolve {m['time_to_resolve']:>2} ┬╖ failed views тЙИ {m['users_hurt_minutes'] * 60:,}")
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
incident рд╣реЗ print рдХрд░рддреЗ:
тФАтФА roles: incident commander (Dipika) ┬╖ ops lead (Katrina) ┬╖ communications (Aishwarya) ┬╖ scribe
SEV1: most parents cannot see results тАФ page everyone, status page, updates every 30 min
SEV2: a feature is broken for many тАФ page on-call, updates every hour
SEV3: degraded or a small group affected тАФ fix in working hours
тФАтФА the timeline (minutes): {'started': 400, 'detected': 409, 'acknowledged': 411, 'mitigated': 432, 'resolved': 470}
time_to_detect 9 min
time_to_acknowledge 2 min
time_to_mitigate 32 min
time_to_resolve 70 min
users_hurt_minutes 32 min
first mitigate (roll back, switch off, add capacity), THEN find the cause
рддреБрдордЪрд╛ snippet рд╣реЗ print рдХрд░рддреЛ:
today detect 9 ┬╖ ack 2 ┬╖ mitigate 32 ┬╖ resolve 70 ┬╖ failed views тЙИ 1,920
page after 3 min detect 3 ┬╖ ack 2 ┬╖ mitigate 26 ┬╖ resolve 70 ┬╖ failed views тЙИ 1,560
auto-rollback at 404 detect 3 ┬╖ ack 2 ┬╖ mitigate 4 ┬╖ resolve 70 ┬╖ failed views тЙИ 240
found by parents on social media detect 25 ┬╖ ack 2 ┬╖ mitigate 48 ┬╖ resolve 86 ┬╖ failed views тЙИ 2,880
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдкрд╛рд▓рдХрд╛рдВрдирд╛ mitigate рдЪреЗ рдШрдбреНрдпрд╛рд│ рдЬрд╛рдгрд╡рд▓реЗ, resolve рдЪреЗ рдирд╛рд╣реА: рдкрд╣рд┐рд▓реНрдпрд╛ рддреАрди рдУрд│реАрдВрдордзреНрдпреЗ resolve рдЪреА рд╡реЗрд│ 70 рдорд┐рдирд┐рдЯреЗ рд╣реЛрддреА, рдкрдг fail рдЭрд╛рд▓реЗрд▓реЗ views 1,920 рд╡рд░реВрди 240 рд╡рд░ рдЖрд▓реЗ. рдЬрд▓рдж detection рдиреЗ 6 рдорд┐рдирд┐рдЯреЗ (360 views) рд╡рд╛рдЪрд╡рд▓реА; burn-rate signal рд╡рд░рдЪреНрдпрд╛ automatic rollback рдиреЗ 28 рдорд┐рдирд┐рдЯреЗ (1,680 views) рд╡рд╛рдЪрд╡рд▓реА. Social media рд╡рд░ рдкрд╛рд▓рдХрд╛рдВрдХрдбреВрди рдХрд│рдгреЗ тАФ рдХреЛрдгрддрд╛рд╣реА alert рдирд╛рд╣реА тАФ рдпрд╛рдЪреА рдХрд┐рдВрдордд 16 рдЬрд╛рджрд╛ рдорд┐рдирд┐рдЯреЗ рдЖрдгрд┐ 960 рдЬрд╛рд╕реНрдд fail рдЭрд╛рд▓реЗрд▓реЗ views. рд╕рд░реНрд╡реЛрддреНрддрдо incident рддреЛ, рдЬреЛ рд╡реНрдпрдХреНрддреА рдЬрд╛рдЧреА рд╣реЛрдгреНрдпрд╛рдкреВрд░реНрд╡реАрдЪ machine mitigate рдХрд░рддреЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- rollback рдХрд░реВрди рдкрд╛рд╣рдгреНрдпрд╛рдкреВрд░реНрд╡реА 30 рдорд┐рдирд┐рдЯреЗ debugging рдХрд░рдгреЗ
- рдХреЛрдгрд╛рд▓рд╛рд╣реА incident commander рдореНрд╣рдгреВрди рдирд╛рд╡ рди рджреЗрдгреЗ тАФ рдХрд┐рдВрд╡рд╛ IC рдиреЗрдЪ commands type рдХрд░рдгреЗ
- рдЕрдиреЗрдХ рд▓реЛрдХ рдПрдХрд╛рдЪ рд╡реЗрд│реА production рдмрджрд▓рдд рдЖрд╣реЗрдд, рдЖрдгрд┐ рдХреЛрдгреАрдЪ рддреЗ рд▓рд┐рд╣реВрди рдареЗрд╡рдд рдирд╛рд╣реА
- status page update рдирд╛рд╣реА, рддреНрдпрд╛рдореБрд│реЗ support рдЖрдгрд┐ рдкрд╛рд▓рдХрд╛рдВрдирд╛ рдПрдХ рддрд╛рд╕ рдХрд╛рд╣реАрдЪ рдХрд│рдд рдирд╛рд╣реА
- incident рдЙрд╢рд┐рд░рд╛ declare рдХрд░рдгреЗ, "рдХрджрд╛рдЪрд┐рдд рдХрд╛рд╣реАрдЪ рдирд╕реЗрд▓ рдореНрд╣рдгреВрди"
- SLI рдЦрд░реЛрдЦрд░ рдкрд░рдд рдЖрд▓рд╛ рдЖрд╣реЗ рдХрд╛ рддреЗ рддрдкрд╛рд╕рдгреНрдпрд╛рдкреВрд░реНрд╡реА, page рдерд╛рдВрдмрддрд╛рдЪ resolved рдореНрд╣рдгрдгреЗ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рдЦрд▒реНрдпрд╛ account рд╡рд░ тАФ Kubernetes рд╡рд░ bad deploy рд╕рд╛рдареА рд╕рдЧрд│реНрдпрд╛рдд рдЬрд▓рдж mitigation:
kubectl rollout history deployment/results-api
kubectl rollout undo deployment/results-api # back to the previous version
kubectl rollout status deployment/results-api --timeout=5m
PagerDuty Events API v2 рдордзреВрди рдХреЛрдгрддреНрдпрд╛рд╣реА script рд╡рд░реВрди page рдХрд░рд╛ (routing key рдПрдХрд╛ service integration рдордзреВрди рдорд┐рд│рддреЗ):
curl -s -X POST https://events.pagerduty.com/v2/enqueue -H 'Content-Type: application/json' -d '{
"routing_key": "<integration key>",
"event_action": "trigger",
"dedup_key": "results-api-burn-rate",
"payload": {"summary": "results-api fast error-budget burn (14.4x)", "source": "prometheus", "severity": "critical"}
}'
Atlassian Statuspage page рд╡рд░ incident рдЙрдШрдбрд╛:
curl -s -X POST "https://api.statuspage.io/v1/pages/<page id>/incidents" \
-H "Authorization: OAuth <api key>" -H 'Content-Type: application/json' -d '{
"incident": {"name": "Results page errors", "status": "investigating",
"body": "Some parents see an error on the results page. We are rolling back a change. Next update in 30 minutes."}
}'
PagerDuty, incident.io, FireHydrant, Rootly рдЖрдгрд┐ Jira Service Management рд╕рд╛рд░рдЦреА incident tools рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА chat channel рдЙрдШрдбрддрд╛рдд, рднреВрдорд┐рдХрд╛ рд╡рд╛рдЯрддрд╛рдд рдЖрдгрд┐ timeline рдареЗрд╡рддрд╛рдд. Incident channel рд╕рд╛рдареА рдкрд╣рд┐рд▓реНрдпрд╛ message рдЪрд╛ рдирдореБрдирд╛:
ЁЯФ┤ SEV1 declared 11:49 ┬╖ IC: Dipika ┬╖ Ops: Katrina ┬╖ Comms: Aishwarya ┬╖ Scribe: on-call #2
Impact: ~6% of results views fail (504) since 11:40.
Current action: rolling back results-api v42 тЖТ v41 (Katrina).
Next update: 12:19, or sooner if something changes.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рд╕рд░рд╛рд╡ рдХрд░рд╛. рджрд░ рддрд┐рдорд╛рд╣реАрдд рдПрдХ game day рдШреНрдпрд╛ тАФ staging рдордзреНрдпреЗ рдореБрджреНрджрд╛рдо рдХрд╛рд╣реАрддрд░реА рдореЛрдбрд╛, on-call рд▓рд╛ page рдХрд░рд╛, рднреВрдорд┐рдХрд╛ рдкрд╛рд░ рдкрд╛рдбрд╛ тАФ рдореНрд╣рдгрдЬреЗ рдкрд╣рд┐рд▓реНрдпрд╛ рдЦрд▒реНрдпрд╛ SEV1 рдордзреНрдпреЗ рдХреЛрдгреАрддрд░реА рдкрд╣рд┐рд▓реНрдпрд╛рдВрджрд╛рдЪ IC рдЪреА рднреВрдорд┐рдХрд╛ рд╕рд╛рдВрднрд╛рд│рдд рдирд╕реЗрд▓.
тПня╕П рдкреБрдвреЗ
Rollback рдиреЗ рд╣рд╛рдиреА рдерд╛рдВрдмрд╡рд▓реА. рдкрдг v42 рдХрд╛ рдореЛрдбрд▓реЗ тАФ рдЖрдгрд┐ рдкрд╛рд▓рдХрд╛рдВрдЪреНрдпрд╛ рдЖрдзреА рдХрд╢рд╛рдиреЗрдЪ рддреЗ рдХрд╛ рдкрдХрдбрд▓реЗ рдирд╛рд╣реА? Root-cause analysis.
git checkout lesson-11-root-cause