Skip to content
ExponaBLOG
PROMETHEUS, GRAFANA & MONITORING · DAY 091 / 100

Uptime SLAs vs SLOs: Monitoring best practices explained

Promises vs targets.

Expona Admin6 min read

Introduction

Most teams have heard the terms SLA and SLO thrown around in architecture discussions, but fewer understand the critical difference between them and why that distinction matters when you're building a monitoring and alerting strategy. Uptime SLAs vs SLOs: Monitoring best practices explained is essential knowledge for anyone responsible for keeping systems reliable. In this article, we'll clarify what each means, show you how to measure them correctly, and share the patterns that separate teams shipping confidently from those constantly firefighting.

SLAs are contractual with penalties

An SLA (Service Level Agreement) is a legal contract between you and your customers. It defines the minimum uptime or performance you promise to deliver, and it comes with real consequences if you miss it. Those consequences might be service credits, refunds, reputation damage, or even contract termination.

Let's say you're running a SaaS invoicing platform. Your SLA might state: "99.5% monthly uptime, or customers receive a 10% service credit for that month." That's binding. If you hit 99.4% uptime in March, you owe your customers a credit. The business feels this directly in revenue.

Because SLAs carry legal weight and financial exposure, they're typically conservative. They're drafted by legal and sales teams, negotiated with large customers, and built into contracts that stay in force for years. Changing an SLA requires customer agreement or contract renegotiation.

When defining your SLA, you need to know exactly how you'll measure it. This leads to arguments about what "uptime" means:

  • Does a degraded API (slow but responding) count as up or down?
  • Do all regions need to be up, or is it enough if one region serves traffic?
  • Are scheduled maintenance windows excluded from the SLA window?

These details end up in an appendix to your SLA, and they matter tremendously when calculating if you've breached the agreement.

SLOs are internal targets

An SLO (Service Level Objective) is an internal goal set by your engineering team. It's not contractual. It's your target for how reliable you want your system to be, and it guides how much toil you're willing to accept.

Using the same invoicing platform, your SLO might be 99.9% monthly uptime. That's stricter than the 99.5% SLA, but it's something you've decided is achievable with your current architecture and on-call load.

SLOs are tactical. You set them per service or per feature. A high-churn checkout flow might have a 99.95% SLO because it's revenue-critical. An internal admin dashboard might have a 95% SLO because it doesn't affect customers directly.

SLOs also guide your alerting thresholds and your incident response posture. When your SLO is breaching, you page oncall. When it's stable, you're free to deploy or refactor without fear of violating the SLA.

The key insight: SLOs are meant to break. You should run out of error budget during the month if you're pushing hard enough. If you hit your SLO every single month without incident, you've set it too high, and you're leaving money on the table by not shipping faster or taking on riskier improvements.

Set SLOs stricter than SLAs

This is the practice that separates mature teams from those that constantly scramble to meet commitments.

Your SLO should act as a buffer between reality and your contractual promise. Here's the logic:

  • You promise customers 99.5% (SLA).
  • You target 99.9% internally (SLO).
  • You build systems and alerts to stay within the 99.9% band.
  • If something goes wrong and you slip to 99.6%, you've violated your SLO but still met your SLA.
  • If the problem escalates to 99.4%, you've now breached the SLA and owe credits.

The gap between SLO and SLA is your safety margin. It's what prevents every incident from becoming a breach and a customer payout.

In practice, this margin should be sized based on how predictable your incident rate is. If you operate a stable, mature service with few surprises, a 0.4% gap is probably enough. If you're in an emerging market with volatile infrastructure or frequent deployment, you might want 1–2% gap.

Setting the SLO requires honest conversation with product and business:

  • How much operational overhead are we willing to accept (paging, toil, on-call burden)?
  • How much are we willing to spend on redundancy and failover?
  • What would it cost in reputation and churn if we breached the SLA once per quarter vs once per year?

These aren't technical questions, but they determine your SLO, which in turn determines your monitoring and alerting strategy.

Measure both from the same SLIs

An SLI (Service Level Indicator) is the actual measurement of your system's behavior. Both your SLA and your SLO are targets for the same SLI—you just have different thresholds.

Common SLIs include:

  • Availability: percentage of requests that succeed (don't return 5xx or timeout)
  • Latency: percentage of requests that complete within a target (e.g., under 200ms at p99)
  • Freshness: percentage of data that's updated within a target window (e.g., cache hits within 1 minute)
  • Durability: percentage of writes that persist (low data loss)

Let's say your SLI is: percentage of API requests that return 2xx/3xx status and complete within 500ms at p99.

Your SLA might require this SLI to stay above 99.5%. Your SLO targets 99.9%. Your alerting thresholds might page you at 99.5% for an hour (approaching the SLA boundary) and warn the team at 99.8% (approaching the SLO boundary).

The critical point: You measure the same thing for both the SLA and the SLO. You don't measure different SLIs. That's a common anti-pattern that leads to confusion. If your SLA is about latency but your SLO is about availability, you'll build the wrong alerts and miss actual SLA breaches.

In Prometheus, you might capture this with a metric like:

yaml
# Record rule: availability over 5 minutes
- record: sli:api:availability:5m
  expr: (sum rate(http_requests_total{status=~"2.."}[5m])) / (sum rate(http_requests_total[5m]))

# Recording rule: latency (p99) over 5 minutes
- record: sli:api:latency_p99:5m
  expr: histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))

Then your alerts reference these same SLIs:

yaml
- alert: SLABreach_Availability
  expr: sli:api:availability:5m < 0.995
  for: 5m
  labels:
    severity: critical
  annotations:
    summary: "API availability below SLA (99.5%)"

- alert: SLOBreach_Availability
  expr: sli:api:availability:5m < 0.999
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "API availability below SLO (99.9%)"

By using the same SLI for both, you know exactly how much headroom you have before violating your contractual obligation. Your team can make data-driven decisions about incident severity and urgency.

Common mistakes

Mistake 1: Confusing SLAs and SLOs in alerts. Teams sometimes page on-call for every SLO miss, treating it like an SLA breach. This leads to alert fatigue and burnout. Page on SLA metrics. Warn on SLO metrics. Reserve critical severity for genuine customer impact.

Mistake 2: Measuring SLOs and SLAs differently. One team measures uptime as "at least one region is up" for the SLA but "all regions responding" for the SLO. This creates confusion about whether you've breached and makes it impossible to size the safety margin correctly. Align your measurement definition across both.

Mistake 3: Setting SLOs too high. If your SLO matches your SLA or is only 0.1% higher, you have no buffer. A single bad deployment or infrastructure event will breach both. You'll spend all your time firefighting to stay compliant instead of shipping features.

Mistake 4: Ignoring error budgets. Once you have an SLO, calculate your monthly error budget: the amount of downtime you're allowed. If you're at 99.9%, your monthly budget is roughly 43 seconds of downtime. Track it. When you're burning through it, slow down deployments. When you have budget remaining, you can take on riskier changes.

Mistake 5: Not reviewing SLOs with the business. SLOs aren't purely technical. They tie directly to infrastructure spend, on-call burden, and product velocity. If the business won't fund the infrastructure for a 99.99% SLO, don't commit to it. Align with product and finance quarterly.

Key takeaways

  • SLAs are contractual promises to customers with financial and legal penalties; SLOs are internal engineering targets that guide alerting and deployment velocity.
  • Set your SLO stricter than your SLA by a safety margin (typically 0.4–2%) to prevent every incident from becoming a breach.
  • Measure both your SLA and SLO using the same SLI (Service Level Indicator) so you have a clear picture of headroom before violating commitments.
  • Use SLO alignment to drive alert thresholds: warn when approaching the SLO, page when approaching the SLA.
  • Treat SLOs as real constraints on deployments by tracking error budget and slowing down when you're near your monthly limit.
  • Review and adjust SLOs quarterly with product and finance; don't set them in a vacuum based only on technical capability.
ShareXLinkedInReddit

Found this useful? Support the writing.

Buy me a coffee
Written by
Expona Admin
Site administrator

Comments

Loading comments…

Leave a comment

Comments are reviewed before they appear. Be kind and stay on topic.

Related articles