Logic League home
Back to insights
Guide

Observability that pays for itself

The instrumentation worth adding early — and how it turns 2am incidents into five-minute fixes.

By Logic LeagueFeb 2, 20267 min read
Guide7 min read

The observability gap always announces itself at the worst possible moment: 2am, a customer escalation open, and a wall of green dashboards swearing nothing is wrong. The telemetry you wish you had is never the telemetry you can add halfway through an incident. The cheapest moment to wire it in is long before the pager goes off, which is exactly why it gets skipped.

01Monitoring tells you what broke; observability tells you why

Monitoring is the set of questions you already knew to ask. CPU over 90 per cent, error rate past a threshold, a disk filling up: you predicted the failure mode in advance and wired up a check for it. It is necessary, and it catches the boring, predictable breakages that make up most of your week. The trouble is that monitoring only ever sees the failures you anticipated, and the expensive ones rarely are.

Observability is the ability to ask brand new questions of a live system without shipping code to answer them. The failures that hurt are the ones nobody imagined: a single customer on a legacy plan hitting one endpoint that only fails when a downstream cache is cold. Monitoring stays silent on those, because no threshold was ever set for them. It is what lets you interrogate a running system until it tells you what it is actually doing.

If answering a new question about production needs a deploy, you have monitoring, not observability.

02The three signals, and what each is good for

The field has converged on three telemetry signals, and the common mistake is treating them as interchangeable. They are not. Each answers a different kind of question:

  • Logs are the narrative: what happened, in what order, with the actual values in play. Perfect for the detail of one request, ruinously expensive at high volume.
  • Metrics are the aggregate: rates, percentiles and saturation over time. Cheap to store and fast to query, but blind to the single request that went wrong.
  • Traces are the journey: how one request moved across services and where the time actually went. Close to essential the moment more than one process sits in the path.

03Instrument the front door first

If you have a weekend rather than a quarter, do not start at the database. Start at the edge, with the handful of endpoints and background jobs that carry the actual business. For each one, capture three numbers: request rate, error rate, and the latency distribution, and by distribution I mean the percentiles, not the average that hides every bad experience inside a comfortable mean. On a bad day those three figures per critical path will tell you more than a thousand host-level gauges ever will. Resist the urge to instrument everything at once; instrument the things a user would phone in to complain about, and let the rest wait.

04Structured logs and the trace ID that stitches them together

Log lines written like prose are pleasant for humans and useless to machines. Emit logs as structured events, discrete key-value fields rather than sentences with values glued into them, so you can filter by customer ID, route or status code without resorting to regex archaeology at 3am. Then do the one thing that pays off more than any dashboard: generate a trace ID at the edge and propagate it through every service, queue and log line the request touches. When an incident lands you paste a single ID and watch the whole journey assemble itself, in order, across every system it crossed. That one decision removes the slowest part of debugging, which is reconstructing what actually happened before you can even begin to fix it.

05Alert on what users feel, not on what servers do

A dashboard with forty graphs is a museum, not a tool: nobody watches it, and it answers no question under pressure. Replace the vanity panels with a few Service Level Objectives that map to something a user would genuinely notice, such as the proportion of checkouts that complete or the share of requests served under a latency they would tolerate. Wrap each one in an error budget, which turns reliability into a quantity you can spend rather than a vague aspiration to be perfect. When the budget is healthy, ship faster and take more risk. When it is nearly gone, the same number tells the whole team to slow down and harden things, with no debate required.

A page should mean a person is being hurt right now, not that a graph looks a little unusual.

This is why you alert on symptoms, not causes. High CPU is not an incident; checkout failing for one user in twenty is. If you page on every underlying cause you will drown the on-call rota in noise, train everyone to swipe the pager away on reflex, and bury the one alert that actually mattered. Tie pages to your SLOs and let the causes surface during the investigation rather than in the notification. A quiet pager that fires only when users are suffering is worth far more than a comprehensive one nobody trusts.

06Cost discipline, or the bill becomes the incident

Left unchecked, the telemetry bill has a habit of overtaking the infrastructure it observes, and an observability stack that sets off its own budget alarms has failed at the job it was bought to do. Spend deliberately: sample traces instead of keeping every one, set retention by how far back you ever actually look, pre-aggregate metrics before you store them, and drop high-cardinality labels you will never query. Apply the same honesty here as everywhere else in the system, keeping what earns its place and binning the rest. Get this right and the payoff lands where it counts, in mean-time-to-resolution: the 2am incident that used to swallow a whole night becomes a five-minute fix, because the question you need to ask is already answerable and the answer is already sitting there, waiting for you to look.

Key takeaways

  • Monitoring answers the questions you knew to ask in advance, while observability lets you ask new ones of a live system without shipping code, and the failures that genuinely hurt are almost always the unanticipated kind.
  • When time is short, instrument the front door first by capturing request rate, error rate and latency percentiles for your few critical paths, and propagate a single trace ID through every hop so an incident can be reconstructed in minutes rather than hours.
  • Alert on the symptoms your users actually feel rather than on internal causes, and govern reliability with SLOs and error budgets instead of dashboards that nobody watches under pressure.
  • Apply the same cost discipline to telemetry as to the rest of the system, because observability that triggers its own budget alarms has stopped paying for itself.

Share this article

Back to insights

Have a project in mind? Let's talk.

Tell us where you want to go. We'll map the shortest credible path.