← Blog Alert fatigue

How to reduce alert fatigue without pretending alerts are fine

Alert fatigue is a systems problem: repeated low-value interruptions train responders to distrust the pager. The fix is not "pay more attention". It is measuring what pages accomplish, deleting work that should never interrupt a human, and improving the alerts that remain.

By Published 10 min read alert fatigue SRE monitoring

The cure for alert fatigue is not "care harder". People already care. The problem is conditioning: if nine of ten interruptions require no immediate action, the tenth arrives through a channel the brain has learned to classify as ambient weather.

An alert earns the right to page when it indicates meaningful user or system impact, needs action soon, reaches someone capable of acting, and contains enough context to begin. Miss any one of those conditions and you probably have a ticket, dashboard signal or log message wearing a pager costume.

IncidentRelay alerts list
Alerts should be actionable, owned and routed. Otherwise they are just confetti with a severity label.

Establish a baseline before tuning

Take two to four weeks of alert history and calculate a small set of metrics. Per team and service is more useful than one impressive company-wide number.

MetricSimple definitionWhat it reveals
Actionable page ratePages that caused immediate useful action / all pagesWhether paging is trusted work or noisy telemetry.
After-hours page countPages outside the responder's normal hoursThe human cost hidden by total alert volume.
Repeat rateRepeated pages for the same underlying condition / all pagesFlapping checks, poor grouping or unresolved causes.
Escalation-without-ACK rateAlerts that moved past the primary / paged alertsDelivery, workload or responder-readiness problems.
Median and p90 ACK timeTime from notification to acknowledgementTypical response and the painful long tail.
No-action resolution ratePages closed without remediation / all pagesCandidates for removal, delay or non-paging delivery.

Do not weaponize these metrics against responders. A missed ACK may mean a dead notification channel or three simultaneous incidents. Use the data to debug the system, not to build a leaderboard for who sleeps least.

Run every page through one decision

QuestionIf yesIf no
Does this indicate real or imminent impact?Continue evaluating.Keep as telemetry or a dashboard signal.
Must a human act before the next working period?Continue evaluating.Create a ticket or working-hours notification.
Is there a safe, specific action?Put it in the alert/runbook.Investigate or automate before paging.
Can the receiving team perform that action?Route to that owner.Fix ownership and permissions.

If the expected response is "watch it for a while", the monitoring system can probably do the watching.

Fix the top repeat offenders first

Sort alerts by page count, after-hours count and total responder time. The top five rules often generate a surprisingly large share of the pain. For each one, choose an explicit disposition:

  • Delete: it has no meaningful action or duplicates another signal.
  • Demote: turn it into a ticket, dashboard event or business-hours message.
  • Delay: require the condition to persist before paging.
  • Group: send one incident for one failure domain instead of one page per pod.
  • Route: deliver it only to the team that can fix it.
  • Repair: fix the underlying service problem that keeps firing.

Assign an owner and deadline to the disposition. A document titled "noisy alerts" without owners is merely a curated exhibition of suffering.

Prefer symptoms over internal causes for paging

A user-visible symptom such as sustained checkout failure usually deserves faster attention than every possible internal cause. Ten downstream checks may all turn red when one database fails. Paging on all ten gives the responder ten notifications and no additional database.

Keep cause signals for diagnosis, but consider paging on a small number of service-level symptoms. Attach dashboards, logs and correlated context so the responder can move from symptom to cause without guessing.

Add time to thresholds

Instantaneous threshold crossings are excellent at detecting CPU spikes caused by the monitoring query itself. Require a condition to persist long enough to exclude harmless transients while staying inside the response budget.

Weak:   CPU > 90% once
Better: CPU > 90% for 10 minutes AND latency/error impact exists

Weak:   one failed health check
Better: failure across multiple checks or locations for 3 minutes

Use hysteresis where possible: fire at a high threshold and recover at a lower one. This prevents an alert from repeatedly opening and closing around a single boundary like a cat reconsidering a doorway.

Route by ownership and context

An alert should go to the team that can actually fix it. Broadcasting every alert to everyone feels safe for about two days, then it becomes background radiation. Use stable labels such as service, team, environment, cluster and severity.

service=payments-api
team=payments
environment=production
severity=critical
runbook=https://runbooks.example/payments/high-error-rate

In IncidentRelay, intake routes connect sources to teams, services, rotations or escalation policies and notification channels. Keep per-route tokens scoped to the intended integration, then use matchers to prevent a generic endpoint from becoming the town square.

Classic alert meme

Nobody:
Absolutely nobody:
Monitoring at 02:00: "CPU was spicy for 11 seconds."

Silence deliberately and narrowly

Maintenance windows, load tests and known temporary conditions need silences. The important word is deliberately. Every silence should have an owner, a reason, a narrow matcher and an expiry. "Forever" is not a maintenance window; it is a small cover-up.

IncidentRelay silence conditions use AND semantics. Prefer:

{
  "alertname": "DiskFull",
  "instance": "host1.example.com",
  "environment": "staging"
}

Avoid an empty matcher or a broad condition such as every critical alert unless you truly intend to suppress an entire team's notifications. After creating the silence, send or inspect a representative alert and confirm the stored labels match your assumptions. The Silences guide includes exact matcher forms and troubleshooting steps.

Make every remaining page self-contained

A useful page should answer these questions without requiring a scavenger hunt:

  • What service and environment are affected?
  • What user impact or risk triggered the page?
  • When did it start and is it still firing?
  • Which dashboard, logs and traces should I open?
  • What is the first safe diagnostic or mitigation step?
  • Who owns the service and how do I escalate?
  • What changed recently?

A runbook does not need to be a novel. A reliable first page can contain validation queries, rollback or mitigation steps, safety warnings and a clear "escalate when" condition. Test it with someone who did not write it.

Use acknowledgement as an operational signal

An ACK tells IncidentRelay and the team that a human owns the alert. It should stop reminder and escalation noise while keeping the work visible. It is not a resolution and not a substitute for action.

Review alerts that are acknowledged immediately but never produce action; they may be habitual button-clicking. Review alerts that often escalate; they may expose a broken channel, overloaded primary, bad schedule or unrealistic delay. The ACK timeline is diagnostic evidence.

Debug routing with evidence

When a page reached the wrong team or disappeared behind maintenance, use the IncidentRelay explain trace to inspect the matched route, team, service, assignment, silence or maintenance decision and notification outcome. This is faster than asking six people which YAML file feels responsible.

IncidentRelay alert explain trace
Explain trace turns "why did I get this?" into an inspectable routing decision.

A 30-day noise reduction loop

  1. Days 1-3: export a baseline and identify the top ten page sources.
  2. Week 1: delete or demote obvious non-actionable pages; repair broken ownership.
  3. Week 2: tune persistence, grouping and recovery behavior for repeat offenders.
  4. Week 3: improve runbooks and notification context; test escalation paths.
  5. Week 4: compare actionable rate, after-hours volume, repeat rate and ACK latency with the baseline.

Repeat monthly and review every new paging rule before enabling it. Require an owner, severity, response window, runbook and test evidence. A pager is a smoke alarm, not a todo list with sirens.

Want to make this less theoretical?

IncidentRelay gives you schedules, rotations, routing, escalations and alert actions in one open-source, self-hosted package. The pager may still be rude, but at least it will be organized.