ЁЯПл The SchoolтА║ЁЯЫая╕П SREтА║ЁЯЫая╕П рдзрдбрд╛ 01 тАФ SRE рдореНрд╣рдгрдЬреЗ рдХрд╛рдп: рдкрдиреНрд╣рд╛рд│ рджреБрд░реБрд╕реНрдд рдХрд░рдгрд╛рд░реЗ рдкрдердХ
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯЫая╕П рдзрдбрд╛ 01 тАФ SRE рдореНрд╣рдгрдЬреЗ рдХрд╛рдп: рдкрдиреНрд╣рд╛рд│ рджреБрд░реБрд╕реНрдд рдХрд░рдгрд╛рд░реЗ рдкрдердХ

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 01 ┬╖ рдкреБрдвреЗ: lesson-02-error-budget-policy


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рд╣рд╛ рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕ рдЬреНрдпрд╛ рдХрд╛рдорд╛рдмрджреНрджрд▓ рдЖрд╣реЗ рддреЗ рдХрд╛рдо. рд╢рд╛рд│реЗрдд рдЕрдиреЗрдХ рдЗрдорд╛рд░рддреА (services) рдЖрд╣реЗрдд: timetable, рдирд┐рдХрд╛рд▓рд╛рдВрдЪреЗ portal, рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рдЪрд╛ catalogue. рд╢рд╛рд│реЗрдХрдбреЗ рдПрдХ рджреЗрдЦрднрд╛рд▓ рдкрдердХ рдЖрд╣реЗ тАФ рдХрддрд░рд┐рдирд╛, рджреАрдкрд┐рдХрд╛ рдЖрдгрд┐ рдРрд╢реНрд╡рд░реНрдпрд╛ тАФ рдЬреНрдпрд╛ рдЗрдорд╛рд░рддреА рдЪрд╛рд▓реВ рдареЗрд╡рддрд╛рдд. рдпрд╛ рдкрдердХрд╛рдЪрд╛ рдПрдХ рдирд┐рдпрдо рддреНрдпрд╛рдВрдирд╛ рд╕рд╛рдзреНрдпрд╛ рджреБрд░реБрд╕реНрддреА team рдкреЗрдХреНрд╖рд╛ рд╡реЗрдЧрд│реЗ рдмрдирд╡рддреЛ: рддреНрдпрд╛ tools рд▓рд┐рд╣рд┐рддрд╛рдд, рдлрдХреНрдд рдЬрд╛рд╕реНрдд рдмрд╛рджрд▓реНрдпрд╛ рд╡рд╛рд╣рдд рдирд╛рд╣реАрдд. рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕рднрд░ рддреБрдореНрд╣реА рд╡рд╛рдкрд░рд╛рд▓ рддреНрдпрд╛ рдЦрд▒реНрдпрд╛ files:

ЁЯОТ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдЖрдзреА: рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд Python 3 рд▓рд╛рдЧреЗрд▓, рдмрд╛рдХреА рдХрд╛рд╣реА рдирд╛рд╣реА тАФ cloud account рдирд╛рд╣реА, pip install рдирд╛рд╣реА. crew.py рдЖрдгрд┐ design.py рд╣реЗ рд╢рд┐рдХрд╡рдгреНрдпрд╛рд╕рд╛рдареАрдЪреЗ models рдЖрд╣реЗрдд: рддреЗ рдЦрд▒реНрдпрд╛ SRE рдкрджреНрдзрддреАрдЪреЗ рдЧрдгрд┐рдд рдЖрдгрд┐ рдирд┐рдпрдо рдареЗрд╡рддрд╛рдд рдЖрдгрд┐ рдмрд╛рдХреА рд╕рдЧрд│реЗ рд╡рдЧрд│рддрд╛рдд. Randomness рд▓рд╛ seed рджрд┐рд▓реЗрд▓рд╛ рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдкреНрд░рддреНрдпреЗрдХ run рддреАрдЪ рдЧреЛрд╖реНрдЯ print рдХрд░рддреЛ. Signals, SLO рдЪреЗ рдЧрдгрд┐рдд, burn-rate alerts рдЖрдгрд┐ postmortems рд╣реЗ рд╢реЗрдЬрд╛рд░рдЪреНрдпрд╛ Observability school рдордзреНрдпреЗ рд╢рд┐рдХрд╡рд▓реЗ рдЖрд╣реЗрдд; рд╣рд╛ рдХреЛрд░реНрд╕ рддреЗ рдкреБрдиреНрд╣рд╛ рд╢рд┐рдХрд╡рдгреНрдпрд╛рдРрд╡рдЬреА рддреНрдпрд╛рдВрдЪреНрдпрд╛рдХрдбреЗ link рджреЗрддреЛ.

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рдкрд╛рдКрд╕ рдкрдбрд▓рд╛ рдХреА timetable рдЗрдорд╛рд░рддреАрдЪреЗ рдЫрдкреНрдкрд░ рдЧрд│рддреЗ. ЁЯМзя╕П

рд╕рд╛рдзреА рджреБрд░реБрд╕реНрддреА team рдЧрд│рддреАрдЦрд╛рд▓реА рдПрдХ рдмрд╛рджрд▓реА рдареЗрд╡рддреЗ. рдкреБрдврдЪреНрдпрд╛ рдЖрдард╡рдбреНрдпрд╛рдд рдЬрд╛рд╕реНрдд рдкрд╛рдКрд╕, рдЬрд╛рд╕реНрдд рдЧрд│рддреА, рдЬрд╛рд╕реНрдд рдмрд╛рджрд▓реНрдпрд╛. рд╢рд╛рд│рд╛ рд╡рд╛рдврддреЗ, рдореНрд╣рдгреВрди рдЫрдкрд░реЗ рд╡рд╛рдврддрд╛рдд тАФ рдЖрдгрд┐ рдмрд╛рджрд▓реНрдпрд╛рд╣реА. рд▓рд╡рдХрд░рдЪ рддреА team рдмрд╛рджрд▓реНрдпрд╛ рд╡рд╛рд╣рдгреНрдпрд╛рд╢рд┐рд╡рд╛рдп рджреБрд╕рд░реЗ рдХрд╛рд╣реАрдЪ рдХрд░рдд рдирд╛рд╣реА. рдлрдХреНрдд рддреНрдпрд╛ рд╡рд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА рддреНрдпрд╛рдВрдирд╛ рдЬрд╛рд╕реНрдд рд▓реЛрдХ рд▓рд╛рдЧрддрд╛рдд.

рдХрддрд░рд┐рдирд╛, рджреАрдкрд┐рдХрд╛ рдЖрдгрд┐ рдРрд╢реНрд╡рд░реНрдпрд╛ рд╣реЗ рд╡реЗрдЧрд│реНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ рдХрд░рддрд╛рдд. рдЖрдЬ рддреНрдпрд╛ рдмрд╛рджрд▓реА рд╡рд╛рд╣рддрд╛рдд, рд╣реЛ. рдкрдг рддреНрдпрд╛ рдкрдиреНрд╣рд╛рд│рд╕реБрджреНрдзрд╛ рджреБрд░реБрд╕реНрдд рдХрд░рддрд╛рдд, рдореНрд╣рдгрдЬреЗ рдкреБрдврдЪреНрдпрд╛ рдЖрдард╡рдбреНрдпрд╛рдд рдЧрд│рддреА рдирд╛рд╣реА рдЖрдгрд┐ рдмрд╛рджрд▓реАрд╣реА рдирд╛рд╣реА. ЁЯФз

рдЖрдгрд┐ рддреНрдпрд╛ рдПрдХ рдирд┐рдпрдо рдкрд╛рд│рддрд╛рдд: рдЖрдордЪреНрдпрд╛ рдЖрдард╡рдбреНрдпрд╛рдЪрд╛ рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд рдЕрд░реНрдзрд╛ рд╡реЗрд│ рдмрд╛рджрд▓реНрдпрд╛рдВрд╕рд╛рдареА. рдЙрд░рд▓реЗрд▓рд╛ рдЕрд░реНрдзрд╛ рдкрдиреНрд╣рд╛рд│ рджреБрд░реБрд╕реНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА. рдЬрд░ рдмрд╛рджрд▓реНрдпрд╛рдВрдиреА рдЕрд░реНрдзреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЖрдард╡рдбрд╛ рдШреЗрддрд▓рд╛, рддрд░ рддреНрдпрд╛ рдЗрдорд╛рд░рдд рдмрд╛рдВрдзрдгрд╛рд▒реНрдпрд╛ рд▓реЛрдХрд╛рдВрдирд╛ рд╕рд╛рдВрдЧрддрд╛рдд: "рддреБрдордЪреА рдЗрдорд╛рд░рдд рдЦреВрдк рдЧрд│рддреЗ тАФ рд╡рд╛рд╣рд╛рдпрд▓рд╛ рдорджрдд рдХрд░рд╛рдпрд▓рд╛ рдпрд╛, рдХрд┐рдВрд╡рд╛ рджреБрд░реБрд╕реНрдд рдХрд░рд╛рдпрд▓рд╛ рдорджрдд рдХрд░рд╛рдпрд▓рд╛ рдпрд╛."

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart LR
    rain["ЁЯМзя╕П more pupils,<br/>more buildings"] --> ops["ЁЯкг ops work<br/>tickets, pages, manual fixes"]
    ops --> cap{"more than 50%<br/>of the crew's week?"}
    cap -->|"no"| eng["ЁЯФз engineering<br/>tools, automation, fixes"]
    cap -->|"yes"| back["тЖйя╕П extra ops goes back<br/>to the dev team"]
    eng -->|"less ops next week"| ops
    back --> eng

ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/sre/lesson-diagrams.html#l01

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

рдХрд╛рд░рдг рд╣рд╛рддрд╛рдиреЗ рдХреЗрд▓реЗрд▓реЗ operations рд╡рд╛рдврддреНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рдЯрд┐рдХрдд рдирд╛рд╣реАрдд. рдкреНрд░рддреНрдпреЗрдХ рдирд╡реНрдпрд╛ рдЗрдорд╛рд░рддреАрд╕рд╛рдареА рдмрд╛рджрд▓реНрдпрд╛ рд╡рд╛рд╣рд╛рдпрд▓рд╛ рдЖрдгрдЦреА рдПрдХ рдорд╛рдгреВрд╕ рд▓рд╛рдЧрдд рдЕрд╕реЗрд▓, рддрд░ рджреЗрдЦрднрд╛рд▓реАрдЪрд╛ рдЦрд░реНрдЪ рд╢рд╛рд│реЗрдЗрддрдХрд╛рдЪ рд╡реЗрдЧрд╛рдиреЗ рд╡рд╛рдврддреЛ. рддреНрдпрд╛рд╣реВрди рд╡рд╛рдИрдЯ: рдЬреА team рдлрдХреНрдд рдмрд╛рджрд▓реНрдпрд╛ рд╡рд╛рд╣рддреЗ рддрд┐рдЪреНрдпрд╛рдХрдбреЗ рдЫрдкреНрдкрд░ рдХрд╛ рдЧрд│рддреЗ рд╣реЗ рд╡рд┐рдЪрд╛рд░рд╛рдпрд▓рд╛ рд╡реЗрд│рдЪ рдирд╕рддреЛ. 50% cap рддреЛ рд╡реЗрд│ рд╡рд╛рдЪрд╡рддреЛ рдЬреЛ рдкреНрд░рд╢реНрди рд▓рд╣рд╛рди рдХрд░рддреЛ. рдЖрдгрд┐ рдЬрд╛рд╕реНрддреАрдЪреЗ рдХрд╛рдо developers рдХрдбреЗ рдкрд░рдд рдкрд╛рдард╡рдгреЗ рд╣рд╛ рдПрдХ feedback loop рдЖрд╣реЗ: рдЬреЗ рд▓реЛрдХ рдЧрд│рдХреЗ design рджреБрд░реБрд╕реНрдд рдХрд░реВ рд╢рдХрддрд╛рдд рддреНрдпрд╛рдВрдирд╛ рдЧрд│рддреА рдЬрд╛рдгрд╡рддреЗ.

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)

sre/crew.py рдордзреАрд▓ ops_share(weeks, cap=0.5) рджрд░ рдЖрдард╡рдбреНрдпрд╛рдЪреНрдпрд╛ (ops_hours, total_hours) рдЪреА рдпрд╛рджреА рдШреЗрддреЗ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХрд╛рд╕рд╛рдареА (share, over_cap) рдкрд░рдд рджреЗрддреЗ. sre/demo.py рдордзреАрд▓ job() рддреАрди рдЬрдгрд╛рдВрдЪреНрдпрд╛ рдкрдердХрд╛рдЪреЗ рд╕рд╣рд╛ рдЖрдард╡рдбреЗ рдЪрд╛рд▓рд╡рддреЗ: 3 ├Ч 40 рддрд╛рд╕ = рдЖрдард╡рдбреНрдпрд╛рд▓рд╛ 120 рддрд╛рд╕.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

python3 sre/demo.py job
python3 - <<'EOF'
import sys; sys.path.insert(0, "sre"); from crew import ops_share
# a quarter where the timetable service keeps growing and nobody automates anything
weeks = [(40 + 4 * w, 120) for w in range(8)]
for i, (share, over) in enumerate(ops_share(weeks), 1):
    print(f"week {i}: ops {share:5.1%}" + (" тЖТ over the cap" if over else ""))
print("the same weeks with a 3-person crew grown to 4 (160 h):")
print([f"{s:.0%}" for s, _ in ops_share([(o, 160) for o, _ in weeks])])
EOF
python3 sre/test_sre.py

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

job рд╣реЗ print рдХрд░рддреЗ:

   week 3:  63 h ops = 52.5%  тЖР over the 50% cap: extra tickets and pages go back to the dev team
   week 4:  71 h ops = 59.2%  тЖР over the 50% cap: extra tickets and pages go back to the dev team
   week 5:  58 h ops = 48.3%
   week 6:  45 h ops = 37.5%
   six-week average 47.1% ┬╖ the rest of the week is ENGINEERING: tools that make next week's ops smaller

рддреБрдордЪрд╛ snippet рд╣реЗ print рдХрд░рддреЛ:

week 6: ops 50.0%
week 7: ops 53.3% тЖТ over the cap
week 8: ops 56.7% тЖТ over the cap
the same weeks with a 3-person crew grown to 4 (160 h):
['25%', '28%', '30%', '32%', '35%', '38%', '40%', '42%']

Tests рд╢реЗрд╡рдЯреА 12/12 passed рджрд╛рдЦрд╡рддрд╛рдд.

ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ

Ops рджрд░ рдЖрдард╡рдбреНрдпрд╛рд▓рд╛ 4 рддрд╛рд╕рд╛рдВрдиреА рд╡рд╛рдврдд рдЕрд╕реЗрд▓ рдЖрдгрд┐ рдХреЛрдгреАрдЪ automate рдХрд░рдд рдирд╕реЗрд▓, рддрд░ рдкрдердХ рдЖрдард╡рдбрд╛ 7 рдордзреНрдпреЗ cap рдУрд▓рд╛рдВрдбрддреЗ. рдЪреМрдереА рд╡реНрдпрдХреНрддреА рднрд░рддреА рдХреЗрд▓реНрдпрд╛рдиреЗ share рдкрд░рдд 42% рд╡рд░ рдпреЗрддреЛ тАФ рд╕рдзреНрдпрд╛рдкреБрд░рддрд╛. Ops рдЪреЗ рддрд╛рд╕ рд╡рд╛рдврддрдЪ рд░рд╛рд╣рд┐рд▓реЗ (40 тЖТ 68); рдирд╡реНрдпрд╛ рд╡реНрдпрдХреНрддреАрдиреЗ рдлрдХреНрдд рд╡реЗрд│ рд╡рд┐рдХрдд рдШреЗрддрд▓рд╛. рд╣рд╛рдЪ рдкрд╛рд░рдВрдкрд░рд┐рдХ ops рдЪрд╛ рд╕рд╛рдкрд│рд╛ рдЖрд╣реЗ: рдЬрд╛рд╕реНрдд рдмрд╛рджрд▓реНрдпрд╛рдВрд╡рд░ рдЙрдкрд╛рдп рдореНрд╣рдгрдЬреЗ рдЬрд╛рд╕реНрдд рд▓реЛрдХ. SRE рдЪрд╛ рдЙрдкрд╛рдп рдореНрд╣рдгрдЬреЗ 68 рд▓рд╣рд╛рди рдХрд░рдгреЗ, рдЖрдгрд┐ рддреЛрдЪ рднрд╛рдЧ 1 рдЪрд╛ рдЙрд░рд▓реЗрд▓рд╛ рднрд╛рдЧ рдЖрд╣реЗ. Demo рдЪреНрдпрд╛ рдЖрдард╡рдбреЗ 3 рдЖрдгрд┐ 4 рдордзреНрдпреЗ рдкрдердХрд╛рдиреЗ рдЬрд╛рд╕реНрддреАрдЪреЗ рдХрд╛рдо developers рдХрдбреЗ рдкрд░рдд рджрд┐рд▓реЗ; рдЖрдард╡рдбрд╛ 6 рдкрд░реНрдпрдВрдд рддреЗ 37.5% рд╡рд░ рдЖрд▓реЗ.

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд

Ops share рдореЛрдЬрд╛. рд╕рд░реНрд╡рд╛рдд рд╕реНрд╡рд╕реНрдд рдорд╛рд░реНрдЧ: tickets рдЖрдгрд┐ pages рдирд╛ label рд▓рд╛рд╡рд╛, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХрд╛рдиреЗ рдЖрдард╡рдбреНрдпрд╛рддреВрди рдПрдХрджрд╛ ops рдЪреЗ рддрд╛рд╕ рдиреЛрдВрджрд╡рд╛рд╡реЗрдд. рдЦрд▒реНрдпрд╛ account рд╡рд░ тАФ GitHub CLI рд╡рд╛рдкрд░реВрди, рдкрдердХрд╛рдЪреНрдпрд╛ repo рдордзреАрд▓ рдпрд╛ рдЖрдард╡рдбреНрдпрд╛рддрд▓реЗ ops label рдЕрд╕рд▓реЗрд▓реЗ issues рдореЛрдЬрд╛:

gh issue list --label ops --state all --search "created:>=2026-09-21" --json number --jq length

SRE рдЖрдгрд┐ рдПрдЦрд╛рджреНрдпрд╛ service рдЪреНрдпрд╛ developers рдордзрд▓реА рдПрдХ рдЫреЛрдЯреА "engagement" рдиреЛрдВрдж рдХрд╛рдо рдкрд░рдд рджреЗрдгреЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рддреЗ (service repo рдордзреАрд▓ рдПрдХ рд╕рд╛рдзреА YAML file рдкреБрд░реЗрд╢реА рдЖрд╣реЗ):

service: timetable
sre_owner: katrina
dev_owner: timetable-team
ops_cap: 0.5              # measured over 4 weeks
over_cap_action: dev team joins the on-call rotation and takes ops tickets until under the cap
review: quarterly

рдкреБрдвреЗ рд╡рд╛рдЪрд╛: https://sre.google/books/ рд╡рд░реАрд▓ рдореЛрдлрдд SRE рдкреБрд╕реНрддрдХреЗ тАФ Site Reliability Engineering (2016) рдЪреА рдкреНрд░рдХрд░рдгреЗ 1 рдЖрдгрд┐ 5, рдЖрдгрд┐ The Site Reliability Workbook (2018) рдордзреАрд▓ SRE рдЪрд╛ DevOps рд╢реА рд╕рдВрдмрдВрдз рд╕рд╛рдВрдЧрдгрд╛рд░реЗ рдкреНрд░рдХрд░рдг.

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ: рддреБрдордЪреНрдпрд╛ team рд▓рд╛ рд╡рд┐рдЪрд╛рд░рд╛ "рдЧреЗрд▓реНрдпрд╛ рдорд╣рд┐рдиреНрдпрд╛рддрд▓рд╛ рдХрд┐рддреА рднрд╛рдЧ ops рд╣реЛрддрд╛?" рдХреЛрдгрд╛рд▓рд╛рдЪ рдорд╛рд╣реАрдд рдирд╕реЗрд▓, рддрд░ рдпрд╛ рдЖрдард╡рдбреНрдпрд╛рдкрд╛рд╕реВрди рдиреЛрдВрджрд╡рд╛рдпрд▓рд╛ рд╕реБрд░реБрд╡рд╛рдд рдХрд░рд╛. рддреБрдореНрд╣реА SRE team рдЖрд╣рд╛рдд рдХреА рдмрд╛рджрд▓реА team, рд╣реЗ рддреЛ рдЖрдХрдбрд╛ рдард░рд╡рддреЛ.

тПня╕П рдкреБрдвреЗ

Cap рдкрдердХрд╛рдЪрд╛ рд╡реЗрд│ рд╡рд╛рдЪрд╡рддреЛ. рдкреБрдврдЪрд╛ рдзрдбрд╛ users рдЪреЗ рд░рдХреНрд╖рдг рдХрд░рддреЛ: рдЕрдкрдпрд╢рд╛рдЪреЗ рдПрдХ рдард░рд▓реЗрд▓реЗ рдкреНрд░рдорд╛рдг, рдЖрдгрд┐ рддреЗ рд╕рдВрдкрд▓реНрдпрд╛рд╡рд░ рдХрд╛рдп рд╣реЛрддреЗ.

git checkout lesson-02-error-budget-policy

ЁЯЫая╕П Lesson 01 тАФ What SRE is: the crew that fixes the gutter

ЁЯУН You are here: Lesson 01 of 12 ┬╖ Next: lesson-02-error-budget-policy


ЁЯУж What's in this branch

The job this whole course is about. The school has many buildings (services): the timetable, the results portal, the library catalogue. It has a maintenance crew тАФ Katrina, Dipika and Aishwarya тАФ who keep the buildings running. The crew has one rule that makes it different from a plain repair team: they write tools, they do not just carry more buckets. Real files you will use all the way through:

ЁЯОТ Before you start: you need Python 3 and nothing else тАФ no cloud account, no pip install. crew.py and design.py are teaching models: they keep the arithmetic and the rules of real SRE practice and leave out everything else. Randomness is seeded, so every run prints the same story. Signals, SLO arithmetic, burn-rate alerts and postmortems are taught in the sibling Observability school; this course links to them instead of teaching them again.

ЁЯзТ Explain like I'm 5

When it rains, the roof of the timetable building leaks. ЁЯМзя╕П

A plain repair team puts a bucket under the leak. Next week, more rain, more leaks, more buckets. The school grows, so there are more roofs тАФ and more buckets. Soon the team does nothing but carry buckets. They need more people just to carry them.

Katrina, Dipika and Aishwarya do it differently. They carry the bucket today, yes. But they also fix the gutter, so next week there is no leak and no bucket. ЁЯФз

And they keep a rule: at most half of our week is buckets. The other half is for fixing gutters. If the buckets take more than half the week, they tell the people who built the building: "your building leaks too much тАФ come and help carry, or come and help fix."

ЁЯЧ║я╕П Diagram

flowchart LR
    rain["ЁЯМзя╕П more pupils,<br/>more buildings"] --> ops["ЁЯкг ops work<br/>tickets, pages, manual fixes"]
    ops --> cap{"more than 50%<br/>of the crew's week?"}
    cap -->|"no"| eng["ЁЯФз engineering<br/>tools, automation, fixes"]
    cap -->|"yes"| back["тЖйя╕П extra ops goes back<br/>to the dev team"]
    eng -->|"less ops next week"| ops
    back --> eng

ЁЯЧ║я╕П Drawn version + a lab: https://school-edh.pages.dev/sre/lesson-diagrams.html#l01

тЭУ What

ЁЯдФ Why

Because manual operations do not scale. If every new building needs another person to carry buckets, the maintenance bill grows as fast as the school. Worse: a team that only carries buckets has no time to ask why the roof leaks. The 50% cap protects the time that makes the problem smaller. And sending the extra back to the developers is a feedback loop: the people who can fix a leaky design feel the leaks.

ЁЯФз How (in this repo)

ops_share(weeks, cap=0.5) in sre/crew.py takes a list of (ops_hours, total_hours) per week and returns (share, over_cap) for each. job() in sre/demo.py runs six weeks of a three-person crew: 3 ├Ч 40 hours = 120 hours a week.

ЁЯзк Try it

python3 sre/demo.py job
python3 - <<'EOF'
import sys; sys.path.insert(0, "sre"); from crew import ops_share
# a quarter where the timetable service keeps growing and nobody automates anything
weeks = [(40 + 4 * w, 120) for w in range(8)]
for i, (share, over) in enumerate(ops_share(weeks), 1):
    print(f"week {i}: ops {share:5.1%}" + (" тЖТ over the cap" if over else ""))
print("the same weeks with a 3-person crew grown to 4 (160 h):")
print([f"{s:.0%}" for s, _ in ops_share([(o, 160) for o, _ in weeks])])
EOF
python3 sre/test_sre.py

тЬЕ Verify тАФ what you should see

job prints:

   week 3:  63 h ops = 52.5%  тЖР over the 50% cap: extra tickets and pages go back to the dev team
   week 4:  71 h ops = 59.2%  тЖР over the 50% cap: extra tickets and pages go back to the dev team
   week 5:  58 h ops = 48.3%
   week 6:  45 h ops = 37.5%
   six-week average 47.1% ┬╖ the rest of the week is ENGINEERING: tools that make next week's ops smaller

Your snippet prints:

week 6: ops 50.0%
week 7: ops 53.3% тЖТ over the cap
week 8: ops 56.7% тЖТ over the cap
the same weeks with a 3-person crew grown to 4 (160 h):
['25%', '28%', '30%', '32%', '35%', '38%', '40%', '42%']

The tests end with 12/12 passed.

ЁЯПБ What you just proved

When ops grows by 4 hours a week and nobody automates, the crew crosses the cap in week 7. Hiring a fourth person pushes the share back to 42% тАФ for now. The ops hours kept growing (40 тЖТ 68); the new person only bought time. That is the classic ops trap: the fix for more buckets is more people. The SRE fix is to make the 68 smaller, which is the rest of Part 1. In weeks 3 and 4 of the demo, the crew handed the extra back to the developers; by week 6 it was down to 37.5%.

тЪая╕П Common mistakes

ЁЯПн In production

Measure the ops share. The cheapest way: label tickets and pages, and have each person log ops hours once a week. On a real account тАФ with the GitHub CLI, count this week's issues labelled ops in the crew's repo:

gh issue list --label ops --state all --search "created:>=2026-09-21" --json number --jq length

A short "engagement" note between SRE and the developers of a service makes the handback explicit (a plain YAML file in the service repo is enough):

service: timetable
sre_owner: katrina
dev_owner: timetable-team
ops_cap: 0.5              # measured over 4 weeks
over_cap_action: dev team joins the on-call rotation and takes ops tickets until under the cap
review: quarterly

Read further: the free SRE books at https://sre.google/books/ тАФ Site Reliability Engineering (2016) chapters 1 and 5, and The Site Reliability Workbook (2018) chapter on how SRE relates to DevOps.

ЁЯПн Why this matters in production: ask your team "what share of last month was ops?" If nobody knows, start logging it this week. The number decides whether you are an SRE team or a bucket team.

тПня╕П Next

The cap protects the crew's time. The next lesson protects the users: an agreed amount of failure, and what happens when it is used up.

git checkout lesson-02-error-budget-policy
тЖР Course homeall lessonsNext тЖТerror budget policy

This page is the lesson's README from the lesson-01-what-is-sre branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.