Stories · Season 1 — Pemberton & Crumb · Episode 06

The 2 A.M. Page Nobody Could Read

In which everything is "fine," a customer says it isn't, and the truth is hiding in a haystack of log lines.

The story

The page went off at 2:14 a.m. ERROR RATE ELEVATED. Dana, now joined by a long-suffering ops contractor named Rory, blinked at a laptop in the dark.

The dashboard was a sea of green. CPU: fine. Memory: fine. The database: fine, thank you. And yet a handful of customers — three, maybe four — were getting errors when they tried to check out. Somewhere in the system, some specific combination of customer, cart, and code was failing. But which one?

The logs were no help, which is to say there were millions of them. Order placement touched the store, the tax service, the warehouse, and the billing consumer — four separate services, four separate log streams, none of which knew they were part of the same customer’s checkout. To trace one failing request, Rory had to guess a timestamp, grep four log files, and try to eyeball which lines belonged together. At 2 a.m. This is not a debugging strategy. This is a séance.

Two hours later they found it: a single customer with an unusually long shipping address was tripping a downstream validation. A five-minute fix, once you could see it. Finding it cost the night.

Why this is hard the traditional way

When a request flows through several services, the story of “what happened to this request” is scattered across all of them. Each service logs its own fragment, in its own format, with no shared thread tying the fragments together. You can see that something failed, but reassembling the single customer’s journey out of the wreckage is manual archaeology.

Worse, the metrics that are easy to collect — CPU, memory, disk — are exactly the ones that tell you nothing about a business-logic failure affecting four customers. The host is perfectly healthy. The checkout is broken. Generic infrastructure dashboards are green while customers are stuck, because they’re measuring the wrong thing. You’re flying a plane with an altimeter but no view of the ground.

Teams bolt on observability after the first bad night — by which point it means threading a correlation ID through dozens of services by hand, and hoping nobody forgot.

How Relay changes the ending

Relay is instrumented from the inside out, using OpenTelemetry — the industry standard — so it plugs into whatever you already use (Jaeger, Grafana, Honeycomb, Datadog, your choice).

  • Distributed traces. Every command, query, and message carries a correlation ID automatically, propagated across service boundaries. One customer’s checkout — store, tax, warehouse, billing — shows up as a single trace, in order, with timings. No grep, no séance.
  • Business-level metrics. Per-command and per-query duration histograms, message backlog and lag gauges, saga and cache counters — so your dashboard can show “checkout p99 latency” and “outbox backlog,” not just CPU.
  • Health checks that mean something. Schema, projections, outbox, scheduler, and tenancy each report their own health, so “is the system OK?” has a real, composite answer.
// You don't thread correlation IDs by hand. Relay does it.
// The failing checkout becomes one trace spanning every service it touched:
//   PlaceOrder ─► CalculateTax ─► ReserveStock ─► ChargeCard ─► (here's the error, right here)

Replayed with Relay, the 2 a.m. page is a 2:20 a.m. page. Rory opens the trace for one of the failing requests, sees the whole journey light up, spots the red span at the address-validation step, and goes back to bed. The fix waits for morning, because the finding took five minutes.

What it costs you to ignore this

  • Mean time to “we found it” is measured in hours. Most of an incident isn’t fixing the bug — it’s locating it. Without tracing, that’s the expensive part.
  • Green dashboards lie. Infra metrics can look perfect while customers are blocked, so you don’t even trust your own alerts.
  • It burns out your people. Nothing torches morale like being paged for a problem you have no tools to diagnose.
  • Adding it later is painful. Retrofitting correlation IDs across a live distributed system is a slow, error-prone project you do under duress.