What SRE is
Link to section “What SRE is”SRE in 30 seconds
Link to section “SRE in 30 seconds”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.
At a glance
Link to section “At a glance”| 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) |
The problem SRE solves
Link to section “The problem SRE solves”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:
- 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]
- Alerting on causes. Pages fire on CPU, disk and queue depth that users never notice, so engineers learn to ignore pages.
- 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 |
What SRE is not
Link to section “What SRE is not”- 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.
Where SRE comes from and where it sits
Link to section “Where SRE comes from and where it sits”Origins and evolution
Link to section “Origins and evolution”| 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]
Glossary and mental model
Link to section “Glossary and mental model”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 |
How SRE relates to other Ops
Link to section “How SRE relates to other Ops”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 |
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.
Principles and operating model
Link to section “Principles and operating model”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.
- Mission. Keep each service as reliable as its users need, and no more, at the lowest cost in toil and lost velocity.
- Users define reliability. SLIs measure user-visible outcomes, not component health.
- Targets are explicit and agreed. Every tier-1 service has an SLO document approved by product, developers and on-call.
- The budget has consequences. A policy signed in advance says what happens when the budget runs out and who decides disputes.
- Engineering time is protected. Toil is measured. Above the cap, work is redirected rather than absorbed.
- Failure is information. Postmortems are blameless and their actions are prioritised like features.
- 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, team models and RACI
Link to section “Roles, team models and RACI”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 |
Lifecycle of an SRE engagement
Link to section “Lifecycle of an SRE engagement”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]
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.
Operating model and governance
Link to section “Operating model and governance”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”Reference architecture
Link to section “Reference architecture”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.
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.
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]
Core practices and playbooks
Link to section “Core practices and playbooks”Practice 1: choosing SLIs
Link to section “Practice 1: choosing SLIs”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.
Practice 4: alerting on burn rate
Link to section “Practice 4: alerting on burn rate”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.
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]
Practice 5: eliminating toil
Link to section “Practice 5: eliminating toil”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]
- Identify toil with the people who do it: business processes, production interrupts, release shepherding, migrations, cost engineering and capacity planning, and troubleshooting opaque architectures.
- Measure it in one consistent unit (hours, tickets, manual changes) before, during and after reduction.
- 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.
Practice 6: blameless postmortem culture
Link to section “Practice 6: blameless postmortem culture”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.
Practice 7: sustainable on-call
Link to section “Practice 7: sustainable on-call”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.
Methods, frameworks and tools
Link to section “Methods, frameworks and tools”Methods, standards and frameworks
Link to section “Methods, standards and frameworks”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]
Tooling landscape
Link to section “Tooling landscape”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 and AI
Link to section “Automation and AI”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.
SRE in practice
Link to section “SRE in practice”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.
Hands-on labs
Link to section “Hands-on labs”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
- Pick one user journey: “a signed-in user pays for the basket”.
- Write the SLI specification in user terms: what counts as success, and how fast is fast enough?
- Choose an SLI implementation: where you count events, and what that point misses.
- List what is valid and what is excluded (load tests, blocked bots, health checks).
- Pick a target and window; compute the budget for 28 days with 30 million valid requests.
- 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
- 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()
- 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 to0.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
ratioreturn 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 rulesthat a 1% error rate pages (via the 6-hour pair) and a 0.05% error rate does not.[16][46] - Prerequisites:
promtoolfrom 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.
- 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’strafficfilter.
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
- 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: []
- Run
promtool check rules checkout-slo.rules.yaml, thenpromtool test rules checkout-slo.test.yaml.
- Expected output:
check rulesreports success and 5 rules found;test rulesreports 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+995x480and0+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__andalertname.[46] Empty recording rules usually mean the regex orjoblabel is wrong. - Teardown: Delete the two files; deploy real rules through your normal change process.
Use cases and scenarios
Link to section “Use cases and scenarios”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.
Measure, govern, pay
Link to section “Measure, govern, pay”Metrics and KPIs
Link to section “Metrics and KPIs”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%.
- Budget = (1 − 0.999) × 50,000,000 = 50,000 failed requests.
- Observed failures = 31,000, so SLI = 1 − 31,000 ÷ 50,000,000 = 99.938%: met, with a margin of 0.038 percentage points.
- Budget consumed = 31,000 ÷ 50,000 = 62%; remaining 38%, or 19,000 requests.
- One incident caused 12,500 failures = 25% of the budget, above the example policy’s 20% postmortem trigger.[21]
- 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%.
- 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.
Quality, security and compliance
Link to section “Quality, security and compliance”- 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.
Cost, capacity and sustainability
Link to section “Cost, capacity and sustainability”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.
Assurance of the operating model
Link to section “Assurance of the operating model”- 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.
When things go wrong
Link to section “When things go wrong”Common failures and troubleshooting
Link to section “Common failures and troubleshooting”| 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.
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-patterns and myths
Link to section “Anti-patterns and myths”| 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 |
Deciding and adopting
Link to section “Deciding and adopting”When to use SRE and when not to
Link to section “When to use SRE and when not to”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.
Decision framework
Link to section “Decision framework”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.
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.
Maturity model
Link to section “Maturity model”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 |
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.
Adoption roadmap: the first 90 days
Link to section “Adoption roadmap: the first 90 days”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).
Toolkit
Link to section “Toolkit”Checklists
Link to section “Checklists”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_fractionaccepted 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.
Templates
Link to section “Templates”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.
Deep comparisons
Link to section “Deep comparisons”| 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.
Going further
Link to section “Going further”Advanced topics and emerging direction
Link to section “Advanced topics and emerging direction”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.
Learning path
Link to section “Learning path”| 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.
Wrap-up
Link to section “Wrap-up”Executive recap and cheat sheet
Link to section “Executive recap and 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.
Learning objectives and mastery check
Link to section “Learning objectives and mastery check”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
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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]
Conclusion
Link to section “Conclusion”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.
Sources and further reading
Link to section “Sources and further reading”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
- Ben Treynor Sloss on SRE and SRE team responsibilities — Google, interview page, n.d.
- Prometheus HTTP API and promtool command reference — Prometheus documentation.
- Sloth CLI usage and the OpenSLO v1 Service schema.
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:
trafficlabel 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.
Introduction (Benjamin Treynor Sloss) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Embracing Risk (Marc Alvidrez) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
DevOps Topologies — Matthew Skelton and Manuel Pais, n.d. (catalogue begun 2013). Checked 2026-10-16. ↩︎ ↩︎ ↩︎
Service Level Objectives (Chris Jones, John Wilkes, Niall Murphy et al.) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
SREcon14 — USENIX, event page for 30 May 2014, Internet Archive copy of 2014-06-25 (usenix.org blocks automated access). Checked 2026-10-16. ↩︎ ↩︎
SREcon — USENIX, series page, Internet Archive copy of 2026-09-24. Checked 2026-10-16. ↩︎
Google SRE books — Google, n.d. (lists the free books and the rewritten second edition). Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎
Introducing Google Customer Reliability Engineering (CRE) — Dave Rensin, Google Cloud blog, 2016-10-11. Checked 2026-10-16. ↩︎ ↩︎
The Calculus of Service Availability — Ben Treynor, Mike Dahlin, Vivek Rau, Betsy Beyer, ACM Queue, March–April 2017. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
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. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
A history of DORA’s software delivery metrics — DORA (Google Cloud), updated 2026-01-02. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
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. ↩︎ ↩︎ ↩︎
Implementing SLOs (Steven Thurgood, David Ferguson, Alex Hidalgo, Betsy Beyer) — Workbook, 2018. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
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. ↩︎ ↩︎ ↩︎
Example SLO Document (Steven Thurgood) — Workbook, 2018 (document dated 2018-02-19). Checked 2026-10-16. ↩︎ ↩︎ ↩︎
Alerting on SLOs (Steven Thurgood et al.) — Workbook, 2018. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Eliminating Toil (Vivek Rau) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
The Evolving SRE Engagement Model (Acacio Cruz, Ashish Bhambhani) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
Postmortem Culture: Learning from Failure (John Lunney, Sue Lueder) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Canarying Releases (Alec Warner, Štěpán Davidovič et al.) — Workbook, 2018. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Example Error Budget Policy (Steven Thurgood) — Workbook, 2018 (policy dated 2018-02-19). Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
SRE Best Practices for Capacity Management — Luis Quesada Torres and Doug Colish, USENIX ;login: vol. 45 no. 4, Winter 2020. Checked 2026-10-16. ↩︎ ↩︎
How SRE Relates to DevOps (Niall Richard Murphy, Liz Fong-Jones, Betsy Beyer et al.) — Workbook, 2018. Checked 2026-10-16. ↩︎ ↩︎
Recording rules (naming and aggregation) — Prometheus documentation, n.d. Checked 2026-10-16. ↩︎ ↩︎
Product-Focused Reliability for SRE — Carl Crous, Parker Roth and Victoria Hurd, Google SRE, n.d. Checked 2026-10-16. ↩︎ ↩︎
Sloth: introduction — Sloth project, n.d. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎
Histograms and summaries — Prometheus documentation, n.d. Checked 2026-10-16. ↩︎ ↩︎
Monitoring Distributed Systems (Rob Ewaschuk) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Concepts in service monitoring (SLO monitoring) — Google Cloud Observability documentation, updated 2026-10-13. Checked 2026-10-16. ↩︎ ↩︎
SLO period windows — Sloth documentation, n.d.; burn rates from google-28d.yaml (main branch); flag, catalogue and
prometheus/v1fields re-checked in the v0.16.0 source, released 2026-04-04. Checked 2026-10-16 and 2026-10-17. ↩︎ ↩︎Eliminating Toil (David Challoner et al.) — Workbook, 2018. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
Systems-Theoretic Accident Model and Processes (STAMP) at Google — Google SRE, n.d. Checked 2026-10-16. ↩︎ ↩︎
Being On-Call (Andrea Spadaccini) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎
Software Engineering in SRE (Dave Helstroom, Trisha Weir et al.) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎
Release Engineering (Dinah McNutt) — SRE book, 2016. Checked 2026-10-16. ↩︎
The Art of SLOs — Google Customer Reliability Engineering, CC BY 4.0, n.d. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
OpenSLO/OpenSLO — GitHub repository README (Apache-2.0), n.d. Checked 2026-10-16. ↩︎
OpenSLO — OpenSLO project, n.d. (lists the v1, v2alpha and v1alpha schemas). Checked 2026-10-16. ↩︎ ↩︎
Reliability pillar: design principles — AWS Well-Architected Framework, n.d. Checked 2026-10-16. ↩︎
Principles of Chaos Engineering — principlesofchaos.org, last updated March 2019. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
OpenSLO v1: SLO — OpenSLO project, n.d. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
Pyrra — pyrra-dev, GitHub repository (Apache-2.0), n.d. Checked 2026-10-16. ↩︎ ↩︎
Alerting rules — Prometheus documentation (latest), n.d. Checked 2026-10-16. ↩︎
OpenSLO v1: SLI — OpenSLO project, n.d. Checked 2026-10-16. ↩︎
Querying basics (time series selectors) — Prometheus documentation (latest = 3.15), n.d. Checked 2026-10-17. ↩︎
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. ↩︎ ↩︎
SLO Engineering Case Studies (Ben McCormack, William Bonnell et al.) — Workbook, 2018. Checked 2026-10-16. ↩︎ ↩︎
Addressing Cascading Failures (Mike Ulrich) — SRE book, 2016. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
kubectl rollback implementation (rollback.go) — Kubernetes project source, master branch. Checked 2026-10-16. ↩︎
kubectl rollout undo — Kubernetes documentation (v1.37 reference), last modified 2026-08-26. Checked 2026-10-16. ↩︎
Deployments — Kubernetes documentation, last modified 2026-07-07. Checked 2026-10-16. ↩︎
Example Postmortem — SRE book, 2016. Checked 2026-10-16. ↩︎