← Back to blog
sentinel

Automated Incident Diagnosis: How to Know What Broke and Why in 90 Seconds

Stop spending 45 minutes searching logs across tools after every incident. Automated incident diagnosis with cross-tool correlation finds root causes in 90 seconds.

incident-diagnosisMTTRobservabilitymonitoringautomationdeveloper-tools

Automated Incident Diagnosis: How to Know What Broke and Why in 90 Seconds



It is 2:47 AM. Your phone buzzes with a PingCheck alert: your API is returning 502s. You open your laptop, check the uptime dashboard, confirm it is down, then SSH into your server, tail the logs, see a database connection error, check your database provider's status page, realize nothing is wrong on their end, check your cron jobs, discover one of them ran a migration 12 minutes before the outage, check the deployment log, confirm that no deployments happened, then go back to the cron log, read the migration output, and finally find the problem: a migration added a column with a NOT NULL constraint on a table with 4 million rows, locking it for the duration and starving every other query of connections. Elapsed time: 47 minutes.

This is not a contrived scenario. This is what incident investigation looks like when your monitoring stack is a collection of isolated tools, each showing you one slice of what happened but none of them connecting the pieces together. Automated incident diagnosis exists to compress that 47-minute scavenger hunt into a 90-second read.

The Real Cost of Manual Investigation



Mean Time to Resolution (MTTR) is the number everyone tracks, but most teams underestimate how much of MTTR is spent on investigation, not remediation. According to a 2025 Ponemon Institute study, the average cost of IT downtime is $9,000 per minute for mid-size businesses. Even for indie developers and small teams, downtime translates directly into lost revenue, broken trust, and customer churn.

Here is how MTTR typically breaks down for a small team handling an incident manually:

| Phase | Typical Duration | Percentage of MTTR | |---|---|---| | Detection (alert fires) | 2-5 min | 5-10% | | Acknowledgment (human sees it) | 5-15 min | 10-20% | | Investigation (find root cause) | 20-45 min | 50-65% | | Remediation (fix the issue) | 5-15 min | 10-20% | | Verification (confirm it is resolved) | 2-5 min | 5% |

Investigation dominates. The fix itself is usually straightforward once you know what happened. The bottleneck is never the repair. It is the search.

Why Isolated Alerts Do Not Suffice



Most developers start with a reasonable setup: an uptime monitor for their endpoints, a cron monitor for background jobs, maybe a log aggregator, and a deployment tracker. Each tool does its job. Each sends alerts when something goes wrong. The problem is that none of them talk to each other.

When your API goes down, you get a PingCheck alert. When your cron job fails, you get a CronSafe alert. When your logs spike with errors, your LogDrain sends a notification. That is three separate alerts in three separate channels for what is actually one incident with one root cause.

This fragmentation creates two problems:

Alert fatigue. Six tools firing independently means six notifications for one incident. Over time, you start ignoring alerts because most of them are symptoms, not causes. The 2025 State of DevOps Report found that teams receiving more than 50 alerts per week ignore 30% of them. For a deeper look at why correlated alerts outperform isolated notifications, see our breakdown on correlated alerts vs. isolated notifications.

Context switching. Each tool has its own dashboard, its own timeline, its own log format. Investigating an incident means opening 4-6 tabs and mentally stitching together events that happened across different systems at slightly different times. Your brain becomes the correlation engine, and it is slow.

How Cross-Tool Correlation Works



Automated incident diagnosis works by collecting events from every tool in your stack and correlating them by time, service, and dependency graph. Instead of showing you six independent alerts, it shows you one diagnosis.

Here is the conceptual flow:

  • Event collection. Every tool in the stack emits events: PingCheck detects a timeout, CronSafe reports a job failure, LogDrain captures an error spike, the deployment tracker logs a release.


  • Time-window grouping. Events that occur within a configurable window (typically 5-15 minutes) are grouped together as potentially related.


  • Service graph matching. If your API depends on your database, and your cron job also depends on your database, the system knows that a database issue can cause both an API failure and a cron failure simultaneously.


  • Root cause ranking. The system uses temporal ordering and dependency relationships to rank probable root causes. The event that happened first in the dependency chain is the most likely root cause.


  • Diagnosis generation. Instead of six alerts, you get one diagnosis: "Database migration (CronSafe job db-migrate-users) locked the users table at 02:35 UTC, causing API connection timeouts (PingCheck) and LogDrain error spike starting at 02:38 UTC."


  • A Concrete Example: The Correlated Incident



    Let us walk through a real scenario with actual data.

    The Setup



    You run a SaaS application with:
  • A Next.js API hosted on a VPS
  • A PostgreSQL database
  • Three cron jobs: db-backup (hourly), email-digest (daily), db-migrate (triggered by deploy)
  • PingCheck monitoring your /api/health endpoint
  • CronSafe monitoring all three cron jobs
  • LogDrain collecting application logs


  • What Happens



    At 14:22 UTC, someone merges a PR that triggers the db-migrate cron job. The migration adds an index to a 2-million-row table. On PostgreSQL, CREATE INDEX without CONCURRENTLY locks the table for writes.

    Here is what each tool sees:

    14:22 UTC - CronSafe: db-migrate job starts, status: RUNNING

    14:23 UTC - LogDrain: Error rate jumps from 0.1/sec to 47/sec. All errors are ERROR: deadlock detected and ERROR: canceling statement due to lock timeout.

    14:24 UTC - PingCheck: /api/health returns 503 (the health check queries the locked table). Alert fires.

    14:25 UTC - CronSafe: email-digest job starts on schedule, fails immediately with a database timeout.

    Without correlation, you receive four alerts:
  • PingCheck: "API endpoint /api/health is DOWN"
  • LogDrain: "Error rate threshold exceeded (47/sec)"
  • CronSafe: "email-digest FAILED"
  • CronSafe: "db-migrate exceeded expected duration"


  • With automated diagnosis, you receive one:

    > Incident Diagnosis (14:24 UTC) > > Root Cause: CronSafe job db-migrate started at 14:22 UTC and is holding a table lock on users. > > Impact: API health check failing (PingCheck DOWN since 14:24), LogDrain error spike (47/sec, all lock-related), CronSafe job email-digest failed at 14:25 due to connection timeout. > > Suggested Action: The migration is running CREATE INDEX without CONCURRENTLY. Wait for completion (~8 min estimated) or cancel the migration and rerun with CREATE INDEX CONCURRENTLY.

    That is the difference between 90 seconds and 45 minutes.

    Implementing Monitoring Webhooks for Correlation



    To feed events into a correlation system, each tool needs to emit structured data. Here is what a typical monitoring webhook payload looks like when PingCheck detects a failure:

    {
      "event": "monitor.down",
      "tool": "pingcheck",
      "timestamp": "2026-08-15T14:24:03Z",
      "monitor": {
        "id": "mon_8xk2f",
        "name": "API Health Check",
        "url": "https://app.example.com/api/health",
        "expected_status": 200,
        "actual_status": 503,
        "response_time_ms": 12043,
        "region": "eu-central-1"
      },
      "metadata": {
        "consecutive_failures": 3,
        "last_success": "2026-08-15T14:21:00Z"
      }
    }


    And here is a CronSafe failure event:

    {
      "event": "job.failed",
      "tool": "cronsafe",
      "timestamp": "2026-08-15T14:25:12Z",
      "job": {
        "id": "job_3mw9p",
        "name": "email-digest",
        "schedule": "0 14 * * *",
        "exit_code": 1,
        "duration_ms": 5023,
        "error": "FATAL: remaining connection slots are reserved for non-replication superuser connections"
      },
      "metadata": {
        "last_success": "2026-08-14T14:00:45Z",
        "consecutive_failures": 1
      }
    }


    You can also use a simple curl command to verify your monitoring endpoints are reachable and returning expected payloads:

    # Check your API health endpoint and capture timing
    curl -w "\n\nHTTP Status: %{http_code}\nTime Total: %{time_total}s\nTime Connect: %{time_connect}s\n" \
      -o /dev/null -s \
      https://app.example.com/api/health

    Send a test webhook to your incident correlation endpoint

    curl -X POST https://api.luxkern.com/v1/webhooks/incidents \ -H "Content-Type: application/json" \ -H "Authorization: Bearer lk_sentinel_xxxxxxxxxxxx" \ -d '{ "event": "test.ping", "tool": "custom", "timestamp": "2026-08-15T14:30:00Z", "metadata": { "source": "manual-test" } }'


    For a deeper dive into setting up health check monitoring, see our guide on how to monitor API endpoints.

    Practical Steps to Automate Incident Diagnosis



    Moving from isolated alerts to automated diagnosis does not require ripping out your entire stack. Here is a step-by-step approach:

    Step 1: Centralize Your Event Stream



    Every monitoring tool you use should send events to a single place. This can be a webhook endpoint, a message queue, or an API. The key is that all events flow into one system.

    If you are using Luxkern's toolkit, this is already done for you. PingCheck, CronSafe, LogDrain, and other tools all feed into the same event bus. If you are assembling your own stack, you need to wire up webhooks from each tool to a central collector.

    Step 2: Define Your Service Graph



    The correlation engine needs to know which services depend on which other services. For most small teams, this is straightforward:

    # service-graph.yml
    services:
      api:
        depends_on: [database, cache]
        monitors:
          - pingcheck: mon_8xk2f
          - logdrain: stream_api_prod

    worker: depends_on: [database, queue] monitors: - cronsafe: [job_3mw9p, job_7kx2m, job_1nv4q] - logdrain: stream_worker_prod

    database: type: postgresql monitors: - pingcheck: mon_db_health

    cache: type: redis monitors: - pingcheck: mon_redis_health


    Step 3: Configure Time Windows



    Not every pair of events that happen at the same time are related. You need to configure correlation windows based on your system's characteristics. A good starting point:

  • Tight window (2 minutes): For services with direct synchronous dependencies (API calls database).
  • Medium window (5 minutes): For services with asynchronous dependencies (cron job processes queue messages).
  • Wide window (15 minutes): For deployment-related correlations (a deploy happened, and 10 minutes later things broke).


  • Step 4: Set Up Escalation Rules



    Automated diagnosis should change how you escalate. Instead of alerting on every individual tool failure, you alert on diagnosed incidents:

  • Severity 1 (page immediately): Diagnosis shows customer-facing impact (API down, status page affected).
  • Severity 2 (alert in channel): Diagnosis shows internal impact (cron job failed, but customers are unaffected).
  • Severity 3 (log for review): Diagnosis shows a warning (error rate elevated but below threshold, latency increased but still within SLA).


  • Step 5: Track MTTR Before and After



    You cannot improve what you do not measure. Before switching to automated diagnosis, record your current MTTR for at least 10 incidents. After switching, measure again. The improvement is typically dramatic.

    Teams using cross-tool correlation report a reduction in MTTR from 35-50 minutes to 3-8 minutes. The investigation phase, which previously dominated the timeline, shrinks to near zero because the diagnosis is delivered alongside the alert.

    If you want to understand more about reducing MTTR systematically, we wrote a dedicated piece on how to reduce Mean Time to Resolution for developer infrastructure.

    What Changes When Diagnosis Is Instant



    When you can identify root causes in 90 seconds instead of 45 minutes, several things shift:

    On-call stops being traumatic. The worst part of on-call is not being woken up. It is the anxiety of not knowing how long the investigation will take. When diagnosis is instant, you know within two minutes whether this is a 5-minute fix or something that needs the whole team.

    Post-mortems become useful. When every incident has an automated diagnosis attached, post-mortems shift from "what happened?" (which requires reconstructing a timeline) to "why did this happen and how do we prevent it?" The hard part is already done.

    You can measure detection-to-diagnosis time as a separate metric. Most teams lump detection and investigation together. When diagnosis is automated, you can measure how long your system takes to detect a problem and how long it takes to explain it. Both numbers should be under 5 minutes.

    Alert fatigue drops. Instead of six alerts for one incident, you get one diagnosis. Your notification channels become meaningful again. When a notification arrives, it carries context, not just a status change.

    The Bottom Line



    Automated incident diagnosis is not a luxury feature for large enterprises. It is a practical tool for any developer who is tired of spending their investigation time jumping between dashboards at 3 AM. The technology for cross-tool correlation exists today, and the setup is not complicated.

    The fundamental shift is simple: stop treating each monitoring tool as an independent alarm system and start treating them as data sources for a single diagnosis engine. Your alerts become explanations. Your 45-minute investigations become 90-second reads. And your on-call rotations become something you can actually live with.

    If you are still running isolated monitors with no correlation, you are leaving the most impactful improvement to your incident response on the table. The fix is usually not faster alerts. It is smarter ones.