← Back to Insights

Incident response

Cutting Time to Diagnosis in Incidents

Written by:Better SoftwareBetter Software TeamUpdated 5 min read
Cutting Time to Diagnosis in Incidents

Quick Answer

Faster diagnosis of production incidents comes from a fixed investigation sequence. Confirm the scope, review recent changes, read latency, error, traffic and saturation metrics, correlate logs across services, isolate the failing subsystem, and test one hypothesis at a time. Runbooks, solid telemetry and clear escalation cut the time further, while restarting services too early destroys diagnostic state that engineers still need.

Reducing time to diagnosis during production incidents involves improving observability, simplifying investigation processes, and managing cognitive load. Focus on high-fidelity instrumentation and well-defined escalation paths. Minimize the number of tools required for initial triage.

Why This Happens

System complexity increases diagnostic challenges. Distributed architectures obscure clear failure points. Services interact in non-obvious ways. Insufficient telemetry provides incomplete pictures. Alert fatigue desensitizes on-call engineers. Lack of codified historical knowledge delays resolution. Engineers frequently encounter novel failure modes. Pressure to restore service quickly can lead to hasty conclusions. Tribal knowledge often resides with a few individuals.

Investigation Process

  1. Verify the incident scope. Confirm affected users, services, and business impact. Use internal dashboards or monitoring tools. Validate primary alert data.
  2. Review recent changes. Check deployments, configuration changes, or infrastructure modifications. Cross-reference with incident start time. Look for correlations.
  3. Examine primary service metrics. Focus on the golden signals of latency, error rates, traffic, and saturation. Identify anomalies in these metrics immediately.
  4. Correlate logs across services. Trace requests through the system. Look for errors or abnormal behavior at each hop. Use distributed tracing where available.
  5. Isolate potential fault domains. Determine which subsystem is failing. Check dependencies, network connectivity, and external services. Disable non-critical components if possible.
  6. Consult runbooks and historical data. Access documentation for similar incidents. Review past post-mortems. This avoids reinventing investigation steps.
  7. Formulate hypotheses. Develop specific, testable explanations for the observed behavior. Prioritize the most likely causes.
  8. Test hypotheses systematically. Gather further data to affirm or deny each hypothesis. Do not make multiple changes simultaneously.
  9. Escalate appropriately. Involve subject matter experts (SMEs) if diagnosis stalls. Provide a clear summary of steps taken.

Practical Example

A user-facing service reported increased latency and intermittent 5xx errors. The primary incident alert indicated elevated error rates from the API gateway. Initial investigation showed the gateway itself was healthy. Service metrics for the downstream ProcessingService showed CPU saturation. Log correlation revealed a sudden increase in requests to a specific PaymentGateway integration. This integration traditionally handled low volume. The ProcessingService was retrying failed PaymentGateway requests aggressively. This created a retry storm. The PaymentGateway integration had recently updated its API, causing a slight change in expected response format. Our ProcessingService was misinterpreting valid responses as failures. The fix involved deploying a configuration rollback to the ProcessingService. This immediately reduced retries and CPU utilization. The PaymentGateway team then assisted in debugging the new API response format offline. Building a mental model of a failure from partial data was key here.

Preventing Recurrence

Improve instrumentation for external API integrations. Monitor expected response formats and failure rates. Implement circuit breakers and adaptive throttles in client services. These prevent single dependency failures from cascading. Define strict retry policies with exponential backoff and jitter. Refine runbooks to include common integration failure modes. Conduct regular game days simulating such failures. Ensure production work is factored into engineering plans. Document the debug process for novel failure types. Identifying root causes of recurring incidents requires systematic analysis.

We build this kind of dependency protection into our product engineering work from the start.

What Teams Usually Do Instead

Many teams rely solely on high-level synthetic monitors. These often only confirm a problem exists, not its location or cause. They frequently jump to restarting services. This destroys valuable diagnostic state information. Without sufficient logging and tracing, engineers resort to manual ad-hoc log analysis. This is slow and error-prone. They often skip structured hypothesis testing. This leads to chasing red herrings. They maintain critical diagnostic knowledge in engineers' heads. This creates single points of failure for incident resolution. They neglect runbook maintenance. This renders existing documentation obsolete. Incomplete post-mortems also hinder future incident response.

Key Takeaways

  • Prioritize high-fidelity observability from service inception.
  • Standardize investigation steps through clear runbooks.
  • Manage cognitive load during incidents with focused tools.
  • Implement targeted alerts to reduce signal noise.
  • Document all incident investigation processes and findings.

For more on how we work, visit Better Software.

Frequently Asked Questions

What Slows Down Incident Diagnosis?

We see the same causes the post lists. Distributed architectures hide clear failure points, telemetry is incomplete, alert fatigue dulls on-call engineers, historical knowledge is not written down, and tribal knowledge sits with a few people. Pressure to restore service quickly then pushes teams toward hasty conclusions.

What Should We Check First During an Incident?

We verify the scope first by confirming affected users, services and business impact, and by validating the primary alert. Then we review recent deployments, configuration changes and infrastructure modifications against the incident start time, and look for correlations before reading deeper metrics.

Why Avoid Restarting Services Right Away?

A restart destroys valuable diagnostic state information. Without enough logging and tracing, engineers fall back on slow, error-prone manual log analysis. We prefer to capture what the system is showing first, then decide whether a restart is the right mitigation.

How Do We Test Hypotheses During an Incident?

We write down specific, testable explanations for the observed behavior and rank the most likely causes first. Then we gather more data to confirm or reject each one. We never make multiple changes at the same time, because that hides which change mattered.

How Can Teams Prevent a Retry Storm?

The example in the post points to circuit breakers, adaptive throttles and strict retry policies with exponential backoff and jitter. We also monitor expected response formats and failure rates for external integrations, and keep runbooks current for common integration failure modes.

About the author

Better Software

Better Software Team

Product and engineering team

Better Software Team is the product and engineering team at Better Software. We build new software products and improve existing applications and systems, with deeper experience in healthcare, finance and energy.