SLI, SLO, and SLA Explained
A team sets an internal reliability target of 99.9% and signs a customer contract promising 99.5% — and a new engineer immediately asks why the numbers don't match, assuming one of them is a mistake. Neither is. The gap between them is deliberate: it's the buffer that lets you catch and fix a reliability problem internally before it ever becomes a contractual breach with a customer.
This guide defines the three terms precisely — the metric you measure, the internal target you hold yourself to, and the external promise you make — then covers the mechanism that turns a target into an operational decision: the error budget, and the alerting technique built on top of it, multi-window burn-rate alerting, which catches a fast-moving incident in minutes without paging on every minor blip. For the user-facing indicators behind availability specifically, see Availability vs Reliability vs Durability.
SLI: The Metric You Actually Measure
A Service Level Indicator is a precisely defined, measured ratio: good events divided by valid events, over some window. "Proportion of HTTP requests that returned a non-5xx status within 300ms, out of all requests excluding health checks" is an SLI; "the API is fast" is not, because nothing about it is measured or falsifiable. Common SLIs are request success ratio, a latency percentile against a threshold, and (for pipelines) proportion of records processed within a freshness window.
The precision matters because every later number — the SLO target, the error budget, the alert threshold — is built directly on top of exactly how the SLI is defined. Change what counts as a "valid" request (excluding retries, excluding a specific low-traffic endpoint) and every number downstream silently means something different, even if the SLO percentage itself never changes.
Quick reference
- An SLI is a ratio: good events / valid events, over a defined window — not a vague quality description.
- Common SLIs: request success ratio, latency percentile vs threshold, freshness/lag for pipelines.
- Precisely define what counts as 'valid' (excluded traffic, retries, specific endpoints) — this silently shapes every downstream number.
- Measure from the client's actual experience where possible — a server-side-only SLI can look healthy while real users see failures a load balancer already retried away.
- One service can have multiple SLIs (availability, latency, freshness) each with its own SLO — there is no requirement to compress reliability into one number.
- Measuring an SLI accurately depends on the same metrics, logs, and traces pipeline covered in Observability: Logs, Metrics, and Traces.
Remember this
An SLI is only as meaningful as its precise definition of 'good' and 'valid' — the same percentage means a different reliability claim depending on what traffic that ratio actually includes.
SLO vs SLA: Why the Internal Target Is Tighter on Purpose
A Service Level Objective is an internal target for an SLI over a time window — "99.9% of requests succeed over a rolling 30 days." It's the number engineering holds itself to, drives alerting off of, and uses to decide whether to ship a risky change this week. A Service Level Agreement is an external, often contractual promise to customers, typically with a defined remedy (service credits, refunds) if breached.
The SLA is deliberately set looser than the SLO — a common pattern is an SLO of 99.9% paired with an SLA of 99.5%. That gap is a buffer: the internal target is designed to catch a reliability problem and trigger a response before the looser, customer-facing contractual promise is ever at risk. If your SLO and SLA were the same number, you'd have zero warning between "we're trending toward missing our own internal goal" and "we owe customers a contractual remedy." Setting them equal isn't stricter — it just deletes your own early-warning system.
Quick reference
- SLI = the measured ratio. SLO = the internal target for that ratio. SLA = the external, often contractual promise.
- SLA is deliberately looser than SLO — the gap is a deliberate early-warning buffer, not a discrepancy to fix.
- An SLA typically names a remedy (credits, refunds) for breach; an SLO's 'penalty' for missing it is internal (a feature freeze, a postmortem).
- Setting SLO and SLA to the same number removes your own warning margin — it looks stricter but is actually a worse safety design.
- Marketing or sales promising a number that was never validated as an achievable SLO is a common, entirely avoidable source of SLA breaches.
Remember this
The SLO is deliberately tighter than the SLA so a real reliability problem trips your own internal alarm well before it becomes a customer-facing contractual breach — the gap is the design, not a discrepancy.
Error Budgets: Reliability as a Spendable Resource
An error budget is simply 1 - SLO target, converted into concrete terms: a 99.9% SLO over 30 days leaves a 0.1% error budget, which works out to roughly 43 minutes of acceptable downtime (or equivalent failed requests) for that entire month. That budget is a resource a team can deliberately spend — shipping a riskier change, running a chaotic load test in production, taking a planned maintenance window — as long as the spend fits inside what's left.
The operational payoff is that error budgets turn "reliability vs feature velocity" from a recurring argument into a quantified, pre-agreed trade-off: while budget remains, ship at normal velocity; once it's exhausted for the current window, the team's default shifts to freezing new feature launches and prioritizing reliability work until the budget recovers. Nobody needs to personally decide whether the current risk is acceptable — the budget already encodes that decision in advance.
Quick reference
- Error budget = 1 - SLO target, expressed as concrete acceptable downtime/failure for the window.
- Spending the budget deliberately (risky launches, chaos testing, maintenance) is the intended use, not a failure.
- Budget exhaustion has a pre-agreed default response — usually a feature freeze until the rolling window recovers — decided before the incident, not during it.
- A rolling window (not a fixed calendar month) means budget recovers continuously as old bad minutes age out of the window.
- Multiple teams sharing one dependency should agree who 'owns' spending that shared budget before an incident forces the conversation.
Remember this
An error budget converts 'how much unreliability is acceptable' into a concrete, spendable number agreed on in advance — so a launch-freeze decision during an incident is a pre-agreed policy, not an argument.
Burn-Rate Alerting: Catching a Budget Emergency Before It's Gone
A naive alert ("page if error rate exceeds 1% for 5 minutes") either fires on harmless short blips or misses a real problem that's slower and steadier than its threshold. Burn rate reframes this around the budget itself: a burn rate of 1x means the current error rate would exhaust the entire window's budget exactly by the end of the window if it continued unchanged; a burn rate of 10x means the same budget would be gone in a tenth of the time.
Multi-window, multi-burn-rate alerting (from Google's SRE practice) checks a fast burn over a short window (catching a severe incident within minutes) and a slow burn over a longer window (catching a steady, less dramatic degradation that a short window alone would miss or that would otherwise page too often on noise) simultaneously. A common pairing: page immediately if the 1-hour window shows a burn rate that would exhaust the 30-day budget in about 2 days, and separately page (at lower urgency) if a 6-hour window shows a burn rate that would exhaust it in about a week — catching both the dramatic and the slow-boil failure, each without needing the other window's threshold to be tripped.
Quick reference
- Burn rate 1x = current error rate would exactly exhaust the window's budget by window's end if sustained.
- A short window (e.g. 1 hour) at a high burn-rate threshold catches fast, severe incidents within minutes.
- A longer window (e.g. 6 hours) at a lower burn-rate threshold catches slow, steady degradations a short window would miss.
- Running both windows simultaneously, each with its own threshold, is what avoids both 'paged too late' and 'paged on every blip.'
- The alert threshold is derived from the error budget itself, not picked arbitrarily — a burn-rate alert is a direct consequence of the SLO you already committed to.
Remember this
Multi-window burn-rate alerting pages on how fast the error budget is actually being consumed — a short window catches a severe fast incident, a longer window catches a slow steady one, and neither needs an arbitrarily-chosen error-rate threshold.
Key takeaway
An SLI is the precisely measured ratio; an SLO is the internal target built on it; an SLA is the looser, often contractual external promise — the SLO is deliberately tighter than the SLA so real problems trip your own alarm before they become customer-facing breaches. An error budget turns the SLO into a concrete, spendable resource that resolves the reliability-vs-velocity trade-off in advance. Burn-rate alerting pages on how fast that budget is actually disappearing, catching both fast and slow incidents without an arbitrary threshold.
Practice (25 min): define one SLI precisely (good/valid event definition included) for a service you know, set a 99.9% SLO over a rolling 30-day window, and compute the exact error-budget minutes. Design a two-window burn-rate alert (e.g., 1-hour fast window, 6-hour slow window) and calculate the burn-rate threshold each should page at. Simulate a 10% error rate for 20 minutes and confirm your fast window would have paged; simulate a steady 0.5% error rate for 5 hours and confirm your slow window — not the fast one — would have caught it. Pass when you can state, for your own service, the exact remaining error-budget minutes right now.
Related Articles
Explore this topic