ЁЯУЬ рдзрдбрд╛ 02 тАФ рдХрд░рд╛рд░ рдореНрд╣рдгреВрди SLOs: error budget POLICY
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 02 ┬╖ рдорд╛рдЧреЗ: lesson-01-what-is-sre ┬╖ рдкреБрдвреЗ: lesson-03-toil
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбрд╛ 01, рдЕрдзрд┐рдХ рддреЛ рдХрд░рд╛рд░ рдЬреЛ рдард░рд╡рддреЛ рдХреА рд╢рд╛рд│рд╛ рдЖрдкрд▓реНрдпрд╛ рдЗрдорд╛рд░рддреАрдВрдордзреНрдпреЗ рдХрд┐рддреА рд╡реЗрдЧрд╛рдиреЗ рдмрджрд▓ рдХрд░реВ рд╢рдХрддреЗ.
Observability school SLIs, SLOs рдЖрдгрд┐ budget рдЪреЗ
рдЧрдгрд┐рдд рд╢рд┐рдХрд╡рддреЗ. рд╣рд╛ рдзрдбрд╛ policy рдмрджреНрджрд▓ рдЖрд╣реЗ: рдХрд╛рд╣реАрд╣реА рдмрд┐рдШрдбрдгреНрдпрд╛рдЪреНрдпрд╛ рдЖрдзреА рд╕рд╣реА рдХреЗрд▓реЗрд▓рд╛ рдПрдХ рджрд╕реНрддрдРрд╡рдЬ,
рдЬреЛ рд╕рд╛рдВрдЧрддреЛ рдХреА budget рдЦрд░реНрдЪ рд╣реЛрдд рдЬрд╛рдИрд▓ рддрд╕реЗ product, developers рдЖрдгрд┐ рдкрдердХ рдХрд╛рдп рдХрд░рддреАрд▓.
sre/crew.py рдордзреАрд▓ BudgetPolicy рдЖрдгрд┐
sre/demo.py рдордзреАрд▓ budget().
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╕рддреНрд░рд╛рдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рдкрдердХ рдЖрдгрд┐ рдореБрдЦреНрдпрд╛рдзреНрдпрд╛рдкрдХ рдПрдХ рдХрд░рд╛рд░ рдХрд░рддрд╛рдд. тЬНя╕П
"Timetable рдЗрдорд╛рд░рдд рдереЛрдбреАрд╢реА рдмрд┐рдШрдбрд▓реЗрд▓реА рд░рд╛рд╣реВ рд╢рдХрддреЗ тАФ 1,000 рдкреИрдХреА 1 request. рддреА рдереЛрдбреАрд╢реА рдореБрднрд╛ рдореНрд╣рдгрдЬреЗ рджреБрд░реБрд╕реНрддреАрдЪреЗ рдмрдЬреЗрдЯ. рдмрдЬреЗрдЯ рд╢рд┐рд▓реНрд▓рдХ рдЕрд╕реЗрдкрд░реНрдпрдВрдд рд╢рд┐рдХреНрд╖рд┐рдХрд╛ рд╣рд╡реЗ рддрд┐рддрдХреНрдпрд╛ рд╡реЗрдЧрд╛рдиреЗ рдмрджрд▓ рдХрд░реВ рд╢рдХрддрд╛рдд: рдирд╡реНрдпрд╛ рдЦреЛрд▓реНрдпрд╛, рдирд╡реЗ timetables, рдирд╡реА features."
"рдмрдЬреЗрдЯ рдХрдореА рдЭрд╛рд▓реЗ, рддрд░ рдЖрдореНрд╣реА рд╡реЗрдЧ рдХрдореА рдХрд░рддреЛ рдЖрдгрд┐ рдЖрдзреА рдЧреЛрд╖реНрдЯреА рджреБрд░реБрд╕реНрдд рдХрд░рддреЛ."
"рдмрдЬреЗрдЯ рдкреВрд░реНрдг рд╕рдВрдкрд▓реЗ, рддрд░ рдЖрдореНрд╣реА рдмрджрд▓ рдХрд░рдгреЗ рдерд╛рдВрдмрд╡рддреЛ тАФ рдлрдХреНрдд рддрд╛рддрдбреАрдЪреНрдпрд╛ рджреБрд░реБрд╕реНрддреНрдпрд╛ тАФ рдЬреЛрдкрд░реНрдпрдВрдд рдЗрдорд╛рд░рдд рдкреБрдиреНрд╣рд╛ рдирд┐рд░реЛрдЧреА рд╣реЛрдд рдирд╛рд╣реА."
рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рднрд╛рдЧ: рддреНрдпрд╛рдВрдиреА рд╣реЗ рдЧрд│рддреА рд╕реБрд░реВ рд╣реЛрдгреНрдпрд╛рдЪреНрдпрд╛ рдЖрдзреА рд▓рд┐рд╣реВрди рдареЗрд╡рд▓реЗ рдЖрдгрд┐ рддреНрдпрд╛рд╡рд░ рд╕рд╣реА рдХреЗрд▓реА. рдореНрд╣рдгреВрди рджрд┐рд╡рд╕ 24 рд▓рд╛ рдмрдЬреЗрдЯ рд╕рдВрдкрддреЗ рддреЗрд╡реНрд╣рд╛ рдХреЛрдгреАрдЪ рд╡рд╛рдж рдШрд╛рд▓рдд рдирд╛рд╣реА. рдХрд╛рдп рд╣реЛрддреЗ рддреЗ рдХрд╛рдЧрджрд╛рд╡рд░ рдЖрдзреАрдЪ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдЖрд╣реЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
n["ЁЯЯв normal<br/>under 75% used<br/>release freely"] -->|"day 20: 83.9%"| c["ЁЯЯб caution<br/>75тАУ100%<br/>reliability first"]
c -->|"day 24: 101.8%"| f["ЁЯФ┤ freeze<br/>100% or more<br/>P0 + security only"]
f -->|"day 34: day-6 incident<br/>leaves the window тЖТ 80.4%"| c
c -->|"day 43: 57.1%"| n
big["ЁЯТе one incident > 20%<br/>тЖТ P0 action in its postmortem"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/sre/lesson-diagrams.html#l02
тЭУ рдХрд╛рдп
- SLO (service level objective) тАФ users рдирд╛ рджрд┐рд╕рдгрд╛рд▒реНрдпрд╛ рдПрдХрд╛ рдорд╛рдкрд╛рдЪреЗ (SLI рдЪреЗ) рд▓рдХреНрд╖реНрдп, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде "timetable рдЪреНрдпрд╛ 99.9% requests рдпрд╢рд╕реНрд╡реА рд╣реЛрддрд╛рдд, рд╕рд░рдХрддреНрдпрд╛ 28 рджрд┐рд╡рд╕рд╛рдВрдд рдореЛрдЬрд▓реЗрд▓реЗ". SLI рдХрд╕рд╛ рдирд┐рд╡рдбрд╛рдпрдЪрд╛ рдЖрдгрд┐ рдХрд╕рд╛ рдореЛрдЬрд╛рдпрдЪрд╛: Observability рдзрдбрд╛ 09.
- Error budget тАФ window рдордзреАрд▓ requests рдЪреНрдпрд╛ 1 тИТ SLO. рдЗрдереЗ: рджрд┐рд╡рд╕рд╛рд▓рд╛ 1,000,000 requests ├Ч 28 рджрд┐рд╡рд╕ ├Ч 0.1% = 28 рджрд┐рд╡рд╕рд╛рдВрдд service рд▓рд╛ рдореБрднрд╛ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ 28,000 failed requests.
- Error budget policy тАФ рдЦрд░реНрдЪрд╛рдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рддрд│реАрд╡рд░ рдХрд░рд╛рдпрдЪреНрдпрд╛ рдХреГрддреАрдВрдмрджреНрджрд▓ рд▓рд┐рдЦрд┐рдд рдХрд░рд╛рд░. рддреЛ рдирд╕реЗрд▓, рддрд░ рд╕рдВрдкрд▓реЗрд▓реЗ budget рдореНрд╣рдгрдЬреЗ dashboard рд╡рд░рдЪрд╛ рдлрдХреНрдд рдПрдХ рджреБрдГрдЦреА рдЖрдХрдбрд╛.
- Rolling window тАФ budget рдиреЗрд╣рдореА рдорд╛рдЧреАрд▓ 28 рджрд┐рд╡рд╕рд╛рдВрд╡рд░ рдореЛрдЬрд▓реЗ рдЬрд╛рддреЗ. рдЬреБрдиреА рдЕрдкрдпрд╢реЗ window рдордзреВрди рдмрд╛рд╣реЗрд░ рдкрдбрддрд╛рдд рдЖрдгрд┐ budget рдкрд░рдд рдпреЗрддреЗ. рдорд╣рд┐рдиреНрдпрд╛рдЪреНрдпрд╛ 1 рддрд╛рд░рдЦреЗрд▓рд╛ рдХрд╛рд╣реАрд╣реА reset рд╣реЛрдд рдирд╛рд╣реА.
- Release freeze тАФ budget рд╕рдВрдкрд▓реЗрд▓реЗ рдЕрд╕рддрд╛рдирд╛ feature releases рдерд╛рдВрдмрд╡рд╛; рдлрдХреНрдд P0 рджреБрд░реБрд╕реНрддреНрдпрд╛ рдЖрдгрд┐ security patches рдирд╛ рдкрд░рд╡рд╛рдирдЧреА. Site Reliability Workbook рдордзреАрд▓ Google рдЪреА рдЙрджрд╛рд╣рд░рдг policy рдорд╛рдЧреАрд▓ рдЪрд╛рд░ рдЖрдард╡рдбреЗ budget рдЪреНрдпрд╛ рд╡рд░ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ service рд╕рд╛рдареА рдиреЗрдордХреЗ рд╣реЗрдЪ рд╕рд╛рдВрдЧрддреЗ.
- рдПрдХрд╛рдЪ incident рдЪрд╛ рдирд┐рдпрдо тАФ рддреНрдпрд╛рдЪ рдЙрджрд╛рд╣рд░рдг policy рдордзреВрди: рдЪрд╛рд░ рдЖрдард╡рдбреНрдпрд╛рдВрдЪреНрдпрд╛ budget рдкреИрдХреА 20% рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЬрд╛рд│рдгрд╛рд▒реНрдпрд╛ incident рдЪреЗ postmortem рд╣реЛрддреЗ рдЖрдгрд┐ рддреНрдпрд╛рдд рдХрд┐рдорд╛рди рдПрдХ P0 action item рдЕрд╕рддреЛ. (Postmortem рдХрд╕реЗ рд▓рд┐рд╣рд╛рдпрдЪреЗ: Observability рдзрдбрд╛ 12.)
- Caution рдкрд╛рддрд│реА тАФ рдпрд╛ рдХреЛрд░реНрд╕рдЪреЗ рдЙрджрд╛рд╣рд░рдг 75% рд╡рд░ рдПрдХ рдордзрд▓реА рдкрд╛рдпрд░реА рдЬреЛрдбрддреЗ: рдЖрдзреА reliability рдЪреЗ рдХрд╛рдо рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ release рд╡рд░ рдПрдХ рдЬрд╛рд╕реНрддреАрдЪрд╛ reviewer. рддреБрдордЪреА policy рд╡реЗрдЧрд│реНрдпрд╛ рдкрд╛рддрд│реНрдпрд╛ рдирд┐рд╡рдбреВ рд╢рдХрддреЗ; рдореБрджреНрджрд╛ рдЕрд╕рд╛ рдХреА рдкрд╛рддрд│реНрдпрд╛ рдЖрдгрд┐ рдХреГрддреА рдЖрдзреАрдЪ рд▓рд┐рд╣реВрди рд╕рд╣реА рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЕрд╕рддрд╛рдд.
- Escalation тАФ policy рдмрджреНрджрд▓ рдмрд╛рдЬреВрдВрдордзреНрдпреЗ рдорддрднреЗрдж рдЭрд╛рд▓реЗ (product owner рд▓рд╛ freeze рдордзреНрдпреЗ рдЖрдгрдЦреА рдПрдХ launch рд╣рд╡реЗ рдЕрд╕реЗрд▓), рддрд░ рджрд╕реНрддрдРрд╡рдЬ рд╕рд╛рдВрдЧрддреЛ рдХреА рдирд┐рд░реНрдгрдп рдХреЛрдг рдШреЗрдгрд╛рд░ тАФ рд╕рд╣рд╕рд╛ рдЖрдзреАрдЪ рдирд╛рд╡ рдард░рд╡рд▓реЗрд▓рд╛ рдПрдЦрд╛рджрд╛ рд╡рд░рд┐рд╖реНрда рдиреЗрддрд╛, рддреНрдпрд╛ рджрд┐рд╡рд╢реА рд╕рд░реНрд╡рд╛рдд рдореЛрдареНрдпрд╛ рдЖрд╡рд╛рдЬрд╛рдд рдмреЛрд▓рдгрд╛рд░рд╛ рдирд╛рд╣реА.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдирд╛рд╣реАрддрд░ "reliability рд╡рд┐рд░реБрджреНрдз features" рд╣рд╛ рдирд┐рд░реНрдгрдп рдорддреЗ рдЖрдгрд┐ рдЬреНрдпреЗрд╖реНрдарддреЗрд╡рд░реВрди рдкреБрдиреНрд╣рд╛ рдкреБрдиреНрд╣рд╛ рдШреЗрддрд▓рд╛ рдЬрд╛рддреЛ, рдмрд╣реБрддреЗрдХ рд╡реЗрд│рд╛ рдПрдЦрд╛рджреНрдпрд╛ outage рдЪреНрдпрд╛ рдордзреНрдпрд╛рдд. Budget рддреНрдпрд╛рд▓рд╛ data рдмрдирд╡рддреЗ, рдЖрдгрд┐ policy рддреНрдпрд╛ data рд▓рд╛ рдХреГрддреАрдд рдмрджрд▓рддреЗ. рддреЗ рд╡реЗрдЧрд╛рдЪреЗрд╣реА рд░рдХреНрд╖рдг рдХрд░рддреЗ: budget рд╢рд┐рд▓реНрд▓рдХ рдЕрд╕рддрд╛рдирд╛ рдХреЛрдгреАрд╣реА "рд╕реБрд░рдХреНрд╖рд┐рддрддреЗрд╕рд╛рдареА рдореНрд╣рдгреВрди" release рдЕрдбрд╡реВ рд╢рдХрдд рдирд╛рд╣реА. 100% рд╣реЗ рдЪреБрдХреАрдЪреЗ рд▓рдХреНрд╖реНрдп рдЖрд╣реЗ: SRE рдкреБрд╕реНрддрдХрд╛рддрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдЕрд╕реЗ user рдЪреЗ рдЖрд╣реЗ рдЬреНрдпрд╛рдЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛ phone рдЖрдгрд┐ network 99% рд╡реЗрд│ рдЪрд╛рд▓рддреЛ тАФ рддреЛ 99.99% service рдЖрдгрд┐ 99.999% service рдпрд╛рдВрддреАрд▓ рдлрд░рдХ рдУрд│рдЦреВ рд╢рдХрдд рдирд╛рд╣реА, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЬрд╛рд╕реНрддреАрдЪрд╛ nine рдЬрд╛рд╕реНрдд рдорд╣рд╛рдЧ рдкрдбрддреЛ (рдзрдбрд╛ 09).
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
sre/crew.py рдордзреАрд▓ BudgetPolicy(slo, window_days, daily_requests, slow=0.75, single=0.20)
budget рдореЛрдЬрддреЗ. run(days, baseline, incidents) рджрд░рд░реЛрдЬ baseline failures рдЖрдгрд┐ рддреНрдпрд╛ рджрд┐рд╡рд╕рд╛рдЪрд╛
incident рдЬреЛрдбрддреЗ, рджрд░рд░реЛрдЬ rolling window рдордзрд▓рд╛ рдЦрд░реНрдЪ рдореЛрдЬрддреЗ, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ state change рдЖрдгрд┐
рдПрдХрд╛рдЪ-incident рдЪреНрдпрд╛ рд░реЗрд╖реЗрд╡рд░рдЪрд╛ рдкреНрд░рддреНрдпреЗрдХ incident рдкрд░рдд рджреЗрддреЗ. budget() рдЪрд╛рд░ incidents рд╕рд╣ (рджрд┐рд╡рд╕ 6, 15, 20, 24) 45 рджрд┐рд╡рд╕ рдЪрд╛рд▓рд╡рддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 sre/demo.py budget
python3 - <<'EOF'
import sys; sys.path.insert(0, "sre"); from crew import BudgetPolicy
for slo in (0.999, 0.9995, 0.99):
pol = BudgetPolicy(slo=slo)
changes, big = pol.run(45, baseline=250, incidents={6: 7000, 15: 6500, 20: 5000, 24: 4000})
print(f"SLO {slo:.2%} тЖТ budget {pol.budget:>7,} ┬╖ states: " + " тЖТ ".join(f"{s}@{d}" for d, _, s in changes) + f" ┬╖ P0 postmortems: {len(big)}")
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
budget рд╣реЗ print рдХрд░рддреЗ:
тФАтФА timetable service ┬╖ SLO 99.9% over a rolling 28 days ┬╖ 1,000,000 requests a day тЖТ budget 28,000 failed requests
day 1: 0.9% of the budget used тЖТ normal
day 20: 83.9% of the budget used тЖТ caution
day 24: 101.8% of the budget used тЖТ freeze
day 34: 80.4% of the budget used тЖТ caution
day 43: 57.1% of the budget used тЖТ normal
day 6 incident burned 7,000 = 25.0% (> 20%) тЖТ its postmortem must carry a P0 action item
day 15 incident burned 6,500 = 23.2% (> 20%) тЖТ its postmortem must carry a P0 action item
рддреБрдордЪрд╛ snippet рд╣реЗ print рдХрд░рддреЛ:
SLO 99.90% тЖТ budget 28,000 ┬╖ states: normal@1 тЖТ caution@20 тЖТ freeze@24 тЖТ caution@34 тЖТ normal@43 ┬╖ P0 postmortems: 2
SLO 99.95% тЖТ budget 14,000 ┬╖ states: normal@1 тЖТ caution@14 тЖТ freeze@15 ┬╖ P0 postmortems: 4
SLO 99.00% тЖТ budget 280,000 ┬╖ states: normal@1 ┬╖ P0 postmortems: 0
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреЗрдЪ рдЪрд╛рд░ incidents рддреАрди рдЕрдЧрджреА рд╡реЗрдЧрд│реНрдпрд╛ рддрд┐рдорд╛рд╣реА рджреЗрддрд╛рдд. 99.9% рд╡рд░ policy рджрд┐рд╡рд╕ 24 рд▓рд╛ releases freeze рдХрд░рддреЗ рдЖрдгрд┐ рджрд┐рд╡рд╕ 34 рд▓рд╛ рддреЛ рдЙрдард╡рддреЗ тАФ рдХреЛрдгреА рд╡рд╛рдж рдШрд╛рддрд▓рд╛ рдореНрд╣рдгреВрди рдирд╛рд╣реА, рддрд░ рджрд┐рд╡рд╕ 6 рдЪрд╛ incident 28 рджрд┐рд╡рд╕рд╛рдВрдЪреНрдпрд╛ window рдордзреВрди рдмрд╛рд╣реЗрд░ рдкрдбрд▓рд╛ рдореНрд╣рдгреВрди. 99.95% рд╡рд░ service рджрд┐рд╡рд╕ 15 рд▓рд╛ freeze рд╣реЛрддреЗ рдЖрдгрд┐ рджрд┐рд╡рд╕ 45 рд▓рд╛ рдЕрдЬреВрдирд╣реА freeze рдЕрд╕рддреЗ тАФ рдкреНрд░рддреНрдпреЗрдХ incident рдЪреЗ P0 postmortem рд╣реЛрддреЗ. 99% рд╡рд░ policy рдХрдзреАрдЪ рдХрд╛рд╣реАрдЪ рдХрд░рдд рдирд╛рд╣реА. рдореНрд╣рдгреВрди SLO рд╣рд╛ рджрд╛рдд рдЕрд╕рд▓реЗрд▓рд╛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдирд┐рд░реНрдгрдп рдЖрд╣реЗ: users рдирд╛ рдХрд╛рдп рд╣рд╡реЗ рддреНрдпрд╛рд╡рд░реВрди рддреЛ рдирд┐рд╡рдбрд╛, рдЖрдгрд┐ рдордЧ policy рд▓рд╛ рдХреГрддреА рдХрд░реВ рджреНрдпрд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- policy рдирд╕рд▓реЗрд▓рд╛ SLO тАФ budget рд╕рдВрдкрддреЗ рдЖрдгрд┐ рдХрд╛рд╣реАрдЪ рдмрджрд▓рдд рдирд╛рд╣реА
- outage рдЪрд╛рд▓реВ рдЕрд╕рддрд╛рдирд╛, рд╕рд░реНрд╡рд╛рдд рдердХрд▓реЗрд▓реНрдпрд╛ рдЖрдгрд┐ рд╕рд░реНрд╡рд╛рдд рдЪрд┐рдбрд▓реЗрд▓реНрдпрд╛ рд▓реЛрдХрд╛рдВрдиреА рд▓рд┐рд╣рд┐рд▓реЗрд▓реА policy
- рдмрд╛рд╣реЗрд░ рдкрдбрдгреНрдпрд╛рдЪрд╛ рдирд┐рдпрдо рдирд╕рд▓реЗрд▓рд╛ freeze ("рдмрд░реЗ рд╡рд╛рдЯреЗрдкрд░реНрдпрдВрдд")
- budget рд╢рд┐рд▓реНрд▓рдХ рдЕрд╕рддрд╛рдирд╛ "рд╕реБрд░рдХреНрд╖рд┐рддрддреЗрд╕рд╛рдареА" releases рдЕрдбрд╡рдгреЗ тАФ рддреНрдпрд╛рдиреЗ developers рдЪрд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдЦрд░реНрдЪ рд╣реЛрддреЛ
- рдирд┐рдпреЛрдЬрд┐рдд maintenance budget рдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рдореЛрдЬрдгреЗ, рдореНрд╣рдгрдЬреЗ SLO рджреБрд░реНрд▓рдХреНрд╖рд┐рдд рдХрд░рддреЛ рддреЛ downtime users рдирд╛ рдЬрд╛рдгрд╡рддреЛ
- рдкреНрд░рддреНрдпреЗрдХ service рд╕рд╛рдареА рдПрдХрдЪ policy, рддрд┐рдЪреНрдпрд╛ users рдирд╛ рдХрд╛рд╣реАрд╣реА рд╣рд╡реЗ рдЕрд╕рд▓реЗ рддрд░реА
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
Policy SLO рд╢реЗрдЬрд╛рд░реАрдЪ, service repo рдордзреНрдпреЗ рдареЗрд╡рд╛, рдирд╛рд╡рд╛рдирд┐рд╢реА рдард░рд▓реЗрд▓реНрдпрд╛ рд▓реЛрдХрд╛рдВрдЪреНрдпрд╛ рд╕рд╣реАрд╕рд╣. рдПрдХ рдЫреЛрдЯреЗ рдЙрджрд╛рд╣рд░рдг (рд╕рд╛рдзреА YAML, рдЬреА рдорд╛рдгрд╕реЗ рдЖрдгрд┐ release gate рджреЛрдШреЗрд╣реА рд╡рд╛рдЪрддрд╛рдд):
service: timetable
slo: {sli: "successful requests / all requests", target: 99.9, window: 28d}
policy:
- when: "budget_used < 75%"
do: "release normally"
- when: "75% <= budget_used < 100%"
do: "reliability items first; second reviewer on every release"
- when: "budget_used >= 100%"
do: "freeze: only P0 fixes and security patches until back inside the SLO"
- when: "one incident > 20% of the budget"
do: "postmortem with at least one P0 action item"
escalation: "disagreements go to the head of engineering"
signed: [product: aishwarya, dev: timetable-team, sre: katrina]
рдЦрд▒реНрдпрд╛ account рд╡рд░ тАФ CI рдордзреАрд▓ release gate deploy рдЪреНрдпрд╛ рдЖрдзреА Prometheus рдордзреВрди budget рд╡рд╛рдЪреВ рд╢рдХрддреЗ. рдЗрдерд▓реЗ recording rule рдЪреЗ рдирд╛рд╡ рддреБрдореНрд╣реА рд╕реНрд╡рддрдГ рдард░рд╡рд╛рдпрдЪреЗ рдЖрд╣реЗ (Observability school рддреЗ рддрдпрд╛рд░ рдХрд░рддреЗ):
used=$(curl -s "http://prometheus:9090/api/v1/query" \
--data-urlencode 'query=slo:timetable:budget_used_ratio:28d' | jq -r '.data.result[0].value[1]')
awk -v u="$used" 'BEGIN { exit (u >= 1.0) }' || { echo "error budget spent тАФ release frozen"; exit 1; }
рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА SLOs рдЖрдгрд┐ budgets рдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрдгрд╛рд▒реНрдпрд╛ tools рдордзреНрдпреЗ Sloth рдЖрдгрд┐ Pyrra (open source, Prometheus rules рддрдпрд╛рд░ рдХрд░рддрд╛рдд), Google Cloud рдЖрдгрд┐ Datadog рдЪреА SLO features, рдЖрдгрд┐ Nobl9 рдпрд╛рдВрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЖрд╣реЗ.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ: рддреБрдордЪреНрдпрд╛ рд╕рд░реНрд╡рд╛рдд рдорд╣рддреНрддреНрд╡рд╛рдЪреНрдпрд╛ service рдЪрд╛ SLO рд╢реЛрдзрд╛. рдордЧ рддреНрдпрд╛рдЪреЗ budget рд╕рдВрдкрд▓реНрдпрд╛рд╡рд░ рдХрд╛рдп рд╣реЛрддреЗ рд╣реЗ рд╕рд╛рдВрдЧрдгрд╛рд░реЗ рдкрд╛рди рд╢реЛрдзрд╛. рдЕрд╕реЗ рдкрд╛рди рдирд╕реЗрд▓, рддрд░ рддреЛ SLO рдлрдХреНрдд рд╕рдЬрд╛рд╡рдЯ рдЖрд╣реЗ тАФ policy рд▓рд┐рд╣рд╛ рдЖрдгрд┐ рдпрд╛ рдорд╣рд┐рдиреНрдпрд╛рддрдЪ рддрд┐рдЪреНрдпрд╛рд╡рд░ рд╕рд╣реА рдШреНрдпрд╛.
тПня╕П рдкреБрдвреЗ
Policy рдореНрд╣рдгрддреЗ "рдЖрдзреА рдЧреЛрд╖реНрдЯреА рджреБрд░реБрд╕реНрдд рдХрд░рд╛". рдкрдг рдкрдердХ рдмрд╛рджрд▓реНрдпрд╛ рд╡рд╛рд╣рдгреНрдпрд╛рдд рд╡реНрдпрд╕реНрдд рдЖрд╣реЗ. рдкреБрдврдЪрд╛ рдзрдбрд╛ рддреНрдпрд╛ рдмрд╛рджрд▓реНрдпрд╛ рдореЛрдЬрддреЛ.
git checkout lesson-03-toil