SLA, SLO, SLI
An SLI is the number you measure, an SLO is the target you hold it to, and an SLA is the contract you pay out on if you miss. Set the SLO below the SLA, spend the gap as an error budget, and measure the SLI users actually feel — not the one that's easy to graph.
A platform team proudly published “99.99% uptime” on its status page. Six weeks later a major customer threatened to leave, citing constant errors during checkout — yet the dashboard still glowed green. The catch: the team measured availability as “the load balancer answered a TCP connection,” which stayed up the whole time. The thing customers cared about — “a checkout request returned a correct response in under a second” — had been failing 3% of the time, and nobody was watching that number. They had a target, a contract, and a metric, and all three pointed at the wrong thing. The fix was not more redundancy; it was choosing the number that means something to a user, then deciding what to promise about it.
Three words people use interchangeably and shouldn’t
These three terms get muddled constantly, and the muddle is expensive because it hides who is on the hook for what. Pin them down:
- SLI — Service Level Indicator. The number you actually measure. “The fraction of HTTP requests that returned a 2xx/3xx in under 300 ms.” It is a ratio of good events to valid events, computed from real traffic. An SLI is a fact.
- SLO — Service Level Objective. The target you hold that SLI to, internally. “99.9% of requests succeed under 300 ms, measured over 28 days.” It is a goal you set yourself. An SLO is a decision.
- SLA — Service Level Agreement. The contract with a customer that says what happens if you miss — usually a refund or service credit. “If monthly availability drops below 99.5%, you get 10% of the month’s fee back.” An SLA is a promise with money attached.
The dependency runs one way: you measure an SLI, you target an SLO, and you promise an SLA. If you don’t have a good SLI, your SLO is fiction and your SLA is a lawsuit waiting to happen. The hook’s team had all three — they just built them on an indicator (“TCP connected”) that had nothing to do with the user’s experience (“checkout worked”).
The nines, and what each one costs
When a stakeholder asks for “five nines,” do you know what you’re agreeing to build — and what it will cost? Availability is usually quoted in “nines” — the percentage of time the service is up over some window. The arithmetic of nines is unintuitive because each extra nine cuts the allowed downtime by 10×, and the absolute numbers get small fast:
availability downtime/year downtime/month downtime/day
99% (two 9s) ~3.65 days ~7.2 hours ~14.4 min
99.9% (three 9s) ~8.76 hours ~43 min ~1.44 min
99.99% (four 9s) ~52.6 min ~4.3 min ~8.6 s
99.999%(five 9s) ~5.26 min ~26 s ~0.86 sRead the month column slowly, because that is the window most SLOs use. At three nines you may be down ~43 minutes a month — one bad deploy and a rollback fits inside that. At four nines you have ~4.3 minutes — a single human paging, logging in, and reacting already blows it, so four nines effectively requires automated failover. At five nines (~26 seconds a month) no human is in the loop at all; you are paying for fully automatic detection and recovery, multi-region redundancy, and the engineering organization to run it. Each nine is roughly an order of magnitude more money and operational maturity than the last — which is why “we want five nines” from a team that deploys manually on Friday afternoons is a budget conversation, not an engineering one.
▸Why this works
Why does the cost climb so steeply per nine when the percentage barely moves (99.9% → 99.99% is “only” 0.09%)? Because availability composes by multiplication across dependencies, not addition. A request that touches the load balancer, an app server, a cache, and a database depends on all four being up: if each is independently 99.9%, the chain is 0.999⁴ ≈ 99.6% — worse than any single component. To get the whole path to four nines, every link must beat four nines, or you need redundancy so a link’s failure doesn’t fail the request. That redundancy (next lesson) is where the order-of-magnitude cost lives — you’re buying duplicate everything plus the machinery to fail over between copies faster than a human can react.
Why your SLO sits below your SLA
A reliable team never sets its internal SLO equal to the SLA it signed. It deliberately sets the SLO tighter than the SLA — promise the customer 99.5%, target yourself at 99.9%. The gap is a buffer: if you breach your internal 99.9% target, an alert fires and you have room to react before you breach the 99.5% contract and owe refunds. The SLO is the smoke detector; the SLA is the building burning down. If they were set to the same number, the first time you’d learn you were in trouble is when the money was already gone.
There’s a subtler reason too: an SLA is a legal and commercial artifact, often negotiated conservatively and slow to change. An SLO is an engineering dial you tune as you learn what’s achievable and what users actually need. Keeping them separate lets engineering tighten or loosen the target without renegotiating a contract.
The error budget: permission to spend reliability
The most useful idea in this whole area is the inverse of the SLO. If your SLO is 99.9% successful requests, then 0.1% are allowed to fail — that 0.1% is your error budget. Over a 28-day window of, say, 100 million requests, that’s 100,000 requests you may “spend” on failure before you’ve breached the objective.
This reframes reliability from “never fail” (impossible, and the wrong goal) to “stay within budget.” And the budget is a resource you get to spend, which dissolves the classic fight between product (ship features) and SRE (keep it stable). Google’s SRE practice makes this concrete: if there’s budget left, ship; if the budget is exhausted, the policy freezes risky launches and the team spends its effort on reliability until the budget refills. The number does the arguing. A team that’s been flawless all month has budget to burn on a risky migration; a team that just had an incident is in budget debt and should slow down. Crucially, consuming the budget is fine and expected — a perpetually unspent error budget often means you over-invested in reliability the users didn’t ask for and could have spent on features.
▸Common mistake
The most common SLI mistake is measuring availability from the server’s point of view instead of the user’s. “Our service returned 200s 99.99% of the time” sounds great — but it counts only the requests that reached your service. If a load-balancer misconfiguration or a DNS failure meant 5% of users never got a connection at all, those failures aren’t in your numerator or your denominator; they’re invisible. The user experienced an outage; your SLI experienced a quiet afternoon. Measure as close to the user as you can — ideally at the load balancer or via real-user monitoring — and define “valid events” as everything that should have been served, not just everything that was. The hook’s team failed exactly here: their indicator couldn’t see the failures the customer was living through.
Your SLA promises customers 99.9% monthly availability with a refund clause. Where should you set your internal SLO, and why?
A request path traverses four independent components in series, each with 99.9% availability. What is the availability of the whole path, and what does it imply?
If your SLO is 99.9% of requests succeeding, the 0.1% you're allowed to fail is your _______ — a resource you may spend on risky launches when it's full, and which freezes new risk when it's exhausted.
- 01Define SLI, SLO, and SLA, and state the relationship between them.
- 02What is an error budget and how does it change how a team operates?
- 03Why does each additional nine cost roughly an order of magnitude more?
Three words that get blurred and shouldn’t: an SLI is the number you measure (a good-events-over-valid-events ratio, like “requests served correctly under 300 ms”), an SLO is the internal target you hold it to (“99.9% over 28 days”), and an SLA is the customer contract with penalties for missing it. The dependency is one-directional — measure the SLI, target the SLO, promise the SLA — and you deliberately set the SLO tighter than the SLA so an internal breach is an early warning, not an instant refund. The nines quantify the stakes: each extra nine cuts monthly downtime ~10× (43 min → 4.3 min → 26 s) and costs roughly an order of magnitude more, because availability multiplies across dependencies and you buy redundancy plus automated failover to compensate. The most powerful idea is the error budget (100% − SLO): reliability becomes a resource you spend — ship while it lasts, slow down when it’s gone — which replaces the feature-vs-stability argument with arithmetic. And the foundation under all of it is choosing an SLI that reflects what a user feels, measured as close to the user as possible — get that wrong, like the hook’s team, and the other two numbers are confidently measuring nothing. Now when you see an SLA clause in a vendor contract or a “99.99% uptime” claim on a status page, ask first: what is the SLI behind it, and does it measure what the user actually experiences?
Practice
Start at the top. Tasks go easiest → hardest: recall a fact, apply it to a case, then a senior-level stretch. Open one, attempt it, then reveal.
Something unclear?
Ask a question about this lesson. Questions are anonymous and go straight to the author to make the lesson better.