The Pull Request Nobody Wants to Review
Large PRs don't just slow down code review — they fundamentally change the incentives of the reviewer. Here's what actually happens when a 2,000-line diff lands in your queue.
Most monitoring setups tell you what broke. Good observability tells you what's about to break. The difference isn't the tooling — it's what you choose to measure.
The most common way an engineering team discovers their system is broken is through a customer support ticket. The second most common way is a spike in error rate. Both of these are lagging indicators — they tell you the failure already happened. The damage is done.
Most teams call this 'monitoring.' Some of it is. But monitoring that only tells you what broke after it broke isn't observability — it's an incident log with a notification system bolted on.
Observability, in the sense that actually matters operationally, is the ability to ask arbitrary questions about system behaviour without knowing in advance what you're going to ask. It requires the right data, at the right granularity, available in the right shape. Most teams have dashboards. Very few have observability.
A lagging indicator measures the outcome of something that already happened. Error rate, p99 latency, failed payment count — these are all lagging. They're useful for understanding what happened and why. They're not useful for preventing the next one.
A leading indicator measures something that predicts a future state. Database connection pool saturation predicts query timeout spikes. Memory growth rate predicts OOM crashes. Queue depth predicts worker processing lag. These metrics are harder to instrument and harder to threshold correctly — but they're the ones that let you intervene before the user-visible failure.
Alerting on error rate is like having a smoke alarm that triggers after the fire has spread to three rooms. Alerting on leading indicators is having a heat sensor in the room where the fire starts.
Logs, metrics, and traces are the standard framework for observability. Most teams have all three. Most teams are still flying partially blind. The problem isn't the presence of the pillars — it's how they're used.
The test of an observability setup is not how good it looks in a post-mortem. It's how useful it is to an engineer who was woken up fifteen minutes ago, doesn't have full context on the change that just deployed, and needs to diagnose whether to roll back or keep investigating.
That engineer needs three things: a clear signal of what is wrong (not a wall of amber alerts, all of which are 'elevated'), a way to narrow down where in the system the problem is, and enough granularity to tell the difference between a symptom and a cause.
This means your alert fatigue problem is an observability problem. When everything alerts, nothing is actionable. When you have to open five dashboards to correlate what's happening, the system isn't observable — it's just instrumented. The signal has to be clear enough that the on-call engineer can distinguish 'this is serious, roll back now' from 'this is elevated, monitor and investigate' from 'this is noise, can wait until morning.'
The path from reactive monitoring to proactive observability is not a tool migration. You can do it with Datadog or with open-source Prometheus and Grafana or with any combination in between. The tools matter less than the discipline.
Start by auditing your existing alerts. For each one, ask: the last three times this fired, what did the on-call engineer do? If the answer is 'checked a few things and dismissed it,' that alert is noise — either its threshold is wrong or it's measuring something that isn't actionable. Remove it or fix it.
The last step — and the one most teams skip — is validating your observability setup before you need it. Run a chaos experiment in staging. Kill a dependency. Saturate the connection pool. Watch whether your dashboards show you what's wrong before the errors appear. If they don't, you know what to fix before you find out in production.
Observability is not a feature you add to a finished system. It's a discipline you build into it — one instrumented decision at a time. The best time to add it is when you're writing the code. The second best time is now.
Large PRs don't just slow down code review — they fundamentally change the incentives of the reviewer. Here's what actually happens when a 2,000-line diff lands in your queue.
You can redeploy code in seconds. You cannot undo a migration. The most consequential decisions in a production backend aren't in the application layer — they're in the database.