SLOs and Error Budgets: A Practical Reliability Guide
Define user-centered SLIs and SLOs, calculate error budgets, create burn-rate alerts, set release policy, and keep reliability targets meaningful.
An SLI measures a user's experience, an SLO sets the acceptable good-event ratio over a time window, and the remaining fraction becomes an error budget the team can spend. A useful reliability program defines numerator and denominator precisely, measures at the user boundary, alerts on budget burn instead of noisy infrastructure thresholds, and links budget health to an explicit release policy.
Steps at a glance
- Identify the user and service boundary. Name the consumer, critical journeys, and measurement point closest to their experience before choosing metrics.
- Define the SLI precisely. Write good events divided by valid events, including latency or correctness criteria and explicit exclusions.
- Choose target and window. Use user impact, historical performance, and business risk to select a realistic SLO over a rolling window.
- Calculate and govern the budget. Translate the allowed bad-event fraction into requests or minutes and write the policy for spending and exhaustion.
- Alert on burn and review regularly. Use fast and slow multi-window burn alerts, inspect budget health during planning, and revisit targets when user needs or architecture change.
Key takeaways
- Measure at the user-facing boundary: availability, latency, freshness, or correctness should reflect whether a real request received acceptable service.
- Define good and valid events precisely, including exclusions, so the SLI cannot be reinterpreted during an incident.
- Choose the lowest SLO that meets user need; each extra nine costs engineering effort and removes room for safe change.
- Alert on multi-window error-budget burn so pages represent urgent user impact and slower consumption creates planned work.
- Write the budget policy before exhaustion: who may spend it, which changes pause, and what evidence restores normal release pace.
A service-level objective states how reliable a service should be from the user's point of view. It turns “the API should be highly available” into a measurable target such as “99.9% of valid checkout requests complete successfully within the latency threshold over a rolling 28-day window.”
The gap between the target and perfection is the error budget. That allowance gives teams a rational way to balance shipping and stability: spend it on change when reliability is healthy; slow down and repair the system when consumption becomes unsafe.
The three layers
Service-level indicator
An SLI is a measurement. The most useful form is a good-event ratio:
SLI = good events / valid eventsExamples:
- successful eligible HTTP requests divided by all eligible requests
- requests served under 300 ms divided by valid requests
- records available within five minutes divided by expected records
- correct responses divided by evaluated responses
Service-level objective
An SLO adds a target and time window:
99.9% of valid API requests are successful over a rolling 28 daysService-level agreement
An SLA is an external commitment, often contractual, with remedies or penalties. It should be backed by internal SLOs that are at least as strict and measured with the same semantics. Do not promise externally what the organization cannot observe internally.
Measure at the user boundary
Choose the point closest to the consumer's experience: client telemetry, edge, load balancer, gateway, or service boundary. A backend process reporting success while the gateway times out is not a good user event.
Infrastructure metrics such as CPU, memory, queue depth, and disk utilization are diagnostic signals, not SLIs. Users care that the request worked, arrived on time, returned current data, or produced the correct outcome. Host metrics help explain why the SLI is failing.
For a service with several critical journeys, define separate SLIs when their user impact and architecture differ. Read availability, write availability, search freshness, and checkout correctness should not disappear into one average.
Define good and valid events exactly
An availability SLI needs more precision than “non-500 responses.” Specify:
- measurement point
- included routes and methods
- which status codes count as good
- whether timeouts and cancellations are bad
- which client errors are excluded
- how synthetic, health-check, and internal traffic is treated
- how partial or degraded responses count
good = eligible checkout POST requests that return the accepted success status
within 1 second and create exactly one order
valid = all authenticated checkout POST requests at the edge,
excluding load tests and requests rejected before business validationNotice that correctness and latency can be part of “good.” A fast 200 with the wrong result should not improve reliability.
Write the query or recording rule beside the definition. If two engineers cannot calculate the same SLI from the same data, the specification is incomplete.
Choose an SLO from user need
Use three inputs:
- User tolerance: At what failure rate or delay does the journey become unacceptable?
- Business impact: What does a bad event cost in lost work, revenue, safety, or trust?
- Historical capability: What has the service actually sustained across releases and incidents?
Choose the lowest target that meets user and business need. Moving from 99.9% to 99.99% cuts the allowed failure by ten and often requires architectural redundancy, operational coverage, and dependency commitments that cost far more than the extra digit suggests.
If current performance is far below the desired target, publish an interim objective and a dated plan. A permanently breached SLO teaches everyone to ignore it.
Use a rolling window so the objective always reflects recent behavior. Calendar windows create cliffs where a new month appears healthy despite an incident yesterday.
Calculate the budget
For a good-event SLO:
allowed bad fraction = 1 - SLO
allowed bad events = valid events × allowed bad fractionA time-based approximation for 99.9% over 28 days is roughly forty minutes of complete unavailability, but request-based budgets are usually more faithful when traffic varies. A ten-minute outage during peak checkout and overnight maintenance should not count identically if their user impact is different.
Track remaining budget and projected exhaustion, not only current SLI. “Still above 99.9%” can hide a rapid incident that will consume the monthly allowance within an hour.
Alert on burn rate
Burn rate measures how quickly the budget is being used relative to even consumption:
burn rate = observed bad-event rate / allowed bad-event rateA burn rate of 1 would consume the budget exactly across the full window. A burn of 10 consumes it ten times faster.
Use paired windows:
- Fast burn: high multiplier across a short and supporting longer window; page immediately.
- Slow burn: lower multiplier sustained across longer windows; create a ticket or daytime response.
Requiring both windows reduces pages from brief spikes while still detecting sustained impact. Tune notification severity to how soon the budget will be exhausted, not to an arbitrary host threshold.
An alert should include the SLO, burn rate, budget remaining, affected route or slice, recent deployment, and links to diagnostic dashboards and runbooks.
Write the budget policy
The number has value only if it changes decisions. Define:
- who reviews budget health and how often
- which experiments, migrations, or launches may spend budget
- what threshold slows high-risk releases
- what happens when the budget is exhausted
- which reliability work takes priority
- who can approve an exception and when it expires
- what evidence returns the service to normal release policy
A common pattern is progressive: healthy budget allows ordinary change; rapid burn triggers incident response; low remaining budget restricts risky launches; exhaustion prioritizes reliability until the rolling window and remediation recover.
Do not use the policy to punish teams for failures. Use it to resolve the recurring argument between feature urgency and operational risk with pre-agreed evidence.
Handle dependencies and low traffic
Your service's SLO depends on databases, queues, providers, and networks, but the user-facing SLI still owns the combined outcome. Track dependency SLIs for diagnosis and negotiate contracts where necessary; do not exclude a dependency failure merely because another team operates it.
Low-traffic services can have volatile request ratios. Supplement with synthetic probes or longer windows, but keep the distinction visible. Synthetic availability proves a test path works; it does not prove every real user journey succeeds.
For batch and data systems, freshness or completion SLIs are often better than request availability. Define expected units of work and the time by which they must be correct and available.
Review the objective as the product changes
Quarterly or after a major architecture or product shift, ask:
- Does the SLI still represent the critical user experience?
- Are exclusions hiding meaningful failures?
- Is the target too easy, permanently impossible, or still appropriate?
- Do alerts predict budget exhaustion with acceptable noise?
- Has the budget policy changed release behavior?
- Are important customer or region slices hidden by the aggregate?
Do not tighten the target merely because the service happened to outperform it. Preserve engineering headroom unless user need justifies spending it.
TIP
An SLO is a decision tool, not a vanity percentage. If nobody changes a release, incident, or investment decision when the budget moves, the program is measuring without governing.
Use the SLO Definer to produce the initial spec and the Alerting Rules Tuner to convert burn thresholds into actionable alerts.
Frequently asked questions
- What is the difference between an SLI, SLO, and SLA?
- An SLI is the measurement, such as the fraction of valid requests completed successfully under a latency threshold. An SLO is the internal target for that indicator over a window. An SLA is an external commitment that may include remedies or penalties and is usually looser than the operational SLO.
- What is an error budget?
- The error budget is the failure allowance implied by an SLO. A 99.9% good-event target permits 0.1% bad events during the window. Teams use that allowance to balance feature delivery and reliability work rather than treating every imperfection as equally urgent.
- Why not set every SLO to 100%?
- A 100% target leaves no room for deployments, maintenance, experiments, dependency failures, or ordinary risk. It usually produces an impossible promise or stops useful change. Set a target from user need and business impact, then engineer enough headroom to meet it consistently.
- What is a burn-rate alert?
- Burn rate compares current bad-event consumption with the rate that would use the budget evenly across the whole window. A high burn over a short and long window signals an urgent incident; a slower sustained burn creates a ticket before the budget is exhausted.
Related
- SLO DefinerTurn a vague reliability goal into concrete SLIs, SLOs, an error budget, and burn-rate alerts — service-level indicators measured at the user-facing boundary, targets over a rolling window, and a written policy for what happens when the budget runs out. Use when a service has no defined reliability target, when on-call is noisy and alert-fatigued, or before you commit to an SLA you can't measure.
- Alerting Rules TunerCut alert noise and make every page mean something — rewrite alerting rules to fire on user-felt symptoms (error rate, latency SLO burn, failed requests) instead of causes (high CPU, full disk), with duration windows and severity routing so only urgent, actionable conditions reach a human. Use when on-call is fatigued by low-value pages, when real incidents get missed in the noise, or when alerts fire on causes rather than impact.
- Dashboard DesignerDesign a service dashboard that answers one question at a glance — is the service healthy, and if not, where's the problem? — by structuring panels around RED/USE instead of dumping every metric. Use when a service has no dashboard, when the existing one is an unreadable metric wall, or during incident-readiness prep.
- Structured Logging DesignerDesign a structured (JSON) logging strategy with a stable field schema, correlation-ID propagation, and a disciplined level policy — then migrate ad-hoc string logs toward it. Use when logs are unsearchable plain text, when debugging a request across services means grepping multiple log streams by hand, or when standing up logging for a new service.
- Distributed Tracing InstrumenterInstrument a service (or a chain of services) with OpenTelemetry so a single request can be followed end-to-end — context propagated across every hop including async/queue boundaries, spans at the boundaries that matter, deliberate trace-wide sampling, and trace_id stamped on log lines. Use when latency or failures span multiple services, when you have logs but can't reconstruct a request's full path, or when adopting OpenTelemetry.
- SRE EngineerUse this agent to make reliability measurable: SLIs/SLOs and error budgets, observability, symptom-based alerting, incident response, and capacity. Examples — defining an SLO for a checkout API, fixing a noisy pager, writing a blameless postmortem.
- Incident ResponderUse this agent during a live production incident to restore service fast and learn from it — triage and severity, mitigation-first action (roll back, fail over, shed load), change correlation, status updates, and the blameless postmortem. Examples — an alert just fired and the API is 5xx-ing, a deploy broke checkout and you need to decide rollback vs. forward-fix, latency is climbing and the pager is going off, or you're writing the postmortem the morning after.