The Ops Atlas xOps School

Reliability Established term Sources verified

SRE (Site Reliability Engineering)

Site Reliability Engineering (SRE) runs production services as a software-engineering problem: it sets explicit reliability targets (SLOs) from users' experience and uses the remaining error budget to decide how fast to ship and when to stop and fix.

Key takeaways

  • An SLO turns 'be reliable' into a number users would notice; 100% is the wrong target for almost every service.
  • The error budget (1 − SLO) is a release-pace control, and it only works if a signed policy says what happens when it runs out.
  • Measure SLIs as good events ÷ valid events, as close to the user as you can afford, and alert on burn rate rather than causes.
  • Toil is capped (Google's published target: under 50% of SRE time), and the cap needs teeth such as handing work back.
  • Blameless postmortems are how a reliability budget turns into learning, not punishment.
  • You can practise SRE without an SRE team; renaming an ops team 'SRE' without these mechanisms changes nothing.

Site Reliability Engineering (SRE) is a way of running production services that treats operations as a software-engineering problem. It sets explicit reliability targets, called service level objectives (SLOs), based on what users experience. It measures how much unreliability is still acceptable (the error budget) and uses that budget to decide how fast to ship and when to stop and fix. It also caps repetitive manual work so engineers have time to automate it away.

Ben Treynor Sloss, who founded Google’s SRE organisation, put it in one line: “SRE is what happens when you ask a software engineer to design an operations team.”[1] Developers want to ship and operators want stability; SRE gives both one agreed number, such as “99.9% of checkout requests succeed over four weeks”. Above target, teams ship. Below it, the agreed policy shifts effort to reliability, and nobody wins the argument by authority.

For beginners (vocabulary), engineers (SLOs and alerts), architects (dependencies) and managers (policies). Research verified 2026-10-16; selected sources re-checked 2026-10-17.

Question Answer
Goal Reliability that matches what users need, at the lowest cost in engineering time and lost velocity
Core mechanism SLI → SLO → error budget → error-budget policy, reviewed on a fixed cadence
Who practises it SREs, service owners, developers on call, platform engineers, engineering managers
Scope on this page SLO design, error budgets and policies, burn-rate alerting, toil, postmortem culture, on-call load, capacity and release-engineering principles
Prerequisites Basic Linux and networking, one programming language, the DevOps page
Key outputs An SLO document, an error-budget policy, burn-rate alerts, a toil log, postmortems, a readiness checklist
Term status Established: Google’s books (2016, 2018), a USENIX conference since 2014, a long-running practitioner survey (evidence below)

Without explicit targets, reliability is negotiated by mood: expectations ratchet towards “never fail” after each outage, release pace slows, and the people on call absorb whatever cannot be automated. The SRE book locates the root conflict “between pace of innovation and product stability” and argues that an error budget “resolves the structural conflict of incentives between development and SRE”.[1] Three failure modes are common before SRE practices exist:

  1. Unbounded targets. Nobody can say how reliable is enough, so every outage justifies more process. The book’s counterpoint: “100% is the wrong reliability target for basically everything”,[1] and an incremental improvement “may cost 100x more than the previous increment”.[2]
  2. Alerting on causes. Pages fire on CPU, disk and queue depth that users never notice, so engineers learn to ignore pages.
  3. Toil that grows with the service. Manual work scales with traffic; nothing improves and people burn out.

Before and after (illustrative)

Before After
“Checkout must never go down” “99.9% of valid checkout requests succeed over a rolling four weeks; the 0.1% that may fail is the budget”
Release freeze after every incident, decided by whoever is most senior Releases halt only when the budget is spent, under a policy signed in advance
40 alert rules on resources 2 burn-rate page alerts per SLO; tickets for slower burns
Postmortems hunt for the person who pushed the change Postmortems hunt for the conditions that let a normal change cause harm
  • Not a renamed operations team. If engineers get the title and nothing else changes (no SLOs, no toil cap, no power to hand work back), the result is what DevOps Topologies calls the “Fake SRE” anti-type: a dev–ops silo “but 10 years later”.[3]
  • Not “maximum reliability”. SRE deliberately spends reliability. Google ran planned outages of its global Chubby lock service so that it met, “but does not significantly exceed”, its SLO, flushing out dependants that assumed it never failed.[4]
  • Not monitoring or incident management. Monitoring supplies data and incident management coordinates people; SRE decides what “good enough” means and what happens when it is not met (ObservabilityOps, IncidentOps).
  • Not hardware reliability engineering, the older discipline of component failure rates and MTBF predictions.

Naming confusion. “SRE” names a discipline (this page), a role and a team; you can adopt the discipline without the other two. Despite “site”, it applies to any production service, including APIs, data pipelines and internal platforms.

Year Milestone Source
2003 Ben Treynor Sloss, founder of Google SRE, joins Google to run a “Production Team” of seven engineers SRE book[1]
2014 USENIX holds “the inaugural SREcon14” (30 May, Santa Clara); by 2026 SREcon runs as separate Americas and EMEA events Archived USENIX pages[5][6]
2016 Site Reliability Engineering: How Google Runs Production Systems (O’Reilly), free to read online sre.google[7]
2016 Google announces Customer Reliability Engineering (CRE): SRE principles applied to cloud customers Google Cloud blog[8]
2017 “The Calculus of Service Availability” (ACM Queue) formalises the dependency maths Treynor, Dahlin, Rau and Beyer[9]
2018 The Site Reliability Workbook adds implementation detail and other companies’ case studies sre.google[7]
2019 Google Cloud publishes six common ways to organise SRE teams Franco and Brown[10]
2021 DORA expands “availability” to “reliability” as a measure of operational performance DORA[11]
2026 (13 Oct.) Google announces a “completely rewritten” second edition covering cloud reliability and the impact of AI; sold, not free online Google Cloud blog; sre.google[12][7]

Two cautions. Much of the canon describes Google’s scale; when not to use says what to drop at small scale. And this page cites the free first edition and the workbook; the second edition was not read for it and may update specific numbers (its announced direction is in advanced topics).

Evidence for the term status. Google’s books define the practices in detail,[1][13] Google Cloud documents several team implementations,[10] USENIX has run SREcon since 2014,[5] and Catchpoint’s SRE Report, a vendor survey in its eighth year, drew 418 responses from reliability, DevOps and IT professionals for its 2026 edition (survey run July–August 2025).[14]

Mental model: reliability is a budget, not a feeling. Pick what users care about (SLI), agree how often it may fail (SLO), and spend the allowed failures on change. When the budget is gone, invest in reliability. Alerting, toil limits, postmortems and readiness reviews protect that budget or give engineers time to defend it.

Term Meaning Example
SLI (service level indicator) “a carefully defined quantitative measure of some aspect of the level of service that is provided”;[4] usually a ratio of good to total events (this page writes valid, see Practice 1) Share of checkout requests without a 5xx
SLO (service level objective) “a target value or range of values for a service level that is measured by an SLI”[4] 99.9% over a rolling 28 days
SLA (service level agreement) A contract with users “that includes consequences of meeting (or missing)” its SLOs;[4] see ServiceOps Service credits below 99.5% a month
Error budget 1 − SLO, as bad events (or minutes) allowed in the window[15] 0.1% of 50 million = 50,000
Error-budget policy Agreed actions when the budget is spent, with an escalation path[13] Halt releases except P0 and security fixes
Burn rate “how fast, relative to the SLO, the service consumes the error budget”[16] 1 spends exactly the budget over the window
Toil Production work that is manual, repetitive, automatable, tactical, without enduring value, and that grows with the service[17] Resizing disks by hand for each new customer
PRR (production readiness review) A review that “identifies the reliability needs of a service based on its specific details”[18] Monitoring, capacity, rollback checks
Postmortem A blameless written record of an incident, its impact, contributing causes and actions[19] Template in IncidentOps
Canary “a partial and time-limited deployment of a change in a service and its evaluation”[20] 5% of traffic for one hour
Critical dependency A dependency whose malfunction causes a corresponding malfunction in the service[9] The payment gateway behind checkout
P0 The workbook’s top bug priority: “all hands on deck; drop everything else until this is fixed”[21] A P0 action after a budget-heavy incident
Tier-1 service This page’s shorthand for a service whose failure users or revenue feel at once (tiers are local conventions) Checkout, sign-in
N + 2 Redundancy that still serves the load with two components down, for example one region in maintenance and one failed[22] Three replicas, each able to carry the peak

The workbook puts the DevOps relationship in programming terms: “class SRE implements interface DevOps”. DevOps is a broader philosophy, “relatively silent on how to run operations at a detailed level”; SRE is a concrete, opinionated implementation.[23] Each line below is an editorial distinction (a split chosen so that each topic is taught once), not an industry standard.

Neighbour Shared ground What SRE owns here What the neighbour owns
DevOps Shared ownership, automation, blameless learning Reliability targets and the error-budget control Delivery culture, CI/CD, DORA’s five delivery metrics[11]
IncidentOps Outages, on-call, postmortems Postmortem culture, on-call load limits, SLO-based paging Incident roles, communications, MTTA/MTTR caveats, postmortem template, action tracking
ObservabilityOps Metrics, dashboards, alerts Which SLIs matter and how to alert on them Telemetry pipelines, OpenTelemetry, cardinality, RED/USE
ServiceOps Service levels SLO engineering Service catalog, ownership model, SLAs and internal operational level agreements (OLAs)
PlatformOps Platform reliability The SLO method Platform SLOs as a product commitment, golden paths
AppOps Resilience Targets and budgets Timeouts, retries, circuit breakers in the code
ReleaseOps Safe change Canarying as budget protection Release strategy, feature flags, progressive delivery
AutomationOps Toil reduction Measuring and capping toil Safety and governance of the automation itself
DisasterRecoveryOps, BackupOps Recovering from failure Everyday reliability RTO, RPO, DR invocation, restores
AIOps Reducing alert noise SLO-based alerting as the baseline ML correlation of events
Figure 1. Where SRE sits: what this page owns and what it hands off
implemented bytelemetrySLO methodtargetsSLOs under SLAsroles, commsRTO, RPODevOpsObservabilityOpsSRE: SLOs, budgets, toilPlatformOpsAppOpsServiceOpsIncidentOpsDR and backup
Diagram source (Mermaid)
flowchart LR
  DEV["DevOps"]
  OBS["ObservabilityOps"]
  SRE["SRE: SLOs, budgets, toil"]
  PLAT["PlatformOps"]
  APP["AppOps"]
  SVC["ServiceOps"]
  INC["IncidentOps"]
  DR["DR and backup"]
  DEV -- "implemented by" --> SRE
  OBS -- "telemetry" --> SRE
  SRE -- "SLO method" --> PLAT
  SRE -- "targets" --> APP
  SRE -- "SLOs under SLAs" --> SVC
  SRE -- "roles, comms" --> INC
  SRE -- "RTO, RPO" --> DR
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  class SRE core
  class DEV,PLAT,APP,INC,OBS,SVC,DR neutral

Text equivalent: SRE sits in the middle and every arrow is labelled. From the left, DevOps is the philosophy SRE implements, and ObservabilityOps supplies the telemetry for SLIs. From SRE, PlatformOps takes the SLO method, AppOps builds resilience to meet the targets, ServiceOps sets SLAs that sit above the SLOs, and incident roles and communications (IncidentOps) and recovery objectives (disaster recovery and backup) are handed off.

Published principles (what Google’s books say)

Link to section “Published principles (what Google’s books say)”

Responsibilities. “An SRE team is responsible for the availability, latency, performance, efficiency, change management, monitoring, emergency response, and capacity planning of their service(s)”; its tenets start with a durable focus on engineering (the 50% cap on operational work) and maximum change velocity without violating the SLO.[1]

Principles (workbook). Operations is a software problem; manage by SLOs; work to minimise toil; automate this year’s job away; move fast by reducing the cost of failure; share ownership with developers; use the same tooling regardless of job title.[23] Both lists are Google’s guidance, not a formal standard.

This Atlas’s proposed charter (a proposal, not an industry standard)

Link to section “This Atlas’s proposed charter (a proposal, not an industry standard)”

A synthesis to copy into a team charter and argue about.

  1. Mission. Keep each service as reliable as its users need, and no more, at the lowest cost in toil and lost velocity.
  2. Users define reliability. SLIs measure user-visible outcomes, not component health.
  3. Targets are explicit and agreed. Every tier-1 service has an SLO document approved by product, developers and on-call.
  4. The budget has consequences. A policy signed in advance says what happens when the budget runs out and who decides disputes.
  5. Engineering time is protected. Toil is measured. Above the cap, work is redirected rather than absorbed.
  6. Failure is information. Postmortems are blameless and their actions are prioritised like features.
  7. Shared ownership is conditional. SRE support depends on developers keeping their commitments; the last lever is handing the pager back.

Non-goals. 100% availability; SRE as the gatekeeper of every release; owning incident communications or the telemetry platform.

Roles. A service owner (usually a product engineering lead) owns the SLO and the code; a product manager agrees it is good enough for users; SREs design SLIs, alerting, capacity and automation, and share or carry the pager; an engineering director or CTO arbitrates disputes (the workbook’s example escalates to the CTO).[21] Google hires SREs as 50–60% software engineers and 40–50% near-qualified candidates with rarer skills, most often UNIX internals and networking.[1]

Team models. Google Cloud’s Customer Reliability Engineers describe six implementations and stress that the list is not exhaustive; Google’s own SRE organisation has every type except the kitchen sink.[10]

Model Best fit (per the source) Main risk
Kitchen sink A company with a couple of applications and user journeys Unbounded scope as the company grows
Infrastructure Several development teams on shared clusters, CI/CD and networking No customer contact; business-wide blast radius
Tools Reliability tooling not available as open source or SaaS Drifting into infrastructure; rising toil
Product/application A second or later team, after a kitchen-sink, infrastructure or tools team, for a key user-facing application Duplicated infrastructure; diverging practices
Embedded Starting an SRE function, or scaling another model Little standardisation
Consulting Large organisations whose demand has outgrown existing SRE teams Consultants lack context

RACI for core SRE activities (R responsible, A accountable, C consulted, I informed); a starting point, not a standard.

Activity Service owner Product manager SRE Dev team Exec sponsor
Choose SLIs A C R C I
Set SLO targets A R C C I
Sign the error-budget policy R R R C A
Implement SLO monitoring and burn-rate alerts C I R/A C —
Invoke the policy (halt, then work mix by cause) A C R C I
Decide a disputed calculation or action C C C C A
Production readiness review C I R/A R —
Postmortem for a policy-triggering incident A I R R I
Toil measurement and reduction C — R/A C I

A production readiness review (PRR) is the typical first step before SRE takes on a service: engagement, analysis against a checklist, improvements, training, onboarding and continuous improvement. The checklist covers architecture and dependencies, monitoring, emergency response, capacity, change management and performance. Two later models are early engagement in design, and frameworks that make new services reliable by default.[18]

The relationship is conditional. Introducing Google’s CRE team, Dave Rensin described the deal: developers maintain critical support systems such as monitoring and take part in reviews and postmortems; if they do not, the SREs “offboard” the system and hand back the pagers.[8]

Figure 2. Lifecycle of an SRE engagement, from readiness review to hand-back
new service launchesreliability needs growgaps foundre-checkchecklist metSLOs met, toil under capcommitments broken, pagerhanded backcontinuous improvementDevelopers on callReadiness review (PRR)Joint improvementsSRE onboardedSteady state
Diagram source (Mermaid)
stateDiagram-v2
  direction TB
  state "Developers on call" as DevOwned
  state "Readiness review (PRR)" as PRR
  state "Joint improvements" as Improve
  state "SRE onboarded" as Onboarded
  state "Steady state" as Steady
  [*] --> DevOwned: new service launches
  DevOwned --> PRR: reliability needs grow
  PRR --> Improve: gaps found
  Improve --> PRR: re-check
  PRR --> Onboarded: checklist met
  Onboarded --> Steady: SLOs met, toil under cap
  Steady --> DevOwned: commitments broken, pager handed back
  Steady --> Steady: continuous improvement

Text equivalent: a new service starts with its developers on call. When its reliability needs grow, it enters a readiness review; gaps lead to joint improvements and a re-check. Once the checklist is met, SRE onboards the service, which reaches a steady state (SLOs met, toil under the cap) and keeps improving. If the developers break their commitments, the pager goes back to them.

The operating model is a set of feedback loops; the cadences are this Atlas’s suggestion. The workbook suggests reviewing SLO documents monthly at first and quarterly later.[13]

Loop Cadence Input Decision Owner
Burn-rate alerting Continuous Error ratios over paired windows Page, ticket, or nothing On-call
Budget review Weekly Budget left, top consumers Reliability work for the next sprint Service owner + SRE
Policy checkpoint Monthly Trailing four-week budget Invoke the policy; record cause and work mix Service owner; exec sponsor on escalation
SLO review Quarterly (monthly while new) Tickets, user research, coverage gaps Change the SLI, target or window Product manager + service owner
Toil review Each sprint or month Toil log Automation backlog; hand work back SRE lead
Readiness review Before onboarding or major launches PRR checklist Accept, accept with conditions, decline SRE lead

Escalation. Put a named role, not a committee, at the top of the policy, as the workbook’s example does with the CTO.[21] Record every invocation, the cause assigned and any escalated decision: an auditor or a new manager will ask for them first.

Architecture and workflow: the reliability control loop

Link to section “Architecture and workflow: the reliability control loop”

SRE’s architecture is a control loop, not a product stack: it turns user experience into a number, compares it with a target, and feeds the result back into engineering decisions. Tools named are examples; the tooling landscape lists others.

Figure 3. Reference architecture: from measurement points to policy decisions
Measurement points (closest to the user first)generatesClient instrumentationSynthetic proberLoad balancer logsService metricsSLO spec in Git (OpenSLO orSloth)Metrics store, e.g.PrometheusRecording rules: error ratioper windowBurn-rate alerts: page orticketSLO dashboard and budgetreportOn-call engineerWeekly and monthly budgetreviewError-budget policy decision
Diagram source (Mermaid)
flowchart TB
  subgraph Points["Measurement points (closest to the user first)"]
    RUM["Client instrumentation"]
    PROBE["Synthetic prober"]
    LB["Load balancer logs"]
    APPM["Service metrics"]
  end
  SPEC["SLO spec in Git (OpenSLO or Sloth)"]
  TSDB["Metrics store, e.g. Prometheus"]
  REC["Recording rules: error ratio per window"]
  ALERT["Burn-rate alerts: page or ticket"]
  DASH["SLO dashboard and budget report"]
  ONCALL["On-call engineer"]
  REVIEW["Weekly and monthly budget review"]
  POLICY["Error-budget policy decision"]
  RUM --> TSDB
  PROBE --> TSDB
  LB --> TSDB
  APPM --> TSDB
  SPEC -- "generates" --> REC
  TSDB --> REC
  REC --> ALERT
  REC --> DASH
  ALERT --> ONCALL
  DASH --> REVIEW
  REVIEW --> POLICY
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  class REC,ALERT,DASH core
  class POLICY decision
  class RUM,PROBE,LB,APPM,SPEC,TSDB,ONCALL,REVIEW neutral

Text equivalent: four measurement points (client instrumentation, synthetic probers, load balancer logs, service metrics) feed a metrics store. An SLO spec in Git generates recording rules that compute error ratios per window. These feed burn-rate alerts, which page or ticket the on-call engineer, and an SLO dashboard and budget report, which feed weekly and monthly reviews that end in an error-budget policy decision.

Building blocks: components and trade-offs

Link to section “Building blocks: components and trade-offs”
Component Responsibility Design choice and trade-off
Measurement point Produce good and valid event counts Server logs miss requests that never arrive; probers miss problems that affect some users; client instrumentation is closest to users but needs code[13]
SLO spec Single source of truth for SLIs, targets and windows Specs in Git are reviewed and versioned; a UI-only SLO drifts from the alerts
Recording rules Pre-compute ratios per window Sum numerators and denominators before dividing: averaging ratios “is not statistically valid”[24]
Burn-rate alerts Notify humans when the budget is at risk Paired long and short windows trade detection time against reset time[16]
Dashboard and report Show compliance, budget and trends A trending view, separate from alerting
Policy Turn numbers into action Without it, the rest is a reporting project

Trust boundaries. The SLO pipeline only reads production, but the policy decision governs releases. Keep the out-of-scope exclusion in the code-reviewed spec, not an ad hoc query, or whoever edits the query quietly decides whether a halt applies.

End-to-end workflow: from user pain to a policy decision

Link to section “End-to-end workflow: from user pain to a policy decision”

Trigger: a burn-rate alert or the scheduled budget review. Actors: on-call engineer, service owner, SRE, product manager, escalation owner. Outputs: a release halt with a recorded cause and work mix, reliability work, a postmortem where required. Feedback: the next budget review checks whether the actions restored compliance.

Figure 4. Error-budget policy workflow: the halt does not depend on the cause; the work mix does
NoYesOurs to fixOutside the teamDisputedNoYesBudget review or burn-ratealertBudget exhausted overtrailing 4 weeks?Normal release paceHalt changes and releasesexcept P0 and security fixesWhat caused the miss?Must work on reliability: ownbug or process, a harddependency to soften, a missthe SLI hidMay keep building features,unreleased: network-widefault, frozen dependency,out-of-scope usersNamed exec decides thecalculation or the actionsBack within SLO?
Diagram source (Mermaid)
flowchart TB
  T["Budget review or burn-rate alert"] --> Q1{"Budget exhausted over trailing 4 weeks?"}
  Q1 -- "No" --> N["Normal release pace"]
  Q1 -- "Yes" --> H["Halt changes and releases except P0 and security fixes"]
  H --> Q2{"What caused the miss?"}
  Q2 -- "Ours to fix" --> RW["Must work on reliability: own bug or process, a hard dependency to soften, a miss the SLI hid"]
  Q2 -- "Outside the team" --> FW["May keep building features, unreleased: network-wide fault, frozen dependency, out-of-scope users"]
  Q2 -- "Disputed" --> E["Named exec decides the calculation or the actions"]
  E --> RW
  E --> FW
  RW --> Q3{"Back within SLO?"}
  FW --> Q3
  Q3 -- "No" --> H
  Q3 -- "Yes" --> N
  classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
  classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  class Q1,Q2,Q3 decision
  class H risk
  class N,RW,FW,E core

Text equivalent: is the budget exhausted over the trailing four weeks? If not, releases continue normally. If it is, all changes and releases halt except P0 and security fixes, whatever the cause. The cause then decides the work: causes the team can fix mean mandatory reliability work; causes outside the team let it keep building features without releasing them; disputes go to a named executive. The halt lasts until the service is back within its SLO.

This flow follows the workbook’s example policy, which has two tiers.[21] First, if the service has exceeded its budget for the preceding four weeks, the team will “halt all changes and releases other than P0 issues or security fixes until the service is back within its SLO”; no cause exempts it. Second, the cause decides the work. The team must work on reliability after its own code bug or procedural error, when a postmortem reveals a hard dependency that could be softened, or when miscategorised errors hid a miss. It may continue feature work after a company-wide network problem, an outage in another team’s service whose owners have frozen their own releases, budget use by out-of-scope users (load tests, penetration testers), or miscategorised errors that affected no users. The last two are measurement errors: fix the SLI in the reviewed spec, recompute, and send disputes about the calculation to the named executive (the CTO in the example). Two triggers do not wait for exhaustion: a single incident consuming more than 20% of the four-week budget requires a postmortem with at least one P0 action, and a class of outage consuming more than 20% in a quarter requires a P0 item in quarterly planning. The policy “is not intended to serve as a punishment for missing SLOs”.[21]

Start from user journeys (search, add to basket, pay), not from the metrics you already have, and ask what “it worked” means to the user; Google calls these critical user journeys (CUJs).[25] Then write two things, as the workbook recommends:[13]

  • an SLI specification: the outcome that matters to users, independent of measurement (“ratio of home-page requests that loaded in under 100 ms”);
  • an SLI implementation: the specification plus a way to measure it (server or load-balancer logs, a prober, client code).

The workbook recommends expressing an SLI as good events divided by total events, so that it runs from 0% (nothing works) to 100% (nothing is broken).[13] This page writes good events ÷ valid events to make exclusions such as load tests explicit. The shape makes budgets, burn rates and alerts uniform across services.

System type SLIs that usually matter Source
Request-driven (APIs, web) Availability, latency, quality (degraded answers) Workbook SLI menu[13]
Pipelines and batch Freshness, correctness, coverage Workbook SLI menu[13]
Storage Durability, plus latency and availability Workbook; SRE book[13][4]
Every system Correctness SRE book[4]

Decisions inside “valid” and “good”, where SLOs quietly go wrong:

  • Which responses are bad? Server errors (5xx) almost always count; client errors (4xx) usually do not. A 429 depends on why it was sent. Shedding overload, or refusing a client that is within its quota, is your service failing; refusing a client that exceeded its own quota is correct enforcement, like a declined card. Sloth’s getting-started example counts 5xx and 429 as errors without giving a reason.[26] Use one rule in every spec, alert, dashboard and runbook query.
  • Which requests are valid? Exclude load tests, penetration tests and health checks in the reviewed spec. The workbook’s example policy lets feature work continue when out-of-scope users consumed the budget;[21] excluding them up front avoids the argument.
  • Latency as a ratio, not an average. Use “the proportion of requests faster than X”; the SRE book prefers percentiles to the mean, which hides the slow tail.[4] Prometheus classic histograms need a bucket boundary at exactly X. Native histograms answer with histogram_fraction, an interpolated estimate the documentation calls “quite accurate” at decent resolution, and Prometheus recommends them where you can use them (as of October 2026).[27]
  • Successful versus failed latency. The SRE book warns to distinguish the latency of successful and failed requests.[28] A fast error is not a good event: count it as bad in the availability SLI and filter it out of the latency SLI.

The four golden signals (latency, traffic, errors, saturation) are a good starting set for telemetry,[28] but traffic and saturation explain why an SLI moved; they rarely describe user happiness on their own.

Practice 2: setting SLO targets and windows

Link to section “Practice 2: setting SLO targets and windows”

The SRE book’s rules of thumb: don’t pick a target based on current performance, keep it simple, avoid absolutes, have as few SLOs as possible, perfection can wait, keep a safety margin, and don’t overachieve.[4] Ask what users expect, whether the service ties to revenue, whether it is paid or free, what competitors offer, and whether users are consumers or enterprises. Users impose a ceiling: “a user on a 99% reliable smartphone cannot tell the difference between 99.99% and 99.999% service reliability”.[2]

Reconciling two pieces of advice. “Don’t pick a target based on current performance” seems to clash with the workbook’s example SLO document, which derived targets from a month of data, rounding availability down to the nearest 1% and latency up to the nearest 50 ms.[15] Both hold: user needs say what the target should be, data whether it is achievable. When they disagree, publish the achievable SLO and track the better one as an aspirational SLO, “explicitly called out in your error budget policy as not requiring action”.[13]

Dependencies cap what you can promise. “A service cannot be more available than the intersection of all its critical dependencies”, so critical dependencies need one more nine than the service (the “rule of the extra 9”). Frequency and duration matter: three 20-minute outages a year already exceed the roughly 53 minutes that 99.99% allows.[9] For a quick feasibility check, multiply the measured availabilities of hard dependencies: three at 99.95% each give 0.9995³ ≈ 99.85% if their failures are independent. Correlated failures (shared infrastructure) overlap and lift the figure towards the weakest dependency, 99.95%; failures that never overlap lower it to 1 − Σ unavailability, also about 99.85% here. Your service’s own failures come on top, so the SLO must sit below whichever figure applies.

Windows. The workbook found “a four-week rolling window to be a good general-purpose interval”; rolling windows follow user experience, calendar windows suit business planning.[13] A 28-day window also holds the same number of each weekday.

SLO Bad minutes allowed in 28 days (time-based) Failed requests allowed per million
99% 403 min (6 h 43 min) 10,000
99.5% 202 min (3 h 22 min) 5,000
99.9% 40.3 min 1,000
99.95% 20.2 min 500
99.99% 4.0 min 100
99.999% 24 s 10

Allowed bad minutes = (1 − SLO) × 40,320. Prefer request-based SLIs where traffic allows: a time-based SLI treats a minute at 3 a.m. like a minute at peak. Managed tools support both; Cloud Monitoring offers request-based and windows-based SLIs over rolling (1 to 30 days) or calendar periods.[29]

Practice 3: writing an error-budget policy that has consequences

Link to section “Practice 3: writing an error-budget policy that has consequences”

An SLO without a policy is a dashboard. The workbook’s prerequisites are SLOs that all stakeholders approve and consider achievable, a commitment to use the budget for decisions, and a process for refining the SLO. Three groups must agree: product managers (good enough for users), developers (they will reduce risk when the budget is spent) and the production team (defensible “without Herculean effort, excessive toil, and burnout”).[13]

Minimum contents (workbook): authors, reviewers and approvers; approval and review dates; a short service description; the actions when the budget is exhausted; an escalation path.[13] Graduated actions (this Atlas’s proposal) reduce the gaming that a single cliff edge invites:

Budget consumed in the window Action
Under 50% Normal pace; experiments allowed
50–75% Top budget consumer gets a reliability ticket in the next sprint
75–100% Risky changes need a canary and an owner on hand; feature work continues
Over 100% Halt releases except P0 and security fixes until back within SLO; the cause sets the work mix (workflow)

A halt is not the goal: the workbook’s example says “Halting change is undesirable” and frames the policy as permission to focus on reliability when data shows it matters more than features.[21] Write down in advance which causes require reliability work and which let feature work continue, and record which applied each time.

The workbook judges SLO alerts on precision (share of alerts that were significant), recall (share of significant events that alerted), detection time and reset time, and favours multiwindow, multi-burn-rate alerting.[16] Burn rate = error ratio ÷ (1 − SLO). Burn rate 1 spends exactly the budget over the window; 14.4 spends a 30-day budget in about two days. The share of budget a burn consumes is burn rate × alert window ÷ SLO period.

Severity Long window Short window Burn rate Share of a 30-day budget
Page 1 hour 5 minutes 14.4 2%
Page 6 hours 30 minutes 6 5%
Ticket 3 days 6 hours 1 10%

These are the workbook’s starting parameters for a 99.9% SLO; its example rules add a ticket on a 24-hour and 2-hour pair at burn rate 3.[16] Both windows must exceed the threshold: the long one gives precision, and the short one (about 1/12 of the long) stops the alert soon after the problem stops. Over 28 days the same burn rates consume 2.1%, 5.4% and 10.7%, close enough to keep, as Lab 3 does. Sloth’s 28-day catalogue keeps the budget shares instead and lowers the burn rates to 13.44 and 5.6 for pages and 2.8 and about 0.93 for tickets (Sloth v0.16.0).[30] Either is defensible; write down which you use.

Figure 5. Multiwindow, multi-burn-rate alert logic for a 99.9% SLO
Error ratio per window1 h and 5 min bothabove 14.4 × 0.1%6 h and 30 min bothabove 6 × 0.1%24 h and 2 h bothabove 3 × 0.1%3 d and 6 h bothabove 1 × 0.1%Page on-call nowTicket for working hours
Diagram source (Mermaid)
flowchart LR
  R["Error ratio per window"]
  P1["1 h and 5 min both<br>above 14.4 × 0.1%"]
  P2["6 h and 30 min both<br>above 6 × 0.1%"]
  T1["24 h and 2 h both<br>above 3 × 0.1%"]
  T2["3 d and 6 h both<br>above 1 × 0.1%"]
  PAGE["Page on-call now"]
  TICKET["Ticket for working hours"]
  R --> P1
  R --> P2
  R --> T1
  R --> T2
  P1 --> PAGE
  P2 --> PAGE
  T1 --> TICKET
  T2 --> TICKET
  classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
  classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  class P1,P2,T1,T2 decision
  class PAGE risk
  class R,TICKET neutral

Text equivalent: the error ratio for each window feeds four conditions checked in parallel. If both the 1-hour and 5-minute ratios exceed 14.4 times the 0.1% budget, or both the 6-hour and 30-minute ratios exceed 6 times it, on-call is paged. If both the 24-hour and 2-hour ratios exceed 3 times it, or both the 3-day and 6-hour ratios exceed it, a ticket is opened. Otherwise nothing is sent.

Where the parameters break. At a 90% SLO the 2%-in-an-hour page can never fire, because a total outage spends only 1.4% of a month’s budget in an hour; at 99.999% a total outage exhausts the budget in 26 seconds, so design for a small blast radius (roll out to 1% of users first). Low-traffic services get noisy ratios: use synthetic traffic (which can hide real user failures), combine services, change the product (client retries), or lower the SLO or lengthen the window. At scale, group request types into a few buckets with one parameter set each.[16]

The SRE book defines toil as work “tied to running a production service that tends to be manual, repetitive, automatable, tactical, devoid of enduring value, and that scales linearly as a service grows”.[17] Google’s target is to keep operational work (toil) below 50% of each SRE’s time. Its quarterly surveys found an average of about 33%, but “the average doesn’t capture outliers: some SREs claim 0% toil (pure development projects with no on-call work) and others claim 80% toil”.[17] Catchpoint’s 2026 SRE Report (a vendor survey, 68% of respondents in North America) reports a median of 34% of engineers’ time.[14] Both figures sit near a third. Neither is a target, and averages hide teams far above the cap.

Some toil is unavoidable, but it “becomes toxic when experienced in large quantities”, leading to career stagnation, low morale and attrition.[17] The workbook’s method:[31]

  1. Identify toil with the people who do it: business processes, production interrupts, release shepherding, migrations, cost engineering and capacity planning, and troubleshooting opaque architectures.
  2. Measure it in one consistent unit (hours, tickets, manual changes) before, during and after reduction.
  3. Reduce it: engineer it out, reject toil not worth doing, use SLOs to decide which interrupts matter, move from human-backed interfaces to self-service, increase uniformity, and assess the risk inside automation.

The cap needs a mechanism. Google redirects excess operational work to product teams by reassigning bugs and tickets and putting developers back into on-call rotations.[1] Without such a mechanism, a toil limit is an aspiration. Automation’s own safety controls are taught in AutomationOps.

A blameless postmortem “must focus on identifying the contributing causes of the incident without indicting any individual or team for bad or inappropriate behavior”. The SRE book’s triggers are user-visible downtime or degradation beyond a threshold, any data loss, on-call intervention such as a rollback, resolution time above a threshold, and a monitoring failure; any stakeholder may request one. “Writing a postmortem is not punishment—it is a learning opportunity for the entire company.”[19]

Culture shows in behaviour, not templates. In this Atlas’s view, healthy signs are volunteers writing postmortems, readers outside the team, actions completed at their stated priority, and senior engineers writing up their own mistakes. Google adds a postmortem of the month, reading clubs and “Wheel of Misfortune” re-enactments,[19] and now applies CAST (Causal Analysis based on System Theory), a retrospective method from the STAMP safety model, to “supercharge our postmortems”.[32]

The mechanics (timelines, severity, owners, action tracking) and the review template live in IncidentOps, whose skeleton already records the SLO budget consumed. This page’s concern is the budget link: the policy decides which incidents demand a postmortem with priority actions.

Google’s published numbers make on-call load explicit:[33]

  • At least 50% of SRE time goes to engineering; of the rest, no more than 25% is on-call and up to another 25% other operational work.
  • At most two incidents per 12-hour shift, because handling one, including follow-up, takes about six hours on average.
  • A single-site rotation with a primary and a secondary needs at least eight engineers; a dual-site team needs at least six per site.
  • Typical response targets are 5 minutes for user-facing or time-critical services and 30 minutes for less time-sensitive ones.
  • Underload is a risk too: everyone should be on call once or twice a quarter to stay familiar with production.

Treat these as reference points. A three-person team cannot staff 24/7 by them: either the service does not need night paging, or it is under-staffed. Google also reports that playbooks written in advance give “roughly a 3x improvement in MTTR” over improvising,[1] an internal observation, not an independent study. MTTR here is mean time to repair, the book’s own expansion; IncidentOps explains its caveats and owns paging tools and incident roles.

Practice 8: capacity planning and release engineering

Link to section “Practice 8: capacity planning and release engineering”

Capacity. The SRE book makes three steps mandatory: an organic demand forecast beyond the lead time for acquiring capacity, inorganic demand (launches, marketing events) in the forecast, and regular load tests that map raw resources to service capacity; provisioning is riskier than shifting load.[1] Google’s planning moved to intent: “Specify the requirements, not the implementation”, for example “meet service Foo’s demand in each geographic region, and have N + 2 redundancy” rather than “50 cores in clusters X, Y, and Z”.[34] Saturation is the early warning that capacity is running out.[28] Cost and commitments are covered in FinOps.

Release engineering. The SRE book names four principles: a self-service model, high velocity (frequent, small releases), hermetic builds, and enforcement of policies and procedures through access controls.[35] Google found that “roughly 70% of outages are due to changes in a live system”, so its change management relies on progressive rollouts, fast and accurate detection, and safe rollback.[1] Canarying links releases to the budget: the impact “is directly proportional to the amount of traffic exposed to defects”, so a 5% canary serving 20% errors produces a 1% overall error rate. Run one canary at a time and compare it with a concurrent control group, not with the period before the deployment.[20] Release strategy and progressive delivery are taught in ReleaseOps.

No standards body defines SRE. Keep the tiers of reference separate when you justify a decision.

Tier Reference What it gives you Status
Foundational practice Google’s SRE book (2016) and workbook (2018), free online[7] SLIs, SLOs, error budgets, toil, on-call, postmortems, alerting Industry recommendation from one company’s experience
Foundational practice “The Calculus of Service Availability” (2017)[9] Dependency arithmetic, the rule of the extra 9, the three levers Practitioner article (ACM Queue)
Training material The Art of SLOs workshop[36] Slides, handbooks, a worksheet CC BY 4.0, credit Google
Specification OpenSLO, “an open specification for defining service level objectives (SLOs) in YAML” (Apache-2.0)[37] A vendor-neutral file format for SLOs and SLIs Community specification; v1, plus v2alpha and v1alpha schemas (as of October 2026)[38]
Cloud framework AWS Well-Architected reliability pillar[39] Five design principles, such as automatically recover from failure and stop guessing capacity Vendor guidance; complements SLOs
Experimentation Principles of Chaos Engineering[40] Steady-state hypotheses and controlled experiments Community statement (last updated March 2019)

RED and USE belong to ObservabilityOps and DORA’s delivery metrics to DevOps; DORA itself calls reliability “more a measure of operational performance than a measure of software delivery performance”.[11]

Choose tool categories first; each can be built from open-source parts or bought.

Category Job it does Representative options (as of October 2026) Selection criteria Risks
SLO specification Declare SLIs, targets, windows as code OpenSLO v1 YAML;[41] Sloth’s spec;[26] Pyrra’s ServiceLevelObjective[42] Reviewable in Git, portable Spec features your back end ignores
Rule generators Turn specs into recording rules and burn-rate alerts Sloth;[26] Pyrra (Kubernetes operator or filesystem mode)[42] Workbook windows; tested output Hidden defaults for periods and error definitions
Metrics back end Store counters and histograms, evaluate rules Prometheus-compatible systems; Prometheus alerting rules support for and keep_firing_for[43] Retention of at least the SLO window; latency thresholds measurable Cardinality and cost; see ObservabilityOps
Managed SLO monitoring SLOs, budgets and alerts as a service Google Cloud Monitoring (up to 500 SLOs per service)[29]; check other vendors’ current documentation Fits your telemetry; exports for audit Lock-in of SLO definitions
Paging and incident tooling Route pages, run incidents Covered in IncidentOps — —
Load and chaos testing Validate capacity and failure handling Load generators; chaos frameworks[40] Blast-radius controls; abort on SLO burn Unannounced budget use

Feature lists change quickly; keep SLO definitions portable so that changing back ends does not mean renegotiating targets.

Automation is SRE’s core tool, and it can itself cause outages at scale, so apply the AutomationOps controls (dry runs, rate limits, approvals for destructive actions). Good candidates are high-volume, low-judgement toil: provisioning, routine capacity changes, certificate renewals, first diagnostic steps.

Vendors market AI assistants for incident summaries, log search and suggested remediations, and Google’s announcement of the second edition says the book covers generative AI for incident triage and postmortem generation.[12] Treat these tools as automation with an unusual failure mode: plausible but wrong output. Keep a human approval before any AI-suggested production change; measure the tool by the SLO outcomes it affects, not by how many summaries it writes; and do not let it set SLO targets, which are a product decision for the stakeholders in Practice 3. ML event correlation is evaluated in AIOps.

Reference implementation: SLOs as code for a checkout API

Link to section “Reference implementation: SLOs as code for a checkout API”

Assumptions. One HTTP service, checkout, exposes a counter http_requests_total{job, code, traffic} and a classic histogram http_request_duration_seconds{job, code, traffic} with a bucket at le="0.4". The service sets traffic="loadtest" on requests from the load generator (for example, from a header it accepts only from that client) and traffic="user" on all others. Two SLOs over a rolling 28 days: 99.9% of valid requests succeed, and 99% of valid, successful requests complete within 400 ms. One error definition everywhere: a request is bad if it returns a 5xx. The service sheds overload with 503, which counts, and returns 429 only to clients above their own quota, which is correct enforcement and counts as good (Practice 1). The SLO lives in Git, rules are generated from it, and the policy (Templates) sits next to it.

checkout/
  slo/checkout.openslo.yaml      # portable definition (documentation and vendor import)
  slo/checkout.sloth.yaml        # input to the rule generator
  rules/checkout-slo.rules.yaml  # generated by Sloth; reviewed, never hand-edited
  slo/SLO.md                     # SLO document and error-budget policy, signed

1. The portable definition (OpenSLO v1) records intent in a vendor-neutral format, following the v1 schema.[41][44] The latency SLO has the same shape as the availability SLO shown.

Example status: YAML syntax-checked by the validator; not loaded into an OpenSLO implementation.

apiVersion: openslo/v1
kind: Service
metadata:
  name: checkout
  displayName: Checkout API
spec:
  description: Takes payment and creates orders for the web shop.
---
apiVersion: openslo/v1
kind: SLO
metadata:
  name: checkout-availability
  displayName: Checkout availability
spec:
  description: 99.9% of valid checkout requests succeed (non-5xx, excluding load tests).
  service: checkout
  indicator:
    metadata:
      name: checkout-non-5xx
    spec:
      ratioMetric:
        counter: true
        good:
          metricSource:
            type: Prometheus
            spec:
              query: >-
                sum(http_requests_total{job="checkout",code!~"5..",
                traffic!="loadtest"})
        total:
          metricSource:
            type: Prometheus
            spec:
              query: sum(http_requests_total{job="checkout",traffic!="loadtest"})
  budgetingMethod: Occurrences
  timeWindow:
    - duration: 28d
      isRolling: true
  objectives:
    - displayName: Availability
      target: 0.999

2. The generator input (Sloth prometheus/v1). Sloth turns this into SLI recording rules, metadata rules and page and ticket alerts.[26] Both latency queries carry code!~"5..", so a fast error never counts as a fast success.

Example status: YAML syntax-checked by the validator; field names match the prometheus/v1 spec in Sloth v0.16.0 (April 2026); not run through Sloth for this page.

version: "prometheus/v1"
service: "checkout"
labels:
  owner: "payments-team"
  tier: "1"
slos:
  - name: "requests-availability"
    objective: 99.9
    description: "Valid checkout requests that do not fail with a 5xx."
    sli:
      events:
        error_query: >-
          sum(rate(http_requests_total{job="checkout",code=~"5..",
          traffic!="loadtest"}[{{.window}}]))
        total_query: >-
          sum(rate(http_requests_total{job="checkout",
          traffic!="loadtest"}[{{.window}}]))
    alerting:
      name: CheckoutAvailabilityBudgetBurn
      annotations:
        summary: "Checkout is burning its availability error budget"
        runbook: "https://runbooks.example.com/checkout/budget-burn"
      page_alert:
        labels:
          severity: page
      ticket_alert:
        labels:
          severity: ticket
  - name: "requests-latency"
    objective: 99.0
    description: "Valid, successful checkout requests that complete within 400 ms."
    sli:
      events:
        error_query: >-
          sum(rate(http_request_duration_seconds_count{job="checkout",
          code!~"5..",traffic!="loadtest"}[{{.window}}]))
          - sum(rate(http_request_duration_seconds_bucket{job="checkout",
          code!~"5..",traffic!="loadtest",le="0.4"}[{{.window}}]))
        total_query: >-
          sum(rate(http_request_duration_seconds_count{job="checkout",
          code!~"5..",traffic!="loadtest"}[{{.window}}]))
    alerting:
      name: CheckoutLatencyBudgetBurn
      page_alert:
        labels:
          severity: page
      ticket_alert:
        labels:
          severity: ticket

3. Generate, check and review the rules. Sloth’s prometheus/v1 spec has no field for the SLO period and the default is 30 days, so the command selects the 28-day catalogue explicitly (flag present in Sloth v0.16.0).[30]

Example status: bash syntax-checked; not executed (needs the sloth and promtool binaries).

#!/usr/bin/env bash
set -euo pipefail
# Generate Prometheus rules for a 28-day SLO period (Sloth's default is 30d).
sloth generate --default-slo-period=28d \
  -i slo/checkout.sloth.yaml -o rules/checkout-slo.rules.yaml
# Validate the generated file before it reaches Prometheus.
promtool check rules rules/checkout-slo.rules.yaml
# Show reviewers exactly what changed in the alerting behaviour.
git diff --stat -- rules/

Design notes. The latency SLI needs a bucket boundary at exactly 0.4 s.[27] With the 28-day catalogue, Sloth’s page thresholds are 13.44 and 5.6, not Lab 3’s 14.4 and 6 (Practice 4 explains both). The traffic!="loadtest" filter puts the out-of-scope rule in the reviewed spec, but only if the label exists: a != matcher also selects series that lack the label,[45] so an uninstrumented service silently excludes nothing. Check that the selector {job="checkout",traffic=""} returns no series. The generated file is committed so that reviewers see alerting changes in the pull request.

Labs 1 and 2 need only a pen or Python and cost nothing; Lab 3 needs Prometheus’s promtool.

Lab 1 (beginner): write an SLI, an SLO and an error budget for one user journey

Link to section “Lab 1 (beginner): write an SLI, an SLO and an error budget for one user journey”
  • Objective: Turn “the shop must be reliable” into an SLI specification, an SLI implementation, an SLO and a budget.
  • Prerequisites: A pen or spreadsheet; 45 minutes; the glossary.
  • Cost and risk: None.

Steps

  1. Pick one user journey: “a signed-in user pays for the basket”.
  2. Write the SLI specification in user terms: what counts as success, and how fast is fast enough?
  3. Choose an SLI implementation: where you count events, and what that point misses.
  4. List what is valid and what is excluded (load tests, blocked bots, health checks).
  5. Pick a target and window; compute the budget for 28 days with 30 million valid requests.
  6. Write one sentence for each stakeholder group saying what it agrees to.

Expected output (worked answer).

Item Example answer
SLI specification Proportion of payment attempts that return a confirmed order or a correct decline within 2 s
SLI implementation Load-balancer logs for POST /checkout/pay: good = non-5xx and duration ≤ 2 s; valid = all except traffic=loadtest
Known blind spot Requests that never reach the load balancer (DNS, client network); add a prober later
SLO 99.9% over a rolling 28 days
Budget (1 − 0.999) × 30,000,000 = 30,000 failed or slow payments in 28 days
As time 0.1% × 40,320 min = 40.3 minutes of total outage, if traffic were even
Stakeholder sentences PM: “Good enough for buyers.” Developers: “If the budget runs out, releases halt.” On-call: “Defensible without heroics.”
  • Validation: A correct decline (“card refused”) counts as good, because the service behaved correctly; if your SLI counts it as bad, you are measuring the bank, not your service. The same test settles a 429: good if the client exceeded its own quota, bad if the service shed load or refused a client within quota (with overload shed as 503, “non-5xx” applies this rule). Check that numerator and denominator use the same filters.
  • Troubleshooting: If nobody would sign step 6, you have found the real, organisational blocker. If the budget feels huge, 30,000 failed payments may be 30,000 lost orders: the number starts the business conversation.
  • Teardown: None; keep the sheet as the first draft of your SLO document.

Lab 2 (intermediate): compute an error budget and simulate burn-rate alerts

Link to section “Lab 2 (intermediate): compute an error budget and simulate burn-rate alerts”
  • Objective: See how a budget is spent and when each of the workbook’s alert pairs would fire, minute by minute.[16]
  • Prerequisites: Python 3.8 or later, standard library only; 30 minutes.
  • Cost and risk: None; the script generates its own synthetic traffic.

Steps

  1. Save the script as slo_budget.py.

Example status: executed on 2026-10-16 with Python 3.8.10; syntax-checked by the validator.

"""Error budget and multiwindow burn-rate alerts for ONE service, minute by minute.

Usage: python3 slo_budget.py [--slo 0.999] [--days 28]
Generates a deterministic synthetic traffic series (no input file), then reports
SLO compliance, budget consumption and when each burn-rate alert would fire.
Alert parameters follow the Site Reliability Workbook, "Alerting on SLOs".
Standard library only.
"""
import argparse
import math

MIN_PER_DAY = 1440


def synthetic_minutes(days):
    """Yield (good, total) per minute: diurnal traffic, 0.02% errors, two incidents."""
    # Fractional errors are carried forward so the 0.02% baseline is not rounded away.
    carry = 0.0
    for m in range(days * MIN_PER_DAY):
        day, minute_of_day = divmod(m, MIN_PER_DAY)
        # Diurnal traffic between 400 and 1,600 requests per minute, peak at 14:00.
        phase = 2 * math.pi * (minute_of_day - 840) / MIN_PER_DAY
        total = int(1000 + 600 * math.cos(phase))
        error_ratio = 0.0002
        # Incident A: day 10, 14:00-14:40, 5% errors.
        if day == 9 and 840 <= minute_of_day < 880:
            error_ratio = 0.05
        # Incident B: day 20, 02:00-18:00, 0.5% errors.
        if day == 19 and 120 <= minute_of_day < 1080:
            error_ratio = 0.005
        carry += total * error_ratio
        bad = int(carry)
        carry -= bad
        yield total - bad, total


def prefix_sums(series):
    bad, tot = [0], [0]
    for good, total in series:
        bad.append(bad[-1] + (total - good))
        tot.append(tot[-1] + total)
    return bad, tot


def ratio(bad, tot, end, window):
    """Error ratio over the `window` minutes ending at minute index `end` (exclusive)."""
    start = max(0, end - window)
    t = tot[end] - tot[start]
    return (bad[end] - bad[start]) / t if t else 0.0


def stamp(minute):
    day, rest = divmod(minute, MIN_PER_DAY)
    return f"day {day + 1:>2} {rest // 60:02d}:{rest % 60:02d}"


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--slo", type=float, default=0.999)
    ap.add_argument("--days", type=int, default=28)
    args = ap.parse_args()
    budget_ratio = 1 - args.slo
    series = list(synthetic_minutes(args.days))
    bad, tot = prefix_sums(series)
    n = len(series)

    total_req, total_bad = tot[n], bad[n]
    allowed = budget_ratio * total_req
    print(f"window: {args.days} days, SLO {args.slo:.3%}, "
          f"requests {total_req:,}, failed {total_bad:,}")
    verdict = "met" if total_bad <= allowed else "MISSED"
    print(f"SLI (good/total): {1 - total_bad / total_req:.4%}  -> SLO {verdict}")
    print(f"error budget: {allowed:,.0f} failed requests; "
          f"consumed {total_bad / allowed:.1%}; remaining {1 - total_bad / allowed:.1%}")

    # Multiwindow, multi-burn-rate rules: (name, long, short, burn rate), in minutes.
    rules = [("page fast", 60, 5, 14.4), ("page slow", 360, 30, 6.0),
             ("ticket", 1440, 120, 3.0), ("ticket slow", 4320, 360, 1.0)]
    for name, long_w, short_w, burn in rules:
        threshold = burn * budget_ratio
        episodes, firing, began = [], False, None
        for end in range(1, n + 1):
            on = (ratio(bad, tot, end, long_w) > threshold
                  and ratio(bad, tot, end, short_w) > threshold)
            if on and not firing:
                firing, began = True, end - 1
            elif not on and firing:
                firing = False
                episodes.append((began, end - 1))
        if firing:
            episodes.append((began, n - 1))
        text = "; ".join(f"{stamp(a)} -> {stamp(b)}" for a, b in episodes)
        text = text or "never fired"
        print(f"{name:<11} ({long_w // 60}h/{short_w}m at {burn}x): {text}")


if __name__ == "__main__":
    main()
  1. Run python3 slo_budget.py.

Expected output (copied from the real run):

window: 28 days, SLO 99.900%, requests 40,299,952, failed 16,415
SLI (good/total): 99.9593%  -> SLO met
error budget: 40,300 failed requests; consumed 40.7%; remaining 59.3%
page fast   (1h/5m at 14.4x): day 10 14:17 -> day 10 14:43
page slow   (6h/30m at 6.0x): day 10 14:37 -> day 10 15:06
ticket      (24h/120m at 3.0x): day 20 15:15 -> day 20 18:52
ticket slow (72h/360m at 1.0x): day 20 14:00 -> day 20 23:17

Reading the result. Incident A (5% errors, burn rate 50, 40 minutes at peak) paged after 17 minutes, matching 60 min × 14.4 ÷ 50 ≈ 17, and the page stopped 3 minutes after the incident, thanks to the 5-minute window. Incident B (0.5% errors, burn rate 5, 16 hours) never paged and opened a ticket after 12 hours, by design: at burn rate 5 the budget lasts about 5.6 days. The quiet cost: the 0.02% baseline spent about half of the consumed budget.

  • Validation: Check one number by hand. The budget is 0.1% × 40,299,952 ≈ 40,300 requests, and 16,415 ÷ 40,300 ≈ 40.7%.
  • Exercises: (a) Run python3 slo_budget.py --slo 0.9995. Does incident B page now, and how much budget is left? (b) Change incident B’s ratio to 0.008 (burn rate 8). Which alerts fire, and when? © Why did incident A trigger only pages, and incident B only tickets?
  • Troubleshooting: with real data, empty minutes make ratio return 0 rather than fail.
  • Teardown: Delete the file.
Lab 2 exercise answers (from real runs of the same script)

(a) With --slo 0.9995, the budget halves to 20,150 failed requests and 81.5% is consumed. Incident B now pages on the 6-hour pair (day 20, 05:24 to 18:12), because 0.5% is 10 times a 0.05% budget. (b) With a ratio of 0.008 at 99.9%, incident B pages on the 6-hour pair from day 20 06:13 to 18:07, and consumption rises to 48.8%. © In the 24-hour and 3-day windows, incident A’s 40 minutes are diluted below the ticket thresholds; incident B never reached a page threshold but stayed above the ticket thresholds long enough to fill their long windows.

Lab 3 (advanced): burn-rate alerts in Prometheus, proven with a unit test

Link to section “Lab 3 (advanced): burn-rate alerts in Prometheus, proven with a unit test”
  • Objective: Write the workbook’s multiwindow page alert as Prometheus rules and prove with promtool test rules that a 1% error rate pages (via the 6-hour pair) and a 0.05% error rate does not.[16][46]
  • Prerequisites: promtool from Prometheus 3.x (the files follow the 3.15 documentation, current in October 2026); no running server is needed.
  • Cost and risk: None; unit tests run offline on synthetic series.
  • Status: not executed (promtool is not installed in the authoring environment); YAML syntax-checked, written to the documented unit-test format.
  1. Save the rules as checkout-slo.rules.yaml. The recording rules sum numerators and denominators before dividing, as the Prometheus naming guide recommends.[24] For brevity they leave out the reference implementation’s traffic filter.
groups:
  - name: checkout-slo
    rules:
      - record: job:slo_errors_per_request:ratio_rate5m
        expr: |
          sum by (job) (rate(http_requests_total{job="checkout",code=~"5.."}[5m]))
          /
          sum by (job) (rate(http_requests_total{job="checkout"}[5m]))
      - record: job:slo_errors_per_request:ratio_rate30m
        expr: |
          sum by (job) (rate(http_requests_total{job="checkout",code=~"5.."}[30m]))
          /
          sum by (job) (rate(http_requests_total{job="checkout"}[30m]))
      - record: job:slo_errors_per_request:ratio_rate1h
        expr: |
          sum by (job) (rate(http_requests_total{job="checkout",code=~"5.."}[1h]))
          /
          sum by (job) (rate(http_requests_total{job="checkout"}[1h]))
      - record: job:slo_errors_per_request:ratio_rate6h
        expr: |
          sum by (job) (rate(http_requests_total{job="checkout",code=~"5.."}[6h]))
          /
          sum by (job) (rate(http_requests_total{job="checkout"}[6h]))
      - alert: CheckoutErrorBudgetBurn
        expr: |
          (
              job:slo_errors_per_request:ratio_rate1h{job="checkout"} > (14.4 * 0.001)
            and
              job:slo_errors_per_request:ratio_rate5m{job="checkout"} > (14.4 * 0.001)
          )
          or
          (
              job:slo_errors_per_request:ratio_rate6h{job="checkout"} > (6 * 0.001)
            and
              job:slo_errors_per_request:ratio_rate30m{job="checkout"} > (6 * 0.001)
          )
        labels:
          severity: page
        annotations:
          summary: Checkout is burning its 99.9% error budget too fast
  1. Save the test as checkout-slo.test.yaml. Each counter series grows by a fixed amount per minute, so the error ratio is constant.
rule_files:
  - checkout-slo.rules.yaml
evaluation_interval: 1m
tests:
  - interval: 1m
    input_series:
      - series: 'http_requests_total{job="checkout",code="200"}'
        values: '0+990x480'
      - series: 'http_requests_total{job="checkout",code="500"}'
        values: '0+10x480'
    alert_rule_test:
      - eval_time: 7h
        alertname: CheckoutErrorBudgetBurn
        exp_alerts:
          - exp_labels:
              severity: page
              job: checkout
            exp_annotations:
              summary: Checkout is burning its 99.9% error budget too fast
  - interval: 1m
    input_series:
      - series: 'http_requests_total{job="checkout",code="200"}'
        values: '0+1999x480'
      - series: 'http_requests_total{job="checkout",code="500"}'
        values: '0+1x480'
    alert_rule_test:
      - eval_time: 7h
        alertname: CheckoutErrorBudgetBurn
        exp_alerts: []
  1. Run promtool check rules checkout-slo.rules.yaml, then promtool test rules checkout-slo.test.yaml.
  • Expected output: check rules reports success and 5 rules found; test rules reports success. In the first group the error ratio is 1% (burn rate 10): below 14.4, so the 1-hour pair is false, but above 6, so the 6-hour pair fires. In the second group the ratio is 0.05% (burn rate 0.5), and no alert fires.
  • Validation: Prove the threshold is real. In the first group, change the increments to 0+995x480 and 0+5x480 (0.5% errors, burn rate 5, below the 6× threshold) and rerun: the test should now fail, with promtool reporting that the expected alert did not fire. Restore the values afterwards.
  • Troubleshooting: a label mismatch means the alert carries labels you did not list; expected labels include the sample’s labels, without __name__ and alertname.[46] Empty recording rules usually mean the regex or job label is wrong.
  • Teardown: Delete the two files; deploy real rules through your normal change process.

Cases A and B are sourced from the workbook, written by engineers at those companies; C is an illustrative composite.

A. Evernote: SLOs as the shared language between ops and dev (sourced).[47] Problem: operations protected production while developers built features. Method: after moving to Google Cloud, a simple first SLO of 99.95% uptime over a monthly window for certain services, measured by an external prober calling a built-in status page; a second, geographically separate prober confirms failures, and scheduled maintenance counts as downtime. Monthly reviews; SLO revisions every six months. Outcome: a common measure of success for ops and dev; in 2017 an SLO calculation helped cut a set of release windows from five to two. Trade-off: the probe misses some user interactions, accepted on the principle “Perfect is the enemy of good”.

B. The Home Depot: SLOs at scale through a simple framework (sourced).[47] Problem: many development teams unfamiliar with SLOs. Method: the VALET acronym (volume, availability, latency, errors, tickets), executive backing, training and internal marketing, annual SLO goals for development managers, and tooling that turned logs into VALET metrics. Outcome: from about 50 services reporting SLOs to 800 within a year. Trade-off: SLOs were a trending tool, not wired to alerting; an error-budget culture was still a next step.

C. A data pipeline with a freshness SLO (illustrative). SLI: share of reads of a pricing feed served from data updated within 10 minutes; SLO 99% over 28 days. Late batches, not crashes, spend the budget; when it is gone, schema changes halt. Pitfall: measuring job success instead of data age hides retries that succeed late. Pipeline practice belongs to DataOps; platform SLOs, such as pipeline start times on an internal CI platform, to PlatformOps.

SRE metrics cover the service’s reliability, the health of the reliability process, and the people doing it.

KPI Definition and formula Data source Pitfall Review cadence
SLI good events ÷ valid events in the window[13] Metrics store Filters differ between numerator and denominator Continuous
SLO compliance SLI ≥ target over the window (yes/no, plus margin) SLO report Reporting only yes/no hides a near miss Weekly
Budget consumed bad events ÷ ((1 − SLO) × valid events) SLO report Comparing budgets across services with different traffic Weekly
Burn rate error ratio over a window ÷ (1 − SLO)[16] Recording rules Reading a 5-minute burn rate as a trend Continuous
SLO coverage critical user journeys with an SLO ÷ critical user journeys SLO catalogue Counting SLOs instead of journeys Quarterly
Toil share toil hours ÷ total team hours[31] Toil log, survey Self-reporting drifts without a definition Each sprint
Pages per on-call shift pages ÷ shifts; flag any shift with more than 2 incidents[33] Paging tool Counting alerts, not incidents Monthly

Postmortem action closure is defined once, in IncidentOps.

Worked calculation (illustrative data). Checkout handled 50,000,000 valid requests in the last 28 days, with an SLO of 99.9%.

  1. Budget = (1 − 0.999) × 50,000,000 = 50,000 failed requests.
  2. Observed failures = 31,000, so SLI = 1 − 31,000 ÷ 50,000,000 = 99.938%: met, with a margin of 0.038 percentage points.
  3. Budget consumed = 31,000 ÷ 50,000 = 62%; remaining 38%, or 19,000 requests.
  4. One incident caused 12,500 failures = 25% of the budget, above the example policy’s 20% postmortem trigger.[21]
  5. Right now the 1-hour error ratio is 0.6%, a burn rate of 0.006 ÷ 0.001 = 6. At an average 50,000,000 ÷ 672 h ≈ 74,400 requests per hour, that is about 446 failures an hour, so the remaining 19,000 last about 43 hours. The 6-hour page fires only if the 6-hour and 30-minute ratios also exceed 0.6%.
  6. Toil: a team of six logged 190 toil hours in a two-week sprint of 6 × 80 = 480 hours, a toil share of 39.6%: under Google’s 50% cap, but worth a trend line.

Leading versus lagging. Compliance lags; burn rate, coverage and toil share lead. Vanity traps: SLO counts, “100% compliance every month” (a loose target or a blind SLI), fewer pages (possibly lost recall). Data limitations: server-side SLIs miss requests that never arrive, low traffic makes ratios jumpy, and changing the SLI implementation breaks the trend, so log it.

  • SLOs versus SLAs. An SLA is a contract with consequences; an SLO is an internal target.[4] Keep SLOs stricter than any SLA so you act before you pay (ServiceOps).
  • Least privilege. Rollbacks, failovers and capacity changes need production access: grant it through audited, time-bound roles and one-button safe actions, with break-glass credentials for emergencies (AccessOps); the runbook shows the exact permissions for one rollback.
  • Security incidents. When an outage is an attack, handling moves to ResponseOps; preserving evidence can conflict with restoring fast.
  • Auditability. Keep the signed SLO document and policy, every invocation and escalated decision, and the postmortems; regulatory needs depend on jurisdiction and sector (ComplianceOps).
  • Privacy. Client-side instrumentation and logs can carry personal data; count events, not people, where you can.

Reliability is paid for in engineering time, infrastructure and lost features, and each increment can cost far more than the last.[2] Three drivers dominate:

Driver What raises it Lever
Redundancy N + 2 caps level-flight utilisation at 33% on three replicas and about 59% on five[22] Match redundancy to the SLO; not every service needs N + 2 everywhere
People A 24/7 rotation is a fixed headcount (Practice 7) Page only for what needs a human now; tickets for the rest
Lost velocity Halts, slow canaries, heavy reviews Spend the budget; halt only on exhaustion

Over-provisioning wastes money and energy; under-provisioning spends the budget. Rightsizing belongs to FinOps, carbon to GreenOps.

  • Do SLOs predict user pain? Complaints while the SLO is green mean a blind SLI; burns nobody notices may mean the target is too strict.
  • Is the policy real? A policy never invoked, or overridden without a recorded decision, is not operating.
  • Are alerts healthy? Track precision (pages that needed action) and recall (incidents caught by alerts rather than by users).[16]
  • Is toil falling? A rising toil share on a stable service means the work is not being engineered away.
  • Are postmortems learning? Repeated contributing causes mean actions miss the underlying conditions.
Symptom Likely cause Diagnosis Remediation Prevention
Users complain, SLO is green SLI too far from the user, or wrong “good” Compare SLI with tickets; add a prober Fix the SLI; record the change Review SLIs against complaints quarterly
Budget always nearly full Target too loose, or bad events filtered out Check filters and history Tighten the target or fix the filter Don’t overachieve: the Chubby lesson[4]
Pages at night that need no action Cause-based alerts kept alongside SLO alerts Classify a month of pages by action taken Delete or demote to tickets “Every page should be actionable”[28]
Burn-rate page flaps Low traffic; noisy ratio Plot request counts per window Combine services, synthetic traffic, longer windows[16] Minimum-traffic rule
Budget exhausted, nothing changes Policy unsigned or unsupported Ask who decided to keep shipping Escalate per the policy; record the decision Exec sponsor signs before launch
Error spike after deploys Big-batch releases, weak canaries Correlate burn with deploy log Roll back; canary with a control group[20] Smaller, progressive rollouts[1]
Errors cascade after a partial failure Retries amplifying load Retry counts per layer; saturation Shed load, cut retries, degrade gracefully[48] Retry budgets and randomised exponential backoff[48]
SRE team drowning in tickets Toil cap not enforced Toil log above the cap Hand work back; pause onboarding A redirection mechanism (Practice 5)

Worked runbook: fast-burn page on checkout availability

Link to section “Worked runbook: fast-burn page on checkout availability”

Illustrative scenario. Commands are syntax-checked, not executed; they assume Kubernetes and the Prometheus HTTP API.

Trigger: CheckoutAvailabilityBudgetBurn pages at 14:17. The incident process starts as in IncidentOps; this runbook covers the reliability side.

Access (least privilege). In namespace shop only, the on-call identity needs get, list and watch on Deployments and ReplicaSets and patch on Deployments: kubectl’s rollback reads the Deployment, lists its ReplicaSets and patches the Deployment.[49] Grant this Role just in time through an audited process; check it with kubectl auth can-i patch deployments -n shop. Prometheus access is read-only, over TLS.

Figure 6. Runbook flow for a fast-burn page, with the dependency exception path
YesNoYesNoNoYesYesNoBurn-rate page firesConfirm impact: SLI by routeand versionChange in the last 2 hours?Roll back or turn off the flagA dependency's SLIdegraded?Degrade gracefully, shedload, call the ownerEscalate: incidentcommander, morerespondersBurn rate below 1 on 5-minwindow?Budget accounting: shareconsumedMore than 20% of budget?Postmortem with a P0 actionReview at weekly budgetmeeting
Diagram source (Mermaid)
flowchart TB
  P["Burn-rate page fires"] --> C["Confirm impact: SLI by route and version"]
  C --> Q1{"Change in the last 2 hours?"}
  Q1 -- "Yes" --> RB["Roll back or turn off the flag"]
  Q1 -- "No" --> Q2{"A dependency's SLI degraded?"}
  Q2 -- "Yes" --> DG["Degrade gracefully, shed load, call the owner"]
  Q2 -- "No" --> ESC["Escalate: incident commander, more responders"]
  RB --> V{"Burn rate below 1 on 5-min window?"}
  DG --> V
  ESC --> V
  V -- "No" --> C
  V -- "Yes" --> B["Budget accounting: share consumed"]
  B --> Q3{"More than 20% of budget?"}
  Q3 -- "Yes" --> PM["Postmortem with a P0 action"]
  Q3 -- "No" --> R["Review at weekly budget meeting"]
  classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
  classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  class Q1,Q2,Q3,V decision
  class P risk
  class C,RB,DG,ESC,B,PM,R core

Text equivalent: confirm impact by splitting the SLI by route and version. A change in the last two hours is rolled back or its flag turned off; otherwise a degraded dependency leads to graceful degradation, load shedding and a call to its owner, and anything else is escalated to an incident commander. Then check whether the 5-minute burn rate is below 1; if not, confirm impact again. If it is, more than 20% of budget consumed requires a postmortem with a P0 action; less goes to the weekly budget review.

Step 1: confirm impact (2 minutes). Is the error concentrated in one version, route or zone?

#!/usr/bin/env bash
set -euo pipefail
# Read-only query endpoint over TLS (placeholder URL; add your proxy's authentication).
PROM_URL="${PROM_URL:-https://prometheus.example.internal}"
# 5-minute error ratio by version (the version label must exist in your metrics).
NUM='sum by (version) (rate(http_requests_total{job="checkout",code=~"5.."}[5m]))'
DEN='sum by (version) (rate(http_requests_total{job="checkout"}[5m]))'
curl -sG "$PROM_URL/api/v1/query" --data-urlencode "query=$NUM / $DEN" \
  | jq -r '.data.result[] | "\(.metric.version) \(.value[1])"'

Step 2: look for a change. Most outages follow a change (Practice 8), so check deployments, configuration pushes and feature flags first.

#!/usr/bin/env bash
set -euo pipefail
kubectl -n shop rollout history deployment/checkout
kubectl -n shop get deployment checkout \
  -o jsonpath='{.metadata.annotations.kubernetes\.io/change-cause}{"\n"}'

Step 3: mitigate before you diagnose. If the new version is the outlier, roll back now; root-cause analysis can wait for the postmortem.[50] The undo is itself a change: only the Pod template is rolled back (scaling is not),[51] pods are replaced through the rollout strategy, and the patch appears in the API audit log if auditing is on. Record it in the incident timeline; never roll back across a schema or data migration without the service owner.

#!/usr/bin/env bash
set -euo pipefail
kubectl -n shop rollout undo deployment/checkout
kubectl -n shop rollout status deployment/checkout --timeout=5m

Exception path. No recent change, and the errors are timeouts to the payment gateway? Shed non-critical load, serve a degraded path if one exists, and call the gateway’s owner. Watch for retry storms: limit retries per request, use randomised exponential backoff and a server-wide retry budget.[48] If the budget is exhausted, the halt applies whatever the cause. The team may keep building features if the gateway’s owners have frozen their own releases, but a hard dependency that could be softened (a fallback, a queue) is reliability work for the team.[21]

Step 4: verify. Rerun Step 1. The page resets once the 5-minute ratio drops (3 minutes after the incident in Lab 2); watch the 6-hour pair for another half hour.

Step 5: account for the budget. Record the share consumed for the weekly review; above 20%, the policy’s postmortem trigger applies.

Step 6: learn. Ask blamelessly why a normal deployment could do this much harm: canary too short, no version split, slow rollback.[19]

Anti-pattern or myth Why it seems attractive What goes wrong Do instead
“Fake SRE”: rename the ops team Cheap, fast, good for hiring Developers still throw software over the wall; nothing changes[3] Adopt SLOs, a toil cap and the hand-back mechanism first, then titles
Aim for five nines everywhere Sounds ambitious Costs explode; dependencies make it impossible;[9] the budget is too small to ship Set targets per journey from user needs
SLOs nobody acts on Easy to publish A reporting project with no effect on releases Sign the error-budget policy before the SLOs go live
Alerting on every metric “just in case” Fear of missing something Pager fatigue; real pages ignored Page on burn rate; ticket the rest[16]
Myth: “SRE means no developer on-call” Developers want to code Google’s model redirects excess operational work back to developers[1] Shared ownership; developers join rotations when load is high
Myth: “Postmortems are blameless, so nobody is accountable” Misreads blamelessness Actions never close Blameless about people, strict about actions and owners

Use SRE practices when users or the business notice unreliability; several teams change the same production system; operations work grows with traffic or customers; release arguments are settled by seniority rather than data; or you depend on, or are depended on by, other services with reliability expectations.

Do not build an SRE team (yet) when:

  • The product has no users who would notice. A prototype needs basic monitoring and a rollback button, not a budget policy.
  • Nobody with authority will sign the policy. Start with an SLO pilot and an executive sponsor instead of hiring.
  • You cannot staff a sustainable rotation. By Google’s numbers a single-site 24/7 rotation needs about eight people.[33] With three engineers, reduce what must page out of hours, buy managed services, or accept business-hours support.
  • The work is mostly a vendor’s. For SaaS-heavy stacks, spend the effort on SLAs, dependency SLIs and fallbacks; the NoOps page estimates the operations work that remains.
  • You want a gatekeeper. A team that says no to releases becomes a bottleneck and the blame target; SRE makes the budget the gate.

Hidden responsibilities. Adopting SRE means maintaining SLO specs, keeping latency thresholds measurable (a bucket boundary per threshold for classic histograms), reviewing SLOs quarterly, enforcing the toil cap, and defending the policy when a big launch collides with an empty budget.

Use the tree to choose a starting point, then the weighted matrix to choose a team model. Both are this Atlas’s tools, not industry standards.

Figure 7. Decision tree: whether and how to start with SRE
NoYesYesNoNoYesYesNoYesNoWould users or the businessnotice an outage today?Basic monitoring androllback; revisit at launchWill leaders sign anerror-budget policy?After cutting toil, is ops loadstill over half of engineers'time?SLO pilot on one journey plusan exec sponsorSRE practices in productteamsCan you staff a sustainablerotation?Shared infrastructure behindmany teams?Narrow paging hours,managed services orbusiness-hours supportInfrastructure SRE teamEmbedded or kitchen-sinkteam with a charter
Diagram source (Mermaid)
flowchart TB
  Q1["Would users or the business notice an outage today?"]
  Q1 -- "No" --> A1["Basic monitoring and rollback; revisit at launch"]
  Q1 -- "Yes" --> Q2["Will leaders sign an error-budget policy?"]
  Q2 -- "Yes" --> Q3["After cutting toil, is ops load still over half of engineers' time?"]
  Q2 -- "No" --> A2["SLO pilot on one journey plus an exec sponsor"]
  Q3 -- "No" --> A3["SRE practices in product teams"]
  Q3 -- "Yes" --> Q4["Can you staff a sustainable rotation?"]
  Q4 -- "Yes" --> Q5["Shared infrastructure behind many teams?"]
  Q4 -- "No" --> A6["Narrow paging hours, managed services or business-hours support"]
  Q5 -- "Yes" --> A4["Infrastructure SRE team"]
  Q5 -- "No" --> A5["Embedded or kitchen-sink team with a charter"]
  classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  class Q1,Q2,Q3,Q4,Q5 decision
  class A3,A4,A5 core
  class A1,A2,A6 neutral

Text equivalent: no noticeable impact today means basic monitoring and rollback. No leader willing to sign a policy means an SLO pilot with a sponsor. Otherwise, cut and hand back toil first; if operational load is then under half of engineers’ time, adopt SRE practices in product teams. If it is still above half but you cannot staff a sustainable rotation, narrow paging hours, buy managed services or accept business-hours support. If you can staff one, shared infrastructure points to an infrastructure SRE team, and otherwise to an embedded or kitchen-sink team with a charter.

Weighted matrix for choosing a team model (illustrative weights). Score each model 1–5 per criterion, multiply by the weight and add up. The example is a mid-sized company with no SRE team yet, 12 product teams on one shared Kubernetes platform and one revenue-critical checkout.

Criterion (weight) Practices in product teams Embedded SRE Infrastructure SRE Product SRE for checkout
Fits current headcount (3) 5 3 3 2
Standardises practice across teams (3) 2 2 5 2
Protects the critical journey (4) 2 3 3 5
Keeps developers close to production (2) 5 4 3 3
Weighted total (max 60) 39 35 42 38

An infrastructure SRE team wins, with checkout’s SLOs owned by its product team on shared tooling. Google’s article says starting with an infrastructure or tools team “makes the most sense when the application teams are able and willing to define and maintain SLOs”, and recommends product/application teams as a second or later team,[10] so the last column is for comparison only. Different weights can change the answer; that is why you write them down.

This Atlas’s proposed model, not an industry standard. Levels are cumulative; move up only when the exit criteria hold for your tier-1 services.

Level Observable behaviour Evidence Exit criteria (to move up)
1. Reactive Users report outages; resource alerts; heroics Support tickets One journey has a continuously measured SLI
2. Measured SLIs for key journeys; no agreed targets SLI dashboards SLO documents approved by product, developers and on-call
3. Targeted SLOs agreed; burn-rate alerts replace most cause alerts SLO docs, alert inventory A signed policy, invoked at least once with a recorded outcome
4. Governed Policy shapes release pace; budget-triggered postmortems; toil measured Policy log, toil log Toil falling; PRR for new tier-1 services; postmortem action closure ≥ 80%
5. Engineered Dependency maths at design time, capacity by intent, canaries tied to budgets, game days Design reviews citing SLOs Sustain: yearly review shows targets still match users
Figure 8. Maturity progression and the most common stall points
1. Reactive: users findoutages2. Measured: SLIs on keyjourneys3. Targeted: agreed SLOs,burn-rate alerts4. Governed: policy changesrelease pace5. Engineered: reliabilitydesigned inStall: dashboards nobodyownsStall: policy never signedStall: toil cap without teeth
Diagram source (Mermaid)
flowchart TB
  L1["1. Reactive: users find outages"] --> L2["2. Measured: SLIs on key journeys"]
  L2 --> L3["3. Targeted: agreed SLOs, burn-rate alerts"]
  L3 --> L4["4. Governed: policy changes release pace"]
  L4 --> L5["5. Engineered: reliability designed in"]
  S1["Stall: dashboards nobody owns"] -.-> L2
  S2["Stall: policy never signed"] -.-> L3
  S3["Stall: toil cap without teeth"] -.-> L4
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
  class L1,L2,L3,L4,L5 core
  class S1,S2,S3 risk

Text equivalent: the levels run from Reactive (users find outages) through Measured, Targeted and Governed to Engineered. Three stall points are marked: unowned dashboards keep teams at Measured, an unsigned policy at Targeted, and a toil cap without teeth at Governed.

The plan assumes one product area with three to five services, an engaged service owner and an executive sponsor.

Phase Actions Owner Dependencies Milestone and metric
Days 1–30: measure Pick two critical journeys; write SLIs (Lab 1); make latency thresholds measurable; start a toil log; run The Art of SLOs workshop[36] SRE lead + service owner Metrics access; sponsor’s time SLIs live for 2 journeys; toil baseline
Days 31–60: agree Draft SLO documents and the policy; agree targets; generate burn-rate alerts from specs (Labs 2–3); retire pages that never led to action Service owner + PM + SRE Four weeks of SLI data SLOs approved; page volume down
Days 61–90: govern Sign the policy; weekly budget reviews; one PRR; one Wheel of Misfortune;[19] a one-page report to the sponsor Exec sponsor signs; SRE runs reviews Signed policy First policy decision recorded; toil trend

Quick wins: deleting pages nobody acts on; a version label on request metrics; the first budget chart. Hard parts: the signature, and the first time the budget runs out before a launch (see the judgement call).

SLO readiness (before you publish an SLO)

  • The SLI describes a user-visible outcome of a named user journey.
  • Specification and implementation are written down, with known blind spots.
  • “Valid” excludes load tests and other out-of-scope traffic, in the reviewed spec.
  • Latency thresholds are measurable: a bucket boundary at each threshold (classic histograms) or histogram_fraction accepted as an estimate (native histograms).
  • At least four weeks of data show the target is achievable, or an aspirational SLO is declared.
  • Product manager, developers and on-call have each agreed in writing.
  • Critical dependencies’ measured availability supports the target.

Production readiness review (adapted from the SRE book’s PRR areas)[18]

  • Architecture: critical dependencies and their SLOs documented.
  • Monitoring: SLIs and burn-rate alerts live; every page links to a runbook.
  • Emergency response: rotation staffed, escalation path, playbooks for top failure modes.
  • Capacity: forecast beyond procurement lead time; load test this quarter.
  • Change management: progressive rollout, canary with a control group, tested rollback.
  • Performance: availability, latency and efficiency measured against targets.

On-call health (monthly)

  • No shift exceeded two incidents, or the cause has an action.[33]
  • Every page led to action; others deleted or demoted.
  • Everyone was on call this quarter; nobody above the agreed share.
  • Toil share recorded and below the cap.

Quarterly SLO review

  • Budget burns compared with support tickets and user feedback.
  • SLO coverage of critical journeys checked.
  • Every policy invocation and escalated decision reviewed.
  • Decision recorded (keep, tighten, loosen, change the SLI), with reason and next review date.

1. SLO document (structure adapted from the workbook’s example SLO document).[15]

SLO DOCUMENT: <service name>
Status: draft | approved          Version: 1.0
Authors: <names>                  Reviewers (technical): <names>
Approvers (business): <names>
Approved: YYYY-MM-DD              Next review: YYYY-MM-DD

1. Service overview   <two or three sentences: users, journeys, dependencies>
2. SLIs and SLOs      one block per journey:
   Journey:             Pay for basket
   SLI specification:   confirmed order or correct decline within 2 s
   SLI implementation:  load-balancer logs, POST /checkout/pay
   SLO and window:      99.9%, rolling 28 days
3. Rationale          <user need; data used (dates); rounding; dependency check>
4. Error budget       <(1 - SLO) x valid events; how it is calculated; link to policy>
5. Clarifications     <what counts as valid; known blind spots; maintenance treatment>
6. Changelog          <date, change to SLI or target, reason>

2. Error-budget policy (structure adapted from the workbook’s example policy; the thresholds are examples to negotiate).[21]

ERROR-BUDGET POLICY: <service name>
Authors / reviewers / approvers: <names>
Approved: YYYY-MM-DD   Review: YYYY-MM-DD

Goals:      protect users from repeated SLO misses; balance reliability with features.
Non-goals:  punishing teams for missing SLOs.

When the budget is exhausted over the trailing 4 weeks:
  - Halt all changes and releases except P0 and security fixes until the service
    is back within SLO. The cause of the miss does not lift the halt.
  - The cause decides the work. Record which case applied.
    The team MUST work on reliability if:
      - a code bug or procedural error in the service caused the miss;
      - a postmortem shows a hard dependency that could be softened;
      - miscategorised errors hid budget use that would have shown a miss.
    The team MAY continue feature work (unreleased) if:
      - a company-wide network problem caused the outage;
      - another team's service caused it, and that team has frozen its releases;
      - out-of-scope users (load tests, penetration tests) used the budget;
      - miscategorised errors used budget although no users were affected.
    Fix measurement errors in the reviewed SLO spec, then recompute.
When a single incident consumes more than 20% of the 4-week budget:
  - Postmortem required, with at least one P0 action.
When one class of outage consumes more than 20% of the budget in a quarter:
  - P0 item in the next quarter's plan.
Escalation: disagreements about the calculation or the actions go to
  <named executive role>, who decides; record the decision.

3. Toil log (one row per occurrence; units per the workbook’s advice to pick one consistent measure).[31]

date,engineer,category,task,minutes,automatable,ticket
2026-10-12,alex,production interrupts,restart stuck queue consumer,25,yes,OPS-1412
2026-10-12,sam,release shepherding,manual canary checks for v4.18,60,yes,OPS-1415
2026-10-13,alex,business processes,grant read access to analytics bucket,15,yes,OPS-1419

4. SRE team charter (one page)

SRE TEAM CHARTER: <team name>
Mission:      keep <services> as reliable as their users need, at the lowest
              cost in toil and velocity.
Scope:        <services or platforms>. Out of scope: <list>.
Model:        <kitchen sink | infrastructure | tools | product | embedded | consulting>
Commitments from SRE:
              SLO tooling; burn-rate alerting; PRRs; capacity planning;
              shared on-call for onboarded services.
Commitments from development teams:
              own SLOs with product; keep monitoring and runbooks current;
              join postmortems; take back operational work above the cap.
Toil cap:     <e.g. 50%> of SRE time; measured <monthly>;
              excess redirected by <mechanism>.
Hand-back:    if development commitments lapse for <period>, SRE hands back the
              pager after notice to <role>.
Review:       charter reviewed <yearly> by <sponsor>.

The postmortem template and its review checklist live in IncidentOps; for budget-triggered reviews, fill in the budget consumed and include the P0 action the policy requires.

Approach Primary question Unit of control Choose it when Atlas page
SRE How reliable is reliable enough, and what happens when we are not? SLOs and error budgets Reliability trade-offs need a shared, numeric rule This page
DevOps How do changes flow quickly and safely to users? Delivery system, DORA metrics Delivery is slow or risky DevOps
Platform engineering How do teams get paved roads? Internal platform product Many teams rebuild the same infrastructure PlatformOps
IT service management How are services agreed, changed and supported? SLAs, change and incident processes Contracts, audits, many internal customers ITOps, ServiceOps
Traditional ops team Who keeps production running? Tickets and runbooks Stable, low-change systems SysOps

The approaches combine; they are not alternatives you must pick between.

Is SRE just operations with a new name? It should not be. The differences are mechanisms: explicit SLOs, a budget that changes release behaviour, an enforced cap on operational work, and engineers expected to automate toil away. Without them, you have the “Fake SRE” anti-type.[3]

Do we need an SRE team to practise SRE? No. Many organisations start with SLOs and error budgets owned by product teams; Google’s team-model article recommends allocating some engineering time and at least one part-time advocate before choosing a team model.[10]

What is the difference between an SLO and an SLA? Ask what happens when it is missed. If there is no explicit consequence, it is almost certainly an SLO; an SLA carries consequences, usually financial.[4]

Should SLO alerts replace all other alerts? For pages, mostly: pages should reflect user impact and need human action.[28] Keep a few pages for imminent risks that SLIs cannot see yet, such as an expiring certificate or a filling disk.

Does SRE apply to data pipelines and ML? Yes, with different SLIs: freshness, correctness and coverage for pipelines.[13] Model quality is harder to express as good/valid events; see MLOps and LLMOps.

Established capability.

  • Dependency budgeting. The Calculus paper corrects a misreading of the extra-9 rule: deeper dependencies do not each need another nine. Count each unique critical dependency once; with N of them, each gets 1/N of the dependency share. Its example splits a 0.01% budget half and half between the service’s own failures and its dependencies, and typical services have about 5 to 10 critical dependencies.[9]
  • Overload engineering. Cascading failures grow through positive feedback, and overload is their most common cause. Deadline propagation, load shedding, graceful degradation and retry budgets are reliability features.[48]

Active practice, still settling. The first two items are Google’s own practice, published on sre.google, not yet an industry consensus.

  • Systems-theoretic incident analysis. Google says it is “reexamining our beliefs about why incidents occur” and uses two methods based on the STAMP causality model: STPA, which is forward-looking and looks for risks nobody is seeking, and CAST, which is retrospective and feeds postmortems.[32] Both extend Practice 6.
  • Product-focused reliability. SREs accept accountability for a product’s critical functionality rather than for a set of services, define reliability in the product’s terms (critical user journeys), and combine service, client-side and end-to-end SLOs.[25] It extends Practice 1.
  • Composite SLOs. OpenSLO v1 lets an SLO weight several objectives (compositeWeight),[41] and a v2alpha schema is published.[38] Check your back end before relying on composites for alerting.
  • Chaos engineering tied to budgets. The principles of chaos call for steady-state hypotheses, real-world variables, production experiments, automation and a minimal blast radius;[40] experiment only when the budget can absorb it. In Catchpoint’s 2026 report only 17% of respondents ran such experiments regularly in production, and nearly two-thirds said performance degradations are as serious as outages, an argument for latency SLIs on every user-facing journey.[14]

Claimed direction, not independently evidenced. Google’s announcement of the second edition says SLO practice has matured into “user-centric, multi-tiered SLOs with dynamic burn-rate alerting and automated policy enforcement”, and that the book covers generative AI for incident triage and postmortems.[12] Vendors market AI agents that investigate or remediate incidents, but independent evidence on outcomes is thin. Keep human approval for production changes and for automated enforcement of a halt.

Stage What to do Output
Prerequisites Linux and networking; one programming language; the DevOps page; a metrics system such as Prometheus You can read a dashboard and write a query
1-day primer Read the SRE book’s introduction, “Embracing Risk”, “Service Level Objectives” and “Eliminating Toil”[1][2][4][17] You can explain SLI, SLO, error budget and toil in your own words
1-week practice The Art of SLOs materials;[36] Labs 1 and 2; the workbook’s “Implementing SLOs” and “Alerting on SLOs”[13][16] Draft SLO document for one service
30 days Lab 3; a policy written with your product manager; a toil log; shadow an on-call rotation; the example postmortem[52] Signed policy, burn-rate alerts, toil baseline
Advanced The Calculus paper;[9] cascading failures;[48] canarying;[20] intent-based capacity;[34] lead a PRR A dependency budget and a PRR report
Portfolio ideas An SLO-as-code repository with OpenSLO and Sloth specs and promtool tests; a blameless postmortem of a public outage; a burn-rate simulator for your own traffic Evidence a team can review

Leaders’ route: the 30-second definition, Practice 3, the decision framework, the judgement call and the cheat sheet.

Topic Remember
Key decision Which journeys get SLOs, at what target, and what happens when the budget runs out
Core artefacts SLO document, signed policy, burn-rate alerts, toil log, postmortems, PRR checklist
Targets Below 100% and below what dependencies allow; 99.9% over 28 days ≈ 40 bad minutes
Policy Budget exhausted: halt releases whatever the cause; the cause decides the work mix
Alerts Page at 14.4× (1 h + 5 min) and 6× (6 h + 30 min); ticket on slower burns
People Toil and on-call capped and measured, with a way to hand work back
Watch-outs Fake SRE, unsigned policies, five nines by default, cause-based paging, one error definition per artefact
Next actions Pick two journeys, measure for four weeks, agree SLOs, sign the policy, review weekly

A judgement call: freeze or ship when the budget is gone

Link to section “A judgement call: freeze or ship when the budget is gone”

Assumptions. The leak is the team’s own code, so the policy requires reliability work, and no cause lifts the halt. The feature can sit behind a flag for that customer alone. The business values the missed-date penalty above a few more days of overspend; nobody can quantify either side.

Option A: ship as planned. Attractive because the contract is concrete and the budget abstract. Wrong as a default: once a policy is ignored for a deadline, every later halt becomes a negotiation by seniority, and the change lands on a service already failing users.

Option B: halt absolutely. Faithful to the text, but it may protect the policy at the expense of its purpose: a flag limited to one tenant, after the leak fix, may put few users at risk.

Decision process. Use the policy’s escalation path, which covers disputes about its actions: the named executive decides on a written request that states the risk and the conditions. A defensible outcome is a recorded exception with conditions: ship the leak fix first and confirm the burn rate has fallen below 1; launch behind a flag for the one customer, with a canary compared against a control group;[20] rehearse the rollback; keep every other release halted until the service is back within SLO; and review the exception at the next budget meeting.

Why this is not a loophole. The exception is visible, narrow, conditional and decided by the role the policy names; if such exceptions become frequent, the SLO, policy or release process must change. Remaining uncertainty: if the leak fix does not reduce the burn, the conditions fail and the launch slips; say so up front.

After this page you should be able to explain SLI, SLO, SLA, error budget, burn rate and toil as one control loop; design an SLI for a user journey, including what counts as valid and good; calculate budgets, burn rates and time to exhaustion, and check a target against dependencies; configure and test multiwindow, multi-burn-rate alerts; write an SLO document and an error-budget policy that stakeholders can sign; and evaluate whether to adopt SRE practices, build an SRE team, or neither.

Mastery check

  1. A service has an SLO of 99.95% over 28 days and serves 20 million valid requests in that window. What is its error budget in requests, and roughly how many minutes of total outage would spend it if traffic were even?
Show answer for question 1

Budget = (1 − 0.9995) × 20,000,000 = 10,000 failed requests; as time, 0.05% × 40,320 ≈ 20.2 minutes of total outage. An outage at peak spends it faster than one at night.

  1. With a 99.9% SLO, the error ratio has been 0.4% for the last 30 hours (and near zero before). What is the burn rate, and which of the workbook’s alert pairs fire?
Show answer for question 2

Burn rate = 0.004 ÷ 0.001 = 4, below both page thresholds. Both ticket pairs fire: the 24-hour and 2-hour ratios are 0.4% (above 0.3%), and the 3-day ratio is about 0.4% × 30 ÷ 72 ≈ 0.17% (above 0.1%).[16] A 30-day budget lasts 7.5 days at this pace: a working-hours ticket, not a 3 a.m. page.

  1. Users complain about failed checkouts all week, yet the SLO is green. Give two likely causes and a check for each.
Show answer for question 3

(1) The SLI is measured too far from the user, such as server logs that miss failures at the edge; check with a prober or client data.[13] (2) “Good” is defined wrongly, such as 200 responses carrying an error message; sample responses against complaints.

  1. Your service has three unique critical dependencies whose measured availability is 99.9% each. The product manager wants a 99.95% SLO. Is it realistic, and what are your options?
Show answer for question 4

Not as designed: assuming independent failures, 0.999³ ≈ 99.7%; even fully correlated failures would cap it at 99.9%. The extra-9 rule wants dependencies about one nine better than the service.[9] Options: raise their effective availability with mitigations such as a capacity cache, failing open or graceful degradation; make some non-critical; or lower the target and tell dependants.

  1. Over the trailing four weeks a service has used 120% of its error budget. Failures from a partner’s load test against production account for 50 points of that. Does the release halt apply?
Show answer for question 5

Not once the calculation is corrected. The example policy’s halt has no cause-based exemption, so as computed, it applies. But load testers are out of scope, so the calculation is wrong: exclude their traffic from valid events in the reviewed spec and recompute. About 70% is consumed (slightly more, as removing their requests also shrinks the budget), so the halt condition no longer holds. A disputed recalculation goes to the named executive.[21] Had the corrected figure exceeded 100%, the halt would apply, and the out-of-scope cause would only let feature work continue unreleased.

  1. Which of these are toil? (a) Writing a tool that resizes volumes automatically; (b) resizing a volume by hand for each new customer; © a postmortem; (d) approving the same access request type every day.
Show answer for question 6

(b) and (d): manual, repetitive, automatable, without enduring value, growing with the service.[17] (a) removes toil; © needs judgement and produces lasting value.

  1. A vice-president asks for a 100% availability SLO on payments “because money is involved”. How do you respond?
Show answer for question 7

Agree on the intent, not the number. 100% is the wrong target for nearly every service;[1] users’ devices are less reliable than that,[2] and it leaves no budget for change. Offer a high target per journey, a strict policy, and investment in the Calculus paper’s three levers: fewer outages, smaller scope, faster recovery.[9]

SRE’s lasting contribution is not a job title or a tool. It makes reliability negotiable in numbers: decide what users need, admit that 100% is neither possible nor desirable, and treat the gap as a budget that funds change. The rest (burn-rate alerts, toil caps, readiness reviews, blameless postmortems, sustainable on-call) protects that budget and gives engineers time to engineer.

The hard part is organisational. Measuring an SLI takes a week; getting product, engineering and an executive to sign a policy that can stop a launch takes months, and keeping it after the first painful halt takes more. Teams that skip that step end up with dashboards, not SRE. Teams that do it gain something rare: a shared, explicit rule for one of the most contested trade-offs in software, and the evidence to change the rule when it is wrong.

All sources were opened on 2026-10-16; those marked 2026-10-17 were re-checked that day. “SRE book” is Site Reliability Engineering: How Google Runs Production Systems (O’Reilly, 2016) and “Workbook” The Site Reliability Workbook (O’Reilly, 2018), cited from their free editions at sre.google; quotations were checked against the page text. Re-check version-specific details before use.

Further reading

Changelog

  • 2026-10-16 — First version (r0): researched, written and diagram-checked by the managing author; Lab 2 executed; Labs 1 and 3 and the runbook commands not executed. Awaiting independent fact-check review.
  • 2026-10-17 — Revision r1 after the independent review: error-budget policy restated as the workbook’s two tiers; one error definition across the reference implementation and labs; Sloth set to 28 days; second edition, SREcon, STAMP/CAST and product-focused reliability sourced; postmortem template and action-closure KPI handed to IncidentOps; runbook least privilege; repetition cut. Lab 2 re-executed after reformatting.
  • 2026-10-17, post-score polish: traffic label and its missing-label caveat added to the reference implementation; survey fieldwork dated; Sloth v0.16.0 and Prometheus 3.15 named as the versions checked; figure 5 labels re-wrapped; four glossary quotations restored to the sources’ lower case.

  1. Introduction (Benjamin Treynor Sloss) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  2. Embracing Risk (Marc Alvidrez) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  3. DevOps Topologies — Matthew Skelton and Manuel Pais, n.d. (catalogue begun 2013). Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  4. Service Level Objectives (Chris Jones, John Wilkes, Niall Murphy et al.) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  5. SREcon14 — USENIX, event page for 30 May 2014, Internet Archive copy of 2014-06-25 (usenix.org blocks automated access). Checked 2026-10-16. ↩︎ ↩︎

  6. SREcon — USENIX, series page, Internet Archive copy of 2026-09-24. Checked 2026-10-16. ↩︎

  7. Google SRE books — Google, n.d. (lists the free books and the rewritten second edition). Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎

  8. Introducing Google Customer Reliability Engineering (CRE) — Dave Rensin, Google Cloud blog, 2016-10-11. Checked 2026-10-16. ↩︎ ↩︎

  9. The Calculus of Service Availability — Ben Treynor, Mike Dahlin, Vivek Rau, Betsy Beyer, ACM Queue, March–April 2017. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  10. How SRE teams are organized, and how to get started — Gustavo Franco and Matt Brown, Google Cloud blog, 2019-06-27. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  11. A history of DORA’s software delivery metrics — DORA (Google Cloud), updated 2026-01-02. Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  12. 10 Years of the SRE book: Announcing the second edition of “Site Reliability Engineering” — Betsy Beyer and David Huska, Google Cloud blog, 2026-10-13. Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  13. Implementing SLOs (Steven Thurgood, David Ferguson, Alex Hidalgo, Betsy Beyer) — Workbook, 2018. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  14. The SRE Report 2026: Reliability Is Being Redefined — Catchpoint / LogicMonitor press release, 2026-01-22 (vendor survey open July–August 2025, 418 responses). Checked 2026-10-16 and 2026-10-17. ↩︎ ↩︎ ↩︎

  15. Example SLO Document (Steven Thurgood) — Workbook, 2018 (document dated 2018-02-19). Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  16. Alerting on SLOs (Steven Thurgood et al.) — Workbook, 2018. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  17. Eliminating Toil (Vivek Rau) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  18. The Evolving SRE Engagement Model (Acacio Cruz, Ashish Bhambhani) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  19. Postmortem Culture: Learning from Failure (John Lunney, Sue Lueder) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  20. Canarying Releases (Alec Warner, Štěpán Davidovič et al.) — Workbook, 2018. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  21. Example Error Budget Policy (Steven Thurgood) — Workbook, 2018 (policy dated 2018-02-19). Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  22. SRE Best Practices for Capacity Management — Luis Quesada Torres and Doug Colish, USENIX ;login: vol. 45 no. 4, Winter 2020. Checked 2026-10-16. ↩︎ ↩︎

  23. How SRE Relates to DevOps (Niall Richard Murphy, Liz Fong-Jones, Betsy Beyer et al.) — Workbook, 2018. Checked 2026-10-16. ↩︎ ↩︎

  24. Recording rules (naming and aggregation) — Prometheus documentation, n.d. Checked 2026-10-16. ↩︎ ↩︎

  25. Product-Focused Reliability for SRE — Carl Crous, Parker Roth and Victoria Hurd, Google SRE, n.d. Checked 2026-10-16. ↩︎ ↩︎

  26. Sloth: introduction — Sloth project, n.d. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎

  27. Histograms and summaries — Prometheus documentation, n.d. Checked 2026-10-16. ↩︎ ↩︎

  28. Monitoring Distributed Systems (Rob Ewaschuk) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  29. Concepts in service monitoring (SLO monitoring) — Google Cloud Observability documentation, updated 2026-10-13. Checked 2026-10-16. ↩︎ ↩︎

  30. SLO period windows — Sloth documentation, n.d.; burn rates from google-28d.yaml (main branch); flag, catalogue and prometheus/v1 fields re-checked in the v0.16.0 source, released 2026-04-04. Checked 2026-10-16 and 2026-10-17. ↩︎ ↩︎

  31. Eliminating Toil (David Challoner et al.) — Workbook, 2018. Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  32. Systems-Theoretic Accident Model and Processes (STAMP) at Google — Google SRE, n.d. Checked 2026-10-16. ↩︎ ↩︎

  33. Being On-Call (Andrea Spadaccini) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎

  34. Software Engineering in SRE (Dave Helstroom, Trisha Weir et al.) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎

  35. Release Engineering (Dinah McNutt) — SRE book, 2016. Checked 2026-10-16. ↩︎

  36. The Art of SLOs — Google Customer Reliability Engineering, CC BY 4.0, n.d. Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  37. OpenSLO/OpenSLO — GitHub repository README (Apache-2.0), n.d. Checked 2026-10-16. ↩︎

  38. OpenSLO — OpenSLO project, n.d. (lists the v1, v2alpha and v1alpha schemas). Checked 2026-10-16. ↩︎ ↩︎

  39. Reliability pillar: design principles — AWS Well-Architected Framework, n.d. Checked 2026-10-16. ↩︎

  40. Principles of Chaos Engineering — principlesofchaos.org, last updated March 2019. Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  41. OpenSLO v1: SLO — OpenSLO project, n.d. Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  42. Pyrra — pyrra-dev, GitHub repository (Apache-2.0), n.d. Checked 2026-10-16. ↩︎ ↩︎

  43. Alerting rules — Prometheus documentation (latest), n.d. Checked 2026-10-16. ↩︎

  44. OpenSLO v1: SLI — OpenSLO project, n.d. Checked 2026-10-16. ↩︎

  45. Querying basics (time series selectors) — Prometheus documentation (latest = 3.15), n.d. Checked 2026-10-17. ↩︎

  46. Unit testing for rules — Prometheus documentation (latest = 3.15; v3.15.0 released 2026-09-25), n.d. Checked 2026-10-16 and 2026-10-17. ↩︎ ↩︎

  47. SLO Engineering Case Studies (Ben McCormack, William Bonnell et al.) — Workbook, 2018. Checked 2026-10-16. ↩︎ ↩︎

  48. Addressing Cascading Failures (Mike Ulrich) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  49. kubectl rollback implementation (rollback.go) — Kubernetes project source, master branch. Checked 2026-10-16. ↩︎

  50. kubectl rollout undo — Kubernetes documentation (v1.37 reference), last modified 2026-08-26. Checked 2026-10-16. ↩︎

  51. Deployments — Kubernetes documentation, last modified 2026-07-07. Checked 2026-10-16. ↩︎

  52. Example Postmortem — SRE book, 2016. Checked 2026-10-16. ↩︎

Related Ops

IncidentOps

IncidentOps is a rare, informal label for incident management: declaring, coordinating, communicating and learning from unplanned service disruptions. This page teaches that established practice, with a focus on human coordination under pressure.

ObservabilityOps

ObservabilityOps is this Atlas's name for running observability as an internal product: the telemetry pipeline, standards, budgets and alert hygiene that let engineers answer new questions about production at a predictable cost. The label itself is not standardised.

ServiceOps

Service operations and service management for digital services: service catalog, service ownership, service level management (SLA/SLO), service maps and dependencies, …

In preparation

DevOps

DevOps is a way of organising software delivery so that the people who build a service and the people who run it share goals, tools and feedback, letting changes reach users quickly, safely and repeatedly. It is judged by delivery outcomes, not job titles.

PlatformOps

PlatformOps is a less common name for platform engineering. This page uses it for the operating half: running an internal developer platform as a product, with service levels, support, upgrades and deprecation that keep its self-service golden paths trustworthy.

ReleaseOps

ReleaseOps is an informal label for turning deployed code into a deliberate, reversible change for users: versioning, cadence, progressive exposure, feature flags, rollback and release records. The exact name is also a ServiceNow product.

AutomationOps

AutomationOps is not a standard term. This Atlas uses it for running operational automation as a governed discipline: choosing what to automate, making it idempotent and safe to repeat, limiting how far one run can reach, and owning it until it is retired.

DisasterRecoveryOps

DisasterRecoveryOps is a rare label for IT disaster recovery run as an operational practice: agreeing how fast each service must return and how much data it may lose, then deciding when to invoke recovery, failing over, failing back and proving it all in drills.

Practise and get certified

From xOps School

Practise SRE (Site Reliability Engineering) and get certified

The free SRE (Site Reliability Engineering) track on xOps School has study notes, a 25-question practice quiz with explanations, and a verifiable certificate when you score 70% or more. Sign in with Google to start.

For teams

Instructor-led training

Live batches for your team, with completion certificates and reports for L&D/HR.

Source: master.md (the editorial source of this page) · built 2026-10-17 · diagrams rendered with @mermaid-js/mermaid-cli 11.17.0 (mermaid 11.17.2)