Gendi Notes

SLOs and Error Budgets

An availability target is only useful if missing it *changes what the team does* — otherwise it is a number in a slide deck, and everyone already knows it.

Level 3 concept srereliabilityslo

What is it?#

Three terms, in increasing order of consequence:

Is aMissing it costs you
SLImeasurement — good events ÷ valid eventsNothing. It is just a number
SLOinternal target for that SLIAn engineering decision you agreed in advance
SLAexternal contract with a customerMoney

An error budget is the arithmetic remainder: 1 − SLO, expressed as the amount of failure you are allowed. At 99.9% monthly, that is about 43 minutes.

Why it exists#

Not to measure reliability. To settle an argument before it happens.

Every team has the same recurring fight: the product side wants to ship, the operations side wants to be careful, and each round is re-argued from scratch with no shared basis for deciding.

An error budget replaces opinion with arithmetic:

budget remaining? → ship. that is what it is for. │ │ spent it? ↓ reliability work becomes the priority, automatically — agreed in advance, by everyone, in writing
Without an error budgetWith one
"Is it safe to deploy?" — reargued weeklyCheck the budget
Reliability work competes with featuresSpending the budget creates the mandate
The careful engineer is "blocking"The policy blocks, not a person
100% is implicitly the targetThe target is explicit and affordable

What it is made of#

The nines, in time you can actually picture#

SLODowntime / monthDowntime / yearFeels like
99%7.3 hours3.65 daysNoticeable weekly
99.9%43.8 minutes8.8 hoursOne bad deploy
99.95%21.9 minutes4.4 hoursTight for a small team
99.99%4.4 minutes52.6 minutesNeeds multi-AZ and automation
99.999%26 seconds5.3 minutesNo human can respond in time

Choosing an SLI that means something#

The SLI has to be measured where the user is, and count what the user notices.

Weak SLIWhy it liesBetter
Server CPU < 80%Users cannot feel CPURequest success rate at the load balancer
Average latencyAverages erase the slow tailp99 latency
Uptime of the VMThe VM is up, the app returns 500Successful requests ÷ valid requests
Ping succeedsProves routing, not serviceAn actual request to a real endpoint

How to use it#

Define one, concretely#

An SLO, written the way it has to be written
SLI:      proportion of HTTP requests to /api/* returning < 500,
          measured at the load balancer
SLO:      99.9% over a rolling 28 days
Budget:   0.1% = ~43 minutes of failed requests per 28 days
Policy:   > 50% budget spent  →  no risky deploys, reliability work prioritised
          > 100% spent        →  feature freeze until back within budget

The policy line is the one that matters. An SLO with no policy attached changes nothing, and is the most common way this whole practice fails.

Burn rate: how to alert without being paged for nothing#

Alerting on "the SLO was missed" is useless — by then it already happened. Alert on the rate you are consuming budget.

Burn rate 1 = you will spend exactly the whole budget by the end of the window. Burn rate 10 = you will spend it in a tenth of the time.

Burn rateBudget gone inResponse
128 daysNothing. This is the design
214 daysA ticket
6~5 daysInvestigate today
142 daysPage someone

What goes wrong#

MistakeWhy it failsInstead
An SLO with no policyNothing changes when you miss itWrite the "then what" before the number
Setting the SLO at 100%Removes the ability to deploy, patch or migratePick a number you can afford to miss
Measuring on the serverThe user is not on your serverMeasure at the load balancer, or from the client
Averages instead of percentilesThe average hides the users who are leavingp99, and watch p99.9
SLO = SLAYou lose the safety marginSLO tighter than the SLA, always
Too many SLOsTwenty targets are zero targetsTwo or three per user-facing journey
Alerting on budget exhaustedIt is already too lateAlert on burn rate, on two windows

Interview corner · الأسئلة اللي بتتسأل#

What is the difference between an SLI, an SLO and an SLA? · إيه الفرق بينهم؟

Measurement, target, contract — in increasing order of consequence.

  • SLI is a number: good events ÷ valid events. Missing it costs nothing because it is not a target.
  • SLO is your internal target for that number. Missing it triggers an engineering policy you agreed in advance.
  • SLA is a contract with a customer, with financial penalties.

The relationship that matters: your SLO must be tighter than your SLA, so you notice and react before the customer's lawyer does. If SLO = SLA you have no margin, and the first breach is a commercial event rather than an engineering one.

Your product manager asks for 100% uptime. What do you say? · المدير عايز ١٠٠٪ إتاحة

Do not agree, and do not simply refuse. Reframe with numbers.

  1. 100% is not purchasable. Your cloud provider will not sign it, your upstream DNS does not have it, and the marginal cost of each nine rises roughly tenfold while the marginal user benefit falls.
  2. Ask what the user actually notices. Availability of what, measured where? Checkout at the load balancer is a different number from "the whole site from every country".
  3. Offer a real target with its price. 99.9% is 43 minutes a month and affordable. 99.99% is 4.4 minutes and needs multi-AZ, automated failover and someone on call.
  4. Point out the budget is a feature. With zero allowed downtime you can never deploy, patch a CVE, or migrate a database — so a 100% target makes the service less safe over time, not more.
How would you alert on an SLO without waking people up for nothing?

Alert on burn rate, not on the SLO being missed, and use two windows together.

Missing the SLO is a lagging indicator — by the time it fires, the month is already spent. Burn rate is leading: it says how fast the budget is going.

fast window (5 min) AND slow window (1 hour) both burning hot │ │ │ reacts in minutes │ proves it is sustained, │ │ not a 30-second blip └────────────┬────────────┘ ↓ page someone
Alert onResult
Short window onlyPages on every transient blip; people stop reading alerts
Long window onlySleeps through a real outage for an hour
Both, ANDedFast and trustworthy

Then tier by severity: a high burn rate pages, a moderate one opens a ticket, and burn rate 1 does nothing at all — because burn rate 1 is exactly what the budget was designed to absorb.

Key takeaways#

  • SLI measures, SLO targets, SLA costs money. And your SLO must be tighter than your SLA.
  • An SLO with no policy attached changes nothing. Write the "then what" before you argue about the number.
  • The error budget exists to settle an argument, not to measure — it makes reliability work a mandate instead of a preference.
  • Measure where the user is, and use percentiles, not averages.
  • Set the first SLO slightly below what you already achieve. One you always miss teaches the team to ignore it.
  • Alert on burn rate over two windows, never on the budget being exhausted.
  • 100% is a category error. With no allowed downtime you can never deploy or patch, which makes the service less safe.

Last updated 2026-09-08