← all posts

SLOs That Actually Work

srereliabilityslo

Everyone knows they should have SLOs. Far fewer teams have SLOs that change how they behave. Here’s how I think about making them real.

Start with the user, not the system

A good SLO measures something a user actually feels. “CPU under 80%” is a system metric — nobody outside your team cares. “99.9% of checkout requests succeed in under 300ms” is a user experience.

Ask: what does ‘working’ mean to the person on the other end?

The three ingredients

Every SLO needs:

  1. An SLI — the thing you measure (e.g. request success rate).
  2. A target — the threshold (e.g. 99.9% over 30 days).
  3. An error budget — what’s left over (0.1% = ~43 minutes/month of allowed failure).
error_budget = 1 - SLO_target
99.9% target  →  0.1% budget  →  ~43m / 30 days
99.95% target →  0.05% budget →  ~21m / 30 days

Error budgets are the whole point

The target isn’t there to be hit perfectly — it’s there to give you a budget to spend. When there’s budget left, ship fast. When it’s exhausted, slow down and stabilize.

An SLO without an error-budget policy is just a dashboard nobody looks at.

Common mistakes

  • Too many SLOs. Start with one or two per critical journey.
  • Targets too high. 100% is a trap — it removes your budget for change.
  • No consequences. If blowing the budget changes nothing, it’s decoration.

Where to go next

Once you’ve got one working SLO with an agreed policy, expand slowly. Reliability is a practice, not a config file.

More on error-budget policies in a future post.