ЁЯй║ рдзрдбрд╛ 01 тАФ Observability рдХрд╛: рд╢рд╛рд│реЗрдЪрд╛ рдЖрд░реЛрдЧреНрдп рдХрдХреНрд╖
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 01 ┬╖ рдкреБрдвреЗ: lesson-02-logs
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рд╣рд╛ рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕ рдПрдХрд╛рдЪ рдкреНрд░рд╢реНрдирд╛рдЪреЗ рдЙрддреНрддрд░ рджреЗрддреЛ: "рдХрд╛рд╣реАрддрд░реА рдЪреБрдХрд▓реЗ рдЖрд╣реЗ тАФ рдХрд╛рдп, рдХреБрдареЗ, рдЖрдгрд┐ рдХрд╛?" рдЖрдЬ рдирд┐рдХрд╛рд▓рд╛рдЪрд╛ рджрд┐рд╡рд╕ рдЖрд╣реЗ. 11:40 рд▓рд╛ рдкрд╛рд▓рдХ рд╕рд╛рдВрдЧрддрд╛рдд рдХреА results page рддреБрдЯрд▓реЗ рдЖрд╣реЗ. System рдЖрдзреАрдЪ рдЬреЗ рд╕рд╛рдВрдЧрддреЗ рддреНрдпрд╛рд╡рд░реВрди team рдХрд╛ рддреЗ рд╕рд╛рдВрдЧреВ рд╢рдХреЗрд▓ рдХрд╛ тАФ рдирд╡рд╛ code рди рдЬреЛрдбрддрд╛ рдЖрдгрд┐ рддреЗ рдкреБрдиреНрд╣рд╛ рдмрд┐рдШрдбрдгреНрдпрд╛рдЪреА рд╡рд╛рдЯ рди рдкрд╛рд╣рддрд╛? рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕рдордзреНрдпреЗ рддреБрдореНрд╣реА рд╡рд╛рдкрд░рдгрд╛рд░ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдЦрд▒реНрдпрд╛ files:
- obs/signals.py тАФ рдЖрд░реЛрдЧреНрдп рдХрдХреНрд╖рд╛рдЪреА рдЙрдкрдХрд░рдгреЗ: logs, metrics, traces рдЖрдгрд┐ OpenTelemetry рд╕рд╛рд░рдЦрд╛ Collector, рд╢реБрджреНрдз Python рдордзреАрд▓ рдЫреЛрдЯреА рдкреНрд░рд╛рдорд╛рдгрд┐рдХ models рдореНрд╣рдгреВрди (129 рдУрд│реА, рдПрдХрд╣реА dependency рдирд╛рд╣реА)
- obs/reliability.py тАФ рдЖрд░реЛрдЧреНрдп рдХрдХреНрд╖рд╛рдЪреА рдирд┐рдпрдордкреБрд╕реНрддрд┐рдХрд╛: alerts, burn rates, error budgets, incident рдЪреА рдШрдбреНрдпрд╛рд│реЗ, рд╕рдВрд╢рдпрд┐рдд рдмрджрд▓, рдкрд╛рдЪ рдХрд╛ рдЖрдгрд┐ postmortem (69 рдУрд│реА)
- obs/demo.py тАФ рдирд┐рдХрд╛рд▓рд╛рдЪрд╛ рдПрдХ рджрд┐рд╡рд╕ рдорд┐рдирд┐рдЯрд╛-рдорд┐рдирд┐рдЯрд╛рдиреЗ рдкреБрдиреНрд╣рд╛ рдЪрд╛рд▓рд╡рд▓реЗрд▓рд╛, рдкреНрд░рддреНрдпреЗрдХ рдзрдбреНрдпрд╛рд╕рд╛рдареА рдПрдХ section (
python3 obs/demo.py <section>; sections:why logs metrics percentiles tracing otel prometheus alerting slo incident rootcause postmortem) - obs/test_obs.py тАФ рдЖрд░реЛрдЧреНрдп рдХрдХреНрд╖рд╛рдЪреНрдпрд╛ рдирд┐рдпрдорд╛рдВрд╡рд░рдЪреНрдпрд╛ 12 рддрдкрд╛рд╕рдгреНрдпрд╛
- demo-output.txt тАФ рдирд┐рд░реЛрдЧреА run рдХрд╛рдп print рдХрд░рддреЛ
ЁЯОТ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА: рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд Python 3 рд▓рд╛рдЧрддреЗ, рдмрд╛рдХреА рдХрд╛рд╣реА рдирд╛рд╣реА тАФ cloud account рдирд╛рд╣реА,
pip installрдирд╛рд╣реА. рдпрд╛ lab рдордзреНрдпреЗ рдирд┐рдХрд╛рд▓рд╛рдЪреНрдпрд╛ 8 рддрд╛рд╕рд╛рдВрдЪреНрдпрд╛ рдПрдХрд╛ рджрд┐рд╡рд╕рд╛рдЪреА рд╢рд┐рдХрд╡рдгреНрдпрд╛рд╕рд╛рдареАрдЪреА models рдЖрд╣реЗрдд (рдорд┐рдирд┐рдЯрд╛рд▓рд╛ 1,000 requests, рдПрдХ slow leak, рдПрдХ рд╡рд╛рдИрдЯ deploy). рдЦрд░реА tools рдореНрд╣рдгрдЬреЗ Prometheus, Grafana, OpenTelemetry, CloudWatch рдЖрдгрд┐ Datadog тАФ рдХрд▓реНрдкрдирд╛ рдЖрдгрд┐ рдЧрдгрд┐рдд рддреЗрдЪ рдЖрд╣реЗ. On a real account рдЕрд╕реЗ рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд commands рдЖрдгрд┐ files рд╕рд╛рдареА рддреА tools install рдЕрд╕рд╛рд╡реА рд▓рд╛рдЧрддрд╛рдд, рдЖрдгрд┐ рддреНрдпрд╛рддрд▓реНрдпрд╛ рдХрд╛рд╣реАрдВрдирд╛ рдкреИрд╕реЗ рд▓рд╛рдЧрддрд╛рдд.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рд│реЗрдд рдПрдХ рдЖрд░реЛрдЧреНрдп рдХрдХреНрд╖ ЁЯй║ рдЕрд╕рддреЛ. рд╢рд╛рд│реЗрдЪреА рдкрд░рд┐рдЪрд╛рд░рд┐рдХрд╛ рдХрддрд░рд┐рдирд╛ рддрд┐рдереЗ рдХрд╛рдо рдХрд░рддреЗ.
рдПрдЦрд╛рджреНрдпрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рд▓рд╛ рдмрд░реЗ рд╡рд╛рдЯрдд рдирд╕реЗрд▓, рддреЗрд╡реНрд╣рд╛ рдХрддрд░рд┐рдирд╛ рдЕрдВрджрд╛рдЬ рд▓рд╛рд╡рдд рдирд╛рд╣реА. рддрд┐рдЪреНрдпрд╛рдХрдбреЗ рддреАрди рд╕рд╛рдзрдиреЗ рдЖрд╣реЗрдд:
- рдПрдХ рджреИрдирдВрджрд┐рдиреА ЁЯУУ тАФ рдкреНрд░рддреНрдпреЗрдХ рднреЗрдЯреАрд╕рд╛рдареА рдПрдХ рдУрд│: рд╡реЗрд│, рд╡рд┐рджреНрдпрд╛рд░реНрдереА, рдХрд╛рдп рдШрдбрд▓реЗ;
- рдПрдХ рддрдкрд╛рд╕рдгреА рддрдХреНрддрд╛ ЁЯУК тАФ рд╡реЗрд│реЗрдиреБрд╕рд╛рд░ рдЖрдХрдбреЗ: рджрд░ рддрд╛рд╕рд╛рд▓рд╛ рддрд╛рдк, рдЖрдЬ рдХрд┐рддреА рд╡рд┐рджреНрдпрд╛рд░реНрдереА рдЖрд▓реЗ;
- рдПрдХ рдорд╛рд░реНрдЧ рдХрд╛рд░реНрдб ЁЯЧ║я╕П тАФ рд╡рд┐рджреНрдпрд╛рд░реНрдереА рдПрдХрд╛ рдЦреЛрд▓реАрддреВрди рджреБрд╕рд▒реНрдпрд╛ рдЦреЛрд▓реАрдд рдиреЗрддреЛ рддреЗ рдХрд╛рд░реНрдб; рдкреНрд░рддреНрдпреЗрдХ рдЦреЛрд▓реА рдЖрдд рдпреЗрдгреНрдпрд╛рдЪреА рдЖрдгрд┐ рдмрд╛рд╣реЗрд░ рдЬрд╛рдгреНрдпрд╛рдЪреА рд╡реЗрд│ рддреНрдпрд╛рд╡рд░ рд╢рд┐рдХреНрдХрд╛ рдорд╛рд░реВрди рдиреЛрдВрджрд╡рддреЗ.
рдЖрддрд╛ рдЬреБрдиреА рдкрджреНрдзрдд. рдореБрдЦреНрдпрд╛рдзреНрдпрд╛рдкрд┐рдХрд╛ рджреАрдкрд┐рдХрд╛рдиреЗ рдПрдХрджрд╛ boiler рд╡рд░ рдПрдХ рдШрдВрдЯрд╛ рд▓рд╛рд╡рд▓реА. "Boiler рдЧрд░рдо рдЭрд╛рд▓рд╛ рдХреА рдШрдВрдЯрд╛ рд╡рд╛рдЬрд╡." рдШрдВрдЯрд╛ рд╕рдХрд╛рд│рднрд░ рд╡рд╛рдЬрдд рд░рд╛рд╣рд┐рд▓реА. рдХреЛрдгреАрдЪ рдЖрдЬрд╛рд░реА рдирд╡реНрд╣рддреЗ. рдЖрдгрд┐ рдЬреНрдпрд╛ рджрд┐рд╡рд╢реА рдПрдХ рд╡рд┐рджреНрдпрд╛рд░реНрдереА рдЦрд░реЛрдЦрд░ рдЖрдЬрд╛рд░реА рд╣реЛрддрд╛, рддреНрдпрд╛ рджрд┐рд╡рд╢реА рдШрдВрдЯрд╛ рд╢рд╛рдВрдд рд╣реЛрддреА тАФ boiler рдареАрдХ рд╣реЛрддрд╛.
рд╣рд╛рдЪ рдлрд░рдХ рдЖрд╣реЗ. Monitoring рдореНрд╣рдгрдЬреЗ boiler рд╡рд░рдЪреА рдШрдВрдЯрд╛: рддреБрдореНрд╣реА рдЖрдзреАрдЪ рдЕрдВрджрд╛рдЬ рдХреЗрд▓реЗрд▓реА рдПрдХрдЪ рдЧреЛрд╖реНрдЯ рддреА рдкрд╛рд╣рддреЗ. Observability рдореНрд╣рдгрдЬреЗ рдЖрд░реЛрдЧреНрдп рдХрдХреНрд╖: рджреИрдирдВрджрд┐рдиреА, рддрдХреНрддрд╛ рдЖрдгрд┐ рдорд╛рд░реНрдЧ рдХрд╛рд░реНрдбреЗ рдорд┐рд│реВрди рдХрддрд░рд┐рдирд╛рд▓рд╛ рдирд╡реЗ рдкреНрд░рд╢реНрди рд╕реЛрдбрд╡реВ рджреЗрддрд╛рдд тАФ "рдЖрдЬ 3A рд╡рд░реНрдЧ рдХрд╛ рдЖрдЬрд╛рд░реА рдЖрд╣реЗ?" тАФ рдЬреНрдпрд╛рдВрдЪрд╛ рдХреЛрдгреАрдЪ рдЖрдзреА рд╡рд┐рдЪрд╛рд░ рдХреЗрд▓рд╛ рдирд╡реНрд╣рддрд╛.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
q["тЭУ 11:40 тАФ 'the results page is broken'"]
subgraph room["ЁЯй║ the health room"]
m["ЁЯУК metrics<br/>THAT something is wrong<br/>errors 0.1% тЖТ 6%"]
t["ЁЯЧ║я╕П traces<br/>WHERE the time went<br/>grade service: 865 of 1040 ms"]
l["ЁЯУУ logs<br/>WHY, in detail<br/>'grade service timeout'"]
end
cpu["ЁЯФФ old bell: CPU > 80%<br/>64 noisy minutes"]
q --> m --> t --> l
q -.->|"quiet or wrong"| cpu
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/observability/lesson-diagrams.html#l01
тЭУ рдХрд╛рдп
- Monitoring тАФ рддреБрдореНрд╣реА рдЖрдзреАрдЪ рдирд┐рд╡рдбрд▓реЗрд▓реЗ signals рдкрд╛рд╣рдгреЗ (CPU, disk, 5xx count) рдЖрдгрд┐ рдЖрдзреАрдЪ рдирд┐рд╡рдбрд▓реЗрд▓реНрдпрд╛ рдорд░реНрдпрд╛рджрд╛рдВрд╡рд░ alert рдХрд░рдгреЗ. рдЖрдзреА рдУрд│рдЦрддрд╛ рдпреЗрдгрд╛рд▒реНрдпрд╛ failures рд╕рд╛рдареА рдЙрдкрдпреЛрдЧреА.
- Observability тАФ system рдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рдпреЗрдгрд╛рд▒реНрдпрд╛ рдорд╛рд╣рд┐рддреАрд╡рд░реВрди рддреНрдпрд╛рдЪреЗ рдЖрддрд▓реЗ рдХрд┐рддреА рдЪрд╛рдВрдЧрд▓реЗ рд╕рдордЬрддреЗ рддреЗ. System рддреЗрд╡реНрд╣рд╛ observable рдЕрд╕рддреЗ рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣реА рдПрдЦрд╛рджреНрдпрд╛ рдирд╡реНрдпрд╛ рдкреНрд░рд╢реНрдирд╛рдЪреЗ рдЙрддреНрддрд░ ("рдлрдХреНрдд 3A рд╡рд░реНрдЧрдЪ рдХрд╛? рдлрдХреНрдд 11:30 рдкрд╛рд╕реВрдирдЪ рдХрд╛?") рддреЗ рдЖрдзреАрдЪ рджреЗрдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ data рдордзреВрди, рдирд╡рд╛ code ship рди рдХрд░рддрд╛ рджреЗрдК рд╢рдХрддрд╛.
- Telemetry тАФ system рд╕реНрд╡рддрдГрдмрджреНрджрд▓ рдЬреЛ data рдмрд╛рд╣реЗрд░ рдЯрд╛рдХрддреЗ рддреЛ. рддреНрдпрд╛рдЪреЗ рддреАрди рдореБрдЦреНрдп рдкреНрд░рдХрд╛рд░, рдЬреНрдпрд╛рдВрдирд╛ рдЕрдиреЗрдХрджрд╛
рддреАрди рдЦрд╛рдВрдм (three pillars) рдореНрд╣рдгрддрд╛рдд:
- Metrics (рдзрдбрд╛ 03) тАФ рд╡реЗрд│реЗрдиреБрд╕рд╛рд░ рдЖрдХрдбреЗ: рджрд░ рд╕реЗрдХрдВрджрд╛рд▓рд╛ requests, error ratio, latency buckets. рдареЗрд╡рд╛рдпрд▓рд╛ рд╕реНрд╡рд╕реНрдд рдЖрдгрд┐ query рд╕рд╛рдареА рдЬрд▓рдж. рддреЗ рд╕рд╛рдВрдЧрддрд╛рдд рдХреА рдХрд╛рд╣реАрддрд░реА рдЪреБрдХрд▓реЗ рдЖрд╣реЗ.
- Traces (рдзрдбрд╛ 05) тАФ рдЕрдиреЗрдХ services рдордзреВрди рдЬрд╛рдгрд╛рд▒реНрдпрд╛ рдПрдХрд╛ request рдЪрд╛ рдорд╛рд░реНрдЧ, рдкреНрд░рддреНрдпреЗрдХ рдард┐рдХрд╛рдгреА рд▓рд╛рдЧрд▓реЗрд▓реНрдпрд╛ рд╡реЗрд│реЗрд╕рд╣. рддреЗ рд╕рд╛рдВрдЧрддрд╛рдд рдХреБрдареЗ.
- Logs (рдзрдбрд╛ 02) тАФ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдиреЗрд╕рд╛рдареА рдПрдХ рдиреЛрдВрдж, рддрдкрд╢реАрд▓рд╛рд╕рд╣. рддреЗ рд╕рд╛рдВрдЧрддрд╛рдд рдХрд╛.
- Signal рд╡рд┐рд░реБрджреНрдз noise тАФ signal рддреБрдореНрд╣рд╛рд▓рд╛ users рдирд╛ рдЬрд╛рдгрд╡рдгрд╛рд░реА рдЧреЛрд╖реНрдЯ рд╕рд╛рдВрдЧрддреЛ. Noise рдореНрд╣рдгрдЬреЗ рдЕрд╕рд╛ alarm рдЬреЛ users рдареАрдХ рдЕрд╕рддрд╛рдирд╛ рд╡рд╛рдЬрддреЛ (рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛рдВрдирд╛ рддреНрд░рд╛рд╕ рд╣реЛрдд рдЕрд╕рддрд╛рдирд╛ рд╢рд╛рдВрдд рд░рд╛рд╣рддреЛ).
- рдПрдХрд╛ рдУрд│реАрдд рдХреЛрд░реНрд╕: рдЪрд╛рдВрдЧрд▓реЗ signals рдмрд╛рд╣реЗрд░ рдЯрд╛рдХрд╛ (рдзрдбреЗ 02тАУ07) тЖТ users рдирд╛ рддреНрд░рд╛рд╕ рд╣реЛрдд рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛рдЪ alert рдХрд░рд╛ (08) тЖТ "рдкреБрд░реЗрд╕реЗ рдЪрд╛рдВрдЧрд▓реЗ" рдореНрд╣рдгрдЬреЗ рдХрд╛рдп рдпрд╛рд╡рд░ рдПрдХрдордд рдХрд░рд╛ (09) тЖТ рдЕрдЧреНрдирд┐рд╢рдорди рд╕рд░рд╛рд╡ рд╣рд╛рддрд╛рд│рд╛ (10) тЖТ рдЦрд░реЗ рдХрд╛рд░рдг рд╢реЛрдзрд╛ (11) тЖТ рддреЗ рд▓рд┐рд╣реВрди рдХрд╛рдврд╛ рдЖрдгрд┐ system рджреБрд░реБрд╕реНрдд рдХрд░рд╛ (12).
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдЖрдзреБрдирд┐рдХ systems рдирд╡реНрдпрд╛ рдкрджреНрдзрддреАрдВрдиреА рдмрд┐рдШрдбрддрд╛рдд. рдирд┐рдХрд╛рд▓рд╛рдЪреНрдпрд╛ рджрд┐рд╡рд╢реА рдПрдХрдЪ page load рдПрдХ gateway, рдПрдХ auth service, results API, рдПрдХ database рдЖрдгрд┐ рдПрдХ grade service рдпрд╛рдВрдирд╛ рд╕реНрдкрд░реНрд╢ рдХрд░рддреЛ. рдорд╛рдЧрдЪреНрдпрд╛ рд╡рд░реНрд╖реАрдЪреНрдпрд╛ outage рд╕рд╛рдареА рдмрдирд╡рд▓реЗрд▓рд╛ dashboard рдпрд╛ рд╡рд░реНрд╖реАрдЪрд╛ outage рджрд╛рдЦрд╡рдд рдирд╛рд╣реА. рдлрдХреНрдд monitoring рдЕрд╕реЗрд▓ рддрд░ team outage рдирдВрддрд░ рдирд╡рд╛ graph рдЬреЛрдбрддреЗ рдЖрдгрд┐ рдкреБрдврдЪреНрдпрд╛ outage рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рддреЗ. Observability рдЕрд╕реЗрд▓ рддрд░ data рдЖрдзреАрдЪ рддрд┐рдереЗ рдЕрд╕рддреЛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рд╡рд┐рдЪрд╛рд░рд╛рдпрдЪреЗ рдЕрд╕рддреЗ.
рдЖрдгрд┐ рдЬреБрдиреЗ signals рдЕрдиреЗрдХрджрд╛ noise рдЕрд╕рддрд╛рдд. Lab рдордзреНрдпреЗ рджрд┐рд╡рд╕рднрд░рд╛рдд CPU 64 рдорд┐рдирд┐рдЯреЗ 80% рдЪреНрдпрд╛ рдкрд╛рд░ рдЬрд╛рддреЛ. рддреНрдпрд╛рддрд▓реЗ рдПрдХрд╣реА рдорд┐рдирд┐рдЯ рдкрд╛рд▓рдХрд╛рдВрдирд╛ рдЬрд╛рдгрд╡рдгрд╛рд▒реНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдмрджреНрджрд▓ рдирд╛рд╣реА.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
demo.py рдирд┐рдХрд╛рд▓рд╛рдЪрд╛ 480 рдорд┐рдирд┐рдЯрд╛рдВрдЪрд╛ рдПрдХ рджрд┐рд╡рд╕ рдмрдирд╡рддреЛ: REQ (рдорд┐рдирд┐рдЯрд╛рд▓рд╛ 1,000 requests), ERR
(рдорд┐рдирд┐рдЯрд╛рд▓рд╛ errors: рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ 0.1%, рдорд┐рдирд┐рдЯреЗ 100тАУ379 рдордзреАрд▓ slow leak рджрд░рдореНрдпрд╛рди 0.9%, рдорд┐рдирд┐рдЯреЗ 400тАУ431 рдордзреАрд▓
рд╡рд╛рдИрдЯ deploy рдирдВрддрд░ 6%) рдЖрдгрд┐ CPU (рд╡реНрдпрд╕реНрдд, рдкрдг errors рд╢реА рд╕рдВрдмрдВрдз рдирд╕рд▓реЗрд▓рд╛).
obs/reliability.py рдордзреАрд▓ threshold_alerts(cpu_series, limit=80)
CPU рдорд░реНрдпрд╛рджреЗрдЪреНрдпрд╛ рд╡рд░ рдЕрд╕рд▓реЗрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдорд┐рдирд┐рдЯ рдкрд░рдд рдХрд░рддреЗ тАФ рдореНрд╣рдгрдЬреЗрдЪ "boiler рд╡рд░рдЪреА рдШрдВрдЯрд╛". why()
рдЧреЛрд╖реНрдЯ print рдХрд░рддреЗ рдЖрдгрд┐ рддреА рдорд┐рдирд┐рдЯреЗ рдореЛрдЬрддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 obs/demo.py why
python3 - <<'EOF'
import sys; sys.path.insert(0, "obs"); from demo import CPU, ERR, REQ; from reliability import threshold_alerts
for limit in (70, 80, 90):
print(f"alert when CPU > {limit}% тЖТ {len(threshold_alerts(CPU, limit)):>3} minutes of alerts")
bad = [m for m in range(len(ERR)) if ERR[m] / REQ[m] > 0.05]
cpu = threshold_alerts(CPU)
print(f"minutes when parents saw >5% errors: {len(bad)} ┬╖ CPU alerts in those minutes: {len(set(bad) & set(cpu))}")
print(f"CPU during the bad deploy: min {min(CPU[400:432])}% ┬╖ max {max(CPU[400:432])}% ┬╖ on a calm minute (10): {CPU[10]}%")
EOF
python3 obs/test_obs.py
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
why рд╣реЗ print рдХрд░рддреЗ:
тФАтФА results day, 11:40: 'parents say the results page is broken' тАФ can we answer WHY without adding code?
monitoring: dashboards for failures you predicted (CPU, disk, 5xx)
observability: ask NEW questions of the system from what it already emits тАФ logs, metrics, traces
this morning: CPU crossed 80% in 64 minutes тАФ but CPU is not what parents feel
the three signals: metrics say THAT something is wrong ┬╖ traces say WHERE ┬╖ logs say WHY
рддреБрдордЪрд╛ snippet рд╣реЗ print рдХрд░рддреЛ:
alert when CPU > 70% тЖТ 224 minutes of alerts
alert when CPU > 80% тЖТ 64 minutes of alerts
alert when CPU > 90% тЖТ 0 minutes of alerts
minutes when parents saw >5% errors: 32 ┬╖ CPU alerts in those minutes: 4
CPU during the bad deploy: min 55% ┬╖ max 84% ┬╖ on a calm minute (10): 65%
Tests рд╢реЗрд╡рдЯреА 12/12 passed рджрд╛рдЦрд╡рддрд╛рдд.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
CPU alarm рдПрдХрддрд░ рдЦреВрдк рдореЛрдареНрдпрд╛рдиреЗ рд╡рд╛рдЬрддреЛ (70% рд▓рд╛ 224 рдорд┐рдирд┐рдЯреЗ) рдХрд┐рдВрд╡рд╛ рдмрд╣рд┐рд░рд╛ рдЕрд╕рддреЛ (90% рд▓рд╛ 0 рдорд┐рдирд┐рдЯреЗ). 80% рд▓рд╛, рдкрд╛рд▓рдХрд╛рдВрдирд╛ рдЦрд░реЛрдЦрд░ errors рджрд┐рд╕рд▓реЗ рддреНрдпрд╛ 32 рдорд┐рдирд┐рдЯрд╛рдВрдкреИрдХреА рдлрдХреНрдд 4 рдорд┐рдирд┐рдЯрд╛рдВрдд рддреЛ рд╡рд╛рдЬрд▓рд╛ тАФ рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ errors рджрд┐рд╕рдд рдирд╡реНрд╣рддреЗ рдЕрд╢рд╛ 60 рдорд┐рдирд┐рдЯрд╛рдВрдд рд╡рд╛рдЬрд▓рд╛. рд╡рд╛рдИрдЯ deploy рджрд░рдореНрдпрд╛рдирдЪрд╛ CPU рдЗрддрд░ рдХреЛрдгрддреНрдпрд╛рд╣реА рддрд╛рд╕рд╛рд╕рд╛рд░рдЦрд╛рдЪ рджрд┐рд╕рдд рд╣реЛрддрд╛. рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ signal рдореНрд╣рдгрдЬреЗ рдЬреЛ users рдирд╛ рдЬрд╛рдгрд╡рддреЛ: errors рдЖрдгрд┐ рд╣рд│реВрдкрдгрд╛. рдЙрд░рд▓реЗрд▓рд╛ рдХреЛрд░реНрд╕ рддреЛ signal рдЯрдкреНрдкреНрдпрд╛рдЯрдкреНрдкреНрдпрд╛рдиреЗ рддрдпрд╛рд░ рдХрд░рддреЛ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- "рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдХреЛрдгрддреНрдпрд╛ рдкреНрд░рд╢реНрдирд╛рдВрдЪреА рдЙрддреНрддрд░реЗ рджреНрдпрд╛рд╡реА рд▓рд╛рдЧрддреАрд▓?" рд╣реЗ рд╡рд┐рдЪрд╛рд░рдгреНрдпрд╛рдЖрдзреАрдЪ dashboards рдмрдирд╡рдгреЗ
- symptoms (errors, latency) рдРрд╡рдЬреА causes (CPU, memory, рдПрдХрд╛ pod рдЪрд╛ restart) рд╡рд░ рд▓реЛрдХрд╛рдВрдирд╛ page рдХрд░рдгреЗ
- logs, metrics рдЖрдгрд┐ traces рддреАрди рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ tools рдордзреНрдпреЗ рдареЗрд╡рдгреЗ, рддреНрдпрд╛рдВрдирд╛ рдЬреЛрдбрдгрд╛рд░рд╛ рд╕рд╛рдорд╛рдпрд┐рдХ id рдирд╕рдгреЗ (рдзрдбрд╛ 02)
- "рдЖрдкрд▓реНрдпрд╛рдХрдбреЗ рднрд░рдкреВрд░ data рдЖрд╣реЗ" тАФ outage рджрд░рдореНрдпрд╛рди рдЬрд▓рдж query рдХрд░рддрд╛ рдпреЗрдд рдирд╛рд╣реА рдЕрд╕рд╛ data рдЙрдкрдпреЛрдЧрд╛рдЪрд╛ рдирд╛рд╣реА
- observability рд▓рд╛ рд╡рд┐рдХрдд рдШреЗрдгреНрдпрд╛рдЪреЗ tool рд╕рдордЬрдгреЗ; рддреА рддреБрдореНрд╣реА рдмрдирд╡рд▓реЗрд▓реНрдпрд╛ system рдЪрд╛ рдЧреБрдгрдзрд░реНрдо рдЖрд╣реЗ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
On a real account тАФ рдиреЗрд╣рдореАрдЪреНрдпрд╛ stacks рдордзрд▓реЗ рддреЗрдЪ рддреАрди signals:
| Signal | Open source | AWS | Datadog |
|---|---|---|---|
| ЁЯУК Metrics | Prometheus + Grafana | CloudWatch Metrics | Datadog Metrics |
| ЁЯУУ Logs | Loki, OpenSearch | CloudWatch Logs + Logs Insights | Datadog Logs |
| ЁЯЧ║я╕П Traces | Tempo, Jaeger | AWS X-Ray (CloudWatch) | Datadog APM |
| ЁЯФн рдЧреЛрд│рд╛ рдХрд░рдгреЗ | OpenTelemetry SDK + Collector (рдзрдбрд╛ 06) | ADOT (AWS Distro for OpenTelemetry) | Datadog Agent (OTLP рд╕реНрд╡реАрдХрд╛рд░рддреЛ) |
рдХреЛрдгрддреНрдпрд╛рд╣реА service рдЪреА рдкрд╣рд┐рд▓реА рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рддрдкрд╛рд╕рдгреА: рддреА рдЖрдзреАрдЪ рдЬреЗ рдмрд╛рд╣реЗрд░ рдЯрд╛рдХрддреЗ рддреНрдпрд╛рд╡рд░реВрди, рдкрд╛рдЪ рдорд┐рдирд┐рдЯрд╛рдВрдЪреНрдпрд╛ рдЖрдд рддреБрдореНрд╣реА рд╣реЗ рддреАрди рдкреНрд░рд╢реНрди рд╕реЛрдбрд╡реВ рд╢рдХрддрд╛ рдХрд╛?
1. What share of requests failed in the last 15 minutes? (metrics)
2. For one failed request, which service spent the time? (traces)
3. What did that service say about it, in detail? (logs, joined by trace id)
ЁЯПн Production рдордзреНрдпреЗ рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдЖрдзреА рдкреНрд░рд╢реНрди рд▓рд┐рд╣рд╛, рдордЧ telemetry. рдЬреА service рд╣реЗ рддреАрди рдкреНрд░рд╢реНрди рд╕реЛрдбрд╡реВ рд╢рдХрдд рдирд╛рд╣реА рддреА рдирд┐рдХрд╛рд▓рд╛рдЪреНрдпрд╛ рджрд┐рд╡рд╕рд╛рд╕рд╛рдареА рддрдпрд╛рд░ рдирд╛рд╣реА.
тПня╕П рдкреБрдвреЗ
рдЖрд░реЛрдЧреНрдп рдХрдХреНрд╖рд╛рддрд▓реЗ рдкрд╣рд┐рд▓реЗ рд╕рд╛рдзрди: рджреИрдирдВрджрд┐рдиреА. рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдиреЗрд╕рд╛рдареА рдПрдХ рдУрд│, рдЕрд╢реА рд▓рд┐рд╣рд┐рд▓реЗрд▓реА рдХреА machine рддреА рд╢реЛрдзреВ рд╢рдХреЗрд▓.
git checkout lesson-02-logs