The Day Your Monitoring Says Everything Is Fine While Your Users Are Losing Their Minds

2026-11-09来源 dev.to DiscussEnglish

There's a particular kind of engineering incident that makes you question everything you thought you knew about production systems.

Your dashboards are green. Your uptime monitor reports 99.99%. Your error rate is normal. CPU utilization looks healthy. Database connections are well within limits.

And yet, your users are complaining that your application is broken.

Pages take forever to load. Checkout randomly fails. Login works for some people but not others. Support tickets are piling up, and your engineering team is staring at a wall of green graphs wondering what everyone is talking about.

Welcome to one of the most uncomfortable realities of software engineering: your system can be healthy according to your metrics and completely broken according to your users.

I've been thinking about this because we spend so much time building monitoring systems that tell us whether our infrastructure is alive that we sometimes forget to ask whether our product is actually working.

There's a difference.

And that difference matters more than most teams realize.

Uptime is not the same thing as reliability

We have collectively become obsessed with uptime percentages.

99.9%. 99.95%. 99.99%.

These numbers look impressive in status reports and investor presentations. They make excellent dashboard decorations.

But consider this scenario:

Your application responds successfully to 99.9% of HTTP requests. Everything looks great.

Except the 0.1% that fail are almost exclusively payment requests.

Your homepage loads. Your product catalog works. Your API responds. Your health checks pass.

But customers cannot complete purchases.

Technically, your infrastructure is available. Practically, your business is losing money.

This is why infrastructure-level monitoring alone is insufficient.

Some practical takeaways:

Monitor business-critical transactions, not just HTTP responses.
Measure whether users can successfully complete important workflows.
Track failed payments, abandoned checkouts, authentication failures, and other meaningful outcomes.
Build alerts around customer impact rather than arbitrary infrastructure thresholds.
A server returning HTTP 200 does not mean your application delivered value.

It means a server returned HTTP 200.

Those are very different statements.

Your average response time is hiding something

Here's another dangerous habit: relying too heavily on averages.

Imagine your API handles 100,000 requests.

Most finish in 80 milliseconds. A small percentage take 8 seconds.

Your average might still look perfectly reasonable.

But those unlucky users are experiencing an application that feels broken.

This is precisely why latency percentiles matter.

P50 tells you what a typical request experiences. P95 and P99 tell you what happens to the people having the worst experience.

And those people are often the ones who remember your product for all the wrong reasons.

The same principle applies to background jobs, database queries, message queues, and third-party integrations.

Averages are useful, but they can hide the exact problems that deserve your attention.

If your team only looks at average latency, you're effectively ignoring the users who experience the worst version of your software.

The dependency you don't control can become your biggest problem

Modern applications are rarely isolated systems.

Your application depends on payment providers, authentication services, email platforms, cloud infrastructure, analytics systems, package registries, and dozens of APIs maintained by other teams.

You might have written excellent code.

Your deployment might be flawless.

Your infrastructure might be perfectly configured.

Then a third-party service starts responding slowly, and suddenly your application is struggling.

The interesting part is that the dependency doesn't necessarily need to go down.

Sometimes it just gets slower.

A payment API that normally responds in 200 milliseconds starts taking 4 seconds. Your application waits. Requests accumulate. Connection pools fill up. Threads become occupied. Eventually, unrelated parts of your application start suffering too.

One slow dependency can become a much bigger incident than anyone expected.

This is where engineering discipline matters:

Set explicit timeouts for external requests.
Use circuit breakers where appropriate.
Implement retries carefully, with backoff and jitter.
Make nonessential integrations fail gracefully.
Avoid allowing one dependency to consume all your application's resources.
Monitor third-party latency separately from your own application performance.
Retries deserve special attention.

A retry can be helpful when a temporary network problem occurs. But when a service is already struggling, thousands of clients retrying simultaneously can make the situation dramatically worse.

Sometimes the most reliable thing your software can do is stop trying for a moment.

Observability is not a dashboard collection exercise

I've seen engineering teams with impressive monitoring setups.

Dozens of dashboards. Hundreds of metrics. Logs flowing into centralized platforms. Distributed traces. Alerting rules for practically everything.

And yet, when something breaks, nobody knows where to start.

The problem isn't necessarily a lack of data.

It's a lack of useful connections between the data.

A log tells you something happened. A metric tells you how frequently something happened. A trace helps you understand how a request moved through your system.

Together, they can tell a much more meaningful story.

For example, imagine a customer reports that checkout failed.

You want to be able to follow that transaction and understand:

Which application instance handled the request?
Which database queries were executed?
Did the payment provider respond?
Was there a timeout or retry?
Did the request fail before or after the payment was authorized?
Was the problem isolated to one deployment, region, or customer segment?
Without that context, debugging becomes detective work.

With it, you have a starting point.

And there's another important detail: observability needs to exist before the incident.

Adding useful instrumentation after production breaks is a little like installing a security camera after someone has already stolen your equipment.

You might eventually figure out what happened, but you've lost the opportunity to see it clearly.

Alert fatigue is an engineering problem, not a notification problem

There's a dangerous pattern in many engineering organizations.

An alert fires. Someone investigates. It turns out to be nothing serious.

Another alert fires. Same story.

Then another.

Eventually, engineers stop treating alerts as urgent signals and start treating them as background noise.

This is alert fatigue.

And it's not harmless.

When every minor deviation triggers a notification, genuinely important incidents become harder to recognize.

The solution isn't necessarily more sophisticated alerting software.

It's better alert design.

A good alert should answer three questions:

Is something actually wrong?
Does someone need to take action?
What is the likely customer impact?
If an alert doesn't lead to an investigation or a meaningful action, it probably needs to be reconsidered.

I would rather have five alerts that engineers trust than 500 alerts that everyone has learned to ignore.

The best incident response starts before the incident

There's a misconception that incident response is something you figure out when production goes down.

It isn't.

By that point, people are stressed, customers are frustrated, and every minute feels expensive.

The teams that handle incidents well have already established some basic habits:

They know who owns critical services.
They have documented rollback procedures.
They understand their dependency relationships.
They practice restoring backups.
They have clear escalation paths.
They know how to communicate with customers.
They conduct blameless postmortems after meaningful incidents.
One practice I particularly like is running failure exercises.

Intentionally introduce a controlled failure in a non-production environment. Simulate a database slowdown. Make a dependency unavailable. Test what happens when a queue falls behind.

Then ask a simple question:

Would our monitoring tell us something meaningful is wrong before customers start reporting it?

If the answer is no, you've found something worth fixing.

There's a business lesson hiding inside all of this

Engineering teams often measure reliability from the perspective of the system.

Businesses experience reliability from the perspective of the customer.

Those perspectives don't always align.

A database can be available while queries are painfully slow. An API can return successful responses while delivering incorrect data. A deployment can complete without errors while breaking an important customer workflow.

The technical definition of success is not always the customer's definition of success.

And that's probably the most important lesson here.

We shouldn't build monitoring systems simply to prove that our infrastructure is running.

We should build them to understand whether our software is doing what people depend on it to do.

The takeaway

Every production system eventually encounters something its engineers didn't anticipate.

A dependency becomes slow. A database behaves unexpectedly. A deployment introduces an edge case. A seemingly harmless traffic spike exposes a bottleneck nobody noticed during testing.

That's normal.

What's less acceptable is discovering that your monitoring system had no idea any of it was happening.

Green dashboards are comforting, but comfort isn't the same thing as confidence.

Build systems that measure real customer outcomes. Pay attention to the slowest requests, not just the averages. Instrument critical workflows. Practice failure scenarios. And make sure your alerts tell people when something genuinely needs attention.

Because the most dangerous production incident isn't necessarily the one that brings your servers down.

Sometimes it's the one where everything looks healthy while your customers quietly give up trying to use your product.

Have you ever experienced an incident where every dashboard was green but the application was effectively broken? What eventually helped you find the problem? Share your story in the comments.

Sources

Google Cloud, Site Reliability Engineering (SRE) Books — Practical guidance on reliability engineering, monitoring, incident response, and service-level objectives.

Google Cloud, Monitoring Distributed Systems — Why monitoring should focus on meaningful signals, including latency, traffic, errors, and saturation.

Google Cloud, The Four Golden Signals — A framework for understanding latency, traffic, errors, and saturation.

OpenTelemetry, Documentation — An introduction to observability through metrics, logs, and distributed traces.

AWS, Timeouts, retries, and backoff with jitter — Why poorly designed retries can amplify failures in distributed systems.

Google Cloud, Site Reliability Engineering: Incident Management — Best practices for coordinating and responding to production incidents.

Atlassian, Incident Management — Guidance on incident response, communication, and post-incident learning.

These resources provide additional technical context for the reliability and observability practices discussed in this article.

原文:https://www.a8q9.cn/en/article/the-day-your-monitoring-says-everything-is-fine-while-your-users-are-losing-thei-71dbfa.html

相关文章