CHAPTER DEEP READ · SRE · CH 6
Site Reliability Engineering · Ch 6 · Google (Rob Ewaschuk) · 2016
Your payment fails at 2 a.m. and by morning it works again — somewhere in between, a person almost certainly got woken up by a phone. This chapter is about when that phone should ring: which numbers a live service ought to watch, what counts as "broken," and what is worth pulling a human out of bed for.
Think of the smoke detectors in your house. How many do you want? One goes off when the kitchen is actually on fire, and you believe it. Install twenty of them, tuned to be maximally sensitive, and they scream every time you fry an onion or take a hot shower — and within a month you will have pulled every battery out. On the day there is a real fire, nobody is listening. That is the outcome this chapter spends every page trying to prevent: an alarm nobody trusts is worse than no alarm at all.
Most people assume the goal here is "make it smarter" — ideally a system that works out on its own what broke and why, so humans just wait for the verdict. Google says they tried that and deliberately walked away. The reason is mundane: the cleverer the system, the more tangled its insides, and when something really breaks you first have to spend half an hour working out why it is saying what it's saying — and you only had five minutes. What they picked instead sounds almost unambitious: dumb and fast.
A service can emit thousands of numbers, but only four are worth watching all the time — the same four that tell you how a restaurant is doing: how long the food takes, how many people walked in, how many plates went out wrong, and how much room the kitchen has left. The first three tell you how things are right now. The fourth is the only one that warns you in advance — a kitchen about to seize up still gives you time to add hands; once the food genuinely stops coming out, you're already late.
And here is the trap almost everyone falls into: when you time how long the food takes, count the wrong orders separately. Because a collapsed kitchen refuses orders very quickly — "sorry, can't do it" takes two seconds. Mix those in and the number will cheerfully report that service is faster than ever. Everything looks wonderful; the restaurant has fallen over.
Knowing something is off and waking a person are two different acts. The bar this chapter sets is close to severe: anything allowed to pull a human out of bed must clear all three — genuinely urgent, genuinely something to be done, and genuinely requiring a human's judgement. That last one bites hardest: if everything you do after being woken is follow a sheet of paper and click a few times, then this should never have woken you — a machine should be doing the clicking. People get woken because a brain is needed, not a pair of hands.
Follow that bar and things sort themselves into three tiers: needs someone now — ring the phone; needs a person but not tonight — open a ticket and handle it within days; needs nobody — write it to a log, where it sits until the day something breaks and it becomes the only record of what actually happened.
The honest cost: this approach means that in the first minutes of an outage you will know that something is broken without being able to say what — so none of the detailed internal numbers can go away. They just aren't allowed to phone anyone.
Four things are enough: how slow, how busy, how wrong, how full — and only the last one warns you early. The bar for waking a human is urgent, actionable, and needing judgement; anything you'd answer by clicking through a checklist belongs to a machine. Once there are too many alarms, people stop believing them — and that is worse than having none.
Want the mechanisms, the numbers and the diagrams? → Switch to the deep read
You'd expect a chapter on monitoring to be about collecting more. It is almost entirely about subtraction: Google explicitly gave up on monitoring that tries to learn thresholds and infer root causes, demanding instead that it be simple, fast and predictable; it elevates four golden signals — latency, traffic, errors, saturation — as the minimum sufficient set; and it puts a near-brutal bar on paging: every page must be urgent, actionable and require human judgement — and the moment its response is mechanical, it belongs to a machine, not to a sleeping engineer.
p99 is "the slowest one out of a hundred requests." Histogram: counting observations into buckets, which gives you a distribution rather than a single average.Written by Rob Ewaschuk, this chapter grew out of an internal Google document of his, My Philosophy on Alerting, that circulated widely before the book existed. It closes Part II, "Principles": Chapter 3 taught you to price reliability with an error budget, Chapter 4 to write that target down as an SLO, Chapter 5 to cut toil away — and this one answers what you should actually watch, and when a human deserves to be woken. It sets up Part III's practices: the on-call chapter and the troubleshooting chapter both assume your alerts are already clean. In the real world it maps onto every team's Prometheus/Grafana dashboards and PagerDuty rotation.
"More monitoring can't hurt" is one of the most expensive wrong sentences in the industry. A service can easily export ten thousand metrics, every one of them can carry a threshold alert, and each addition makes the team feel slightly safer. The actual result: the on-call phone fires a dozen times a night, and twelve of those need nobody to do anything. Three months later the on-call engineer has built the muscle memory of glance-dismiss-sleep — and the one real alert, sitting in that pile, gets dismissed too. That is what this chapter is for: not "how do I monitor more," but "how do I make every wake-up worth it."
It also guards the other flank — finding out you're down only when users complain. But the book's judgement is blunt: over-monitoring is a harder problem to solve than under-monitoring, because what you have to repair is a person's trust in the system, and that takes far longer to rebuild than to destroy. The staffing figure the book gives says something too: on a typical SRE team of ten or so, one or two people's time goes into building and maintaining monitoring.
The chapter opens by laying the uses out: analysing long-term trends, comparing over time or between experiment groups, alerting, building dashboards, and conducting ad hoc retrospective analysis. Of those five, only alerting consumes human sleep — and that distinction is the chapter's foundation. Dashboards can be as elaborate as you like, metrics as numerous, logs as long-lived: none of it disturbs anyone. But the moment a rule is wired to a pager it starts spending money, and the currency is the on-call engineer's attention. The companion principle is one people routinely forget: monitoring should never require a human to interpret it. Software does the interpreting; people are notified only when they need to take action. A system that needs someone watching a graph to decide whether a wobble counts is already a design failure.
The chapter splits the question monitoring answers in two: the symptom — what is broken; and the cause — why. The book's examples are refreshingly concrete: the symptom is "I'm serving HTTP 500s and 404s," the cause might be "database servers are refusing connections"; the symptom can even be "users in Antarctica aren't receiving their animated cat GIFs," with the cause being a CDN that has blacklisted a range of client IPs.
The conclusion is that alerts should only fire on symptoms: a symptom is a user actually suffering, whereas the cause is one of a hundred possibilities and you will frequently guess wrong. Causes live in dashboards and white-box metrics — the things you dig through after a symptom has summoned you. And there's an elegant observation here: in a layered system, one person's symptom is another's cause. "The database is slow" is a symptom to the DBA and a cause to the frontend that calls it. So symptom and cause aren't absolute labels — they are relative to the layer you own.
White-box monitoring reads what the system exports from inside: counters from HTTP handlers, logs, runtime statistics. Its unique power is seeing masked problems and imminent ones — requests that succeeded only on retry, where the user felt nothing but the retry rate has gone up tenfold; a disk that isn't full yet but will be in four hours at the current rate.
Black-box monitoring probes from outside as a user would, and is symptom-oriented: what it reports is always actively happening rather than "might be about to." That makes it naturally suited to paging — when it fires, someone really is hurting right now.
Hence Google's stance: paging leans heavily on black-box monitoring plus a small number of symptom-oriented white-box rules; the bulk of white-box data goes to dashboards and debugging. Put the other way round — if most of your pages are wired to internal white-box metrics (CPU is high, a queue is long, a process restarted), you are mostly being woken to handle things no user has noticed.
The most-quoted passage in the book: if you can only measure four metrics of your user-facing system, measure these — latency, traffic, errors, saturation. The promise is direct: measure all four and page a human when one is problematic (or, for saturation, nearly so), and your service will be at least decently covered by monitoring.
Latency: how long it takes to serve a request. This holds the chapter's most counterintuitive rule: track the latency of successful and failed requests separately. A service that has lost its database connection returns HTTP 500 extremely fast — a few milliseconds to say "I can't." Blend them together and during the worst minutes of an outage your dashboard's average latency will improve. The book adds a line that gets quoted constantly: a slow error is even worse than a fast error — so failed-request latency deserves watching in its own right.
Traffic: a measure of how much demand is being placed on the system, in units that fit the business. For a web service it's usually HTTP requests per second, broken down by the nature of the request (static assets versus dynamic endpoints differ in cost by an order of magnitude); for an audio streaming system it's network I/O rate or concurrent sessions; for a key-value store, transactions and retrievals per second.
Errors: the rate of failing requests, in three flavours — explicit (an HTTP 500), implicit (an HTTP 200 carrying the wrong content), and by policy (if you committed to one-second responses, a request that succeeds in 1.2 seconds is by definition an error). Implicit errors are the hardest to catch — usually only end-to-end content checks find them — and they are exactly the kind that damage user trust most.
Saturation: how "full" the service is, emphasising the most constrained resource. It is the only one of the four with a predictive character, and it comes with three points: ① many systems degrade before utilisation reaches 100%, so you want a utilisation target rather than waiting for full; ② rising latency is often a leading indicator of saturation — measuring p99 latency over a small window (say one minute) can flag saturation well before the resource genuinely runs out; ③ it should also answer predictions like "at this rate your database will fill its hard drive in four hours."
The chapter gives the tail its own section, because confusing "an average of 100 ms" with "99% of requests at 10 ms and 1% stuck at 5 seconds" is the classic statistical mistake — the averages can match while the user experience could not be further apart. An average is a lie told by a bimodal distribution.
The fix isn't computing a few more percentiles; it's changing how you collect. Don't compute an average server-side and report it — bucket requests by how long they took: 0–10ms, 10–30ms, 30–100ms, 100–300ms… with roughly exponentially growing boundaries. Now what you ship is a distribution: any percentile can be derived afterwards, and buckets from many machines can simply be added together. This is exactly where the histogram in today's Prometheus comes from.
Resolution is the other trade-off: sampling more densely gives a fuller signal, but the cost of collecting, transferring, storing and querying rises with it. The chapter is refreshingly concrete — for a web service targeting 99.9% annual uptime (no more than about nine hours of aggregate downtime a year), probing for a success status more than once or twice a minute is probably unnecessarily frequent; and checking hard-drive fullness more than once every one to two minutes is probably unnecessary too. Beyond that you are burning money.
But the opposite failure is just as real: a per-minute CPU number hides the truth — the multi-second spikes that drive high tail latency simply vanish in a one-minute average. The book's answer is neat: sample at high frequency inside the server, aggregate in place, report infrequently — record CPU utilisation once a second, increment a bucket at 5% granularity, and ship the whole bucketed distribution once a minute. You get per-second resolution while paying per-minute transfer and storage costs.
The chapter lands on a value judgement: a monitoring system should be as simple as possible, but no simpler. The pressure comes from every direction — catch ever rarer anomalies, add more signal sources, let it infer causes for you — and pile enough of that on and the monitoring system itself becomes a complex system that needs a dedicated owner and that nobody dares touch during an incident. The book's three subtraction tests are genuinely usable:
This also explains Google's apparently unambitious choice: they deliberately avoided "magic" monitoring that tries to learn thresholds and infer causality automatically. The reason is practical — when something actually breaks, you'd first have to debug the magic system's own reasoning, and an incident gives you no time for that. Their experience is that simple, fast monitoring plus good tools for post hoc analysis beats a clever system nobody can follow.
Table 1 · Black-box vs white-box: which one, when
| Black-box | White-box | |
|---|---|---|
| Vantage | Outside the system, probing as a user does | Counters, logs and statistics exported from inside |
| Answers | What is broken (symptom) | Why it is broken (cause), and what is about to break |
| Tense | Only reports problems happening right now | Sees failures masked by retries; predicts ("disk full in 4h") |
| Wire to a pager? | Yes — the mainstay of paging | Only a few symptom-oriented rules; the rest goes to dashboards |
| Cost | Tells you it broke, not where; the probe itself can misfire | Most "something is off inside" is invisible to users — a noise source if paged |
Table 2 · The four golden signals: what to measure, and where it goes wrong
| Signal | What it measures | Typical instrumentation | Most common mistake |
|---|---|---|---|
| Latency | Time to serve a request | Bucketed histogram → p50/p95/p99; success and failure separately | Blending failures in: fast 500s during a crash make average latency look better |
| Traffic | Demand placed on the system | Requests/sec split static vs dynamic; streaming → network I/O or concurrent sessions; KV store → transactions and retrievals/sec | One blanket QPS number hiding request types whose cost differs by an order of magnitude |
| Errors | Rate of failing requests | Explicit (500) / implicit (200 with wrong content) / by policy (promised 1s, 1.2s counts as an error) | Counting only explicit errors; implicit ones hurt trust most and hide best |
| Saturation | Headroom in the most constrained resource | Utilisation and headroom for memory / I/O / CPU; short-window p99 latency as a leading indicator; "full in N hours" projections | Waiting for 100% — most systems degrade well before they are full |
Table 3 · Which tier should a rule output to
| Output | Test | Response time | Examples |
|---|---|---|---|
| Page | Urgent + actionable + requires human judgement (all three) | Immediately | User-facing error rate breaching the SLO; service unreachable |
| Ticket | A human is needed, but tonight changes nothing | Within days | A replica running short on capacity; a certificate expiring in three weeks |
| Logging | Nobody needs to look at it | Forensics only | Per-request detail; internal state kept for debugging |
| Nothing | The response is mechanical and scriptable | — | Automate it, don't page — people are woken because a brain is needed, not a pair of hands |
The chapter also supplies a checklist for "should this alert exist at all," worth pinning to a wall:
The accompanying sentiment is equally blunt: pages should be urgent, important, actionable and intelligent, and each one should ideally concern a novel problem rather than the fortieth recurrence of an old one. Err on the side of deleting a noisy alert — over-monitoring is a harder problem to solve than under-monitoring.
This is probably the most externally influential chapter in the whole book: the four golden signals have become the industry's shared vocabulary for monitoring. Open a Grafana service dashboard template, Kubernetes' default monitoring, the metrics a service mesh like Istio generates for free, or a Datadog / New Relic service overview, and the skeleton is some variant of these four; the histogram being a first-class citizen in Prometheus descends directly from this chapter's "ship distributions, not averages." It has also grown two widely used dialects: RED (Rate, Errors, Duration) is the four signals trimmed for request-driven services, dropping saturation; USE (Utilisation, Saturation, Errors) is the resource-side dual. The common pairing in practice is RED for services, USE for machines — which together cover the four golden signals completely.
In interviews this chapter is the source of the standard answers on monitoring and observability: should alerts fire on symptoms or causes? (symptoms — causes are one of a hundred and you'll guess wrong) why isn't average latency enough? (an average is a lie told by a bimodal distribution; look at the distribution and the tail) why separate success and failure latency? (failures return fast, so blending them makes an outage look like a performance win). Answer those three cleanly and you've read the chapter properly.
99.9% SLO, page on a 1-hour window at a 14.4× burn rate (about 2% of the error budget consumed in an hour), and raise a slower alert on a 6-hour window at 6× (about 5% in six hours). This is the most authoritative upgrade to the threshold-alerting model this chapter describes.The SRE Workbook, "Alerting on SLOs", 2018 ↗p99 across machines — percentiles are not additive; add the per-machine bucket counts first, then compute the percentile. (Which is precisely the benefit of shipping distributions rather than single values.)① In one line: this chapter is about subtraction — not how to monitor more, but how to make every wake-up worth it.
② Monitoring has five uses (trends, comparison, alerting, dashboards, retrospective analysis) and only alerting costs human sleep; monitoring should never require a human to interpret it.
③ Alert on symptoms, dashboard the causes; in a layered system one person's symptom is another's cause. Black-box wakes people (it fires only when someone is really hurting); white-box explains and predicts.
④ The four golden signals: latency, traffic, errors, saturation. Measure all four, page when one goes bad, and coverage is at least decent. Saturation is the only leading indicator, and most systems degrade before 100%.
⑤ The most counterintuitive rule: count success and failure latency separately — failures return fast, so blending them makes a serious outage look like a performance win; and a slow error is worse than a fast one.
⑥ Ship distributions, not averages: bucket by latency with roughly exponential edges, derive percentiles afterwards, and add buckets across machines.
⑦ Resolution is a cost trade-off: for a 99.9% service, probing status once or twice a minute suffices; but CPU needs per-second internal sampling, 5%-granularity buckets, reported once a minute to get high resolution cheaply.
⑧ Three subtraction tests: workhorse rules stay simple and predictable; configuration exercised less than quarterly should go; signals on no dashboard and in no alert should go. Google deliberately avoided "magic" root-cause inference — during an incident you have no time to debug it.
⑨ The bar for waking a human: urgent + actionable + requires judgement. If the response is mechanical, give it to a machine. Err on the side of deleting noisy alerts — over-monitoring is a harder problem to solve than under-monitoring.