Skip to main content
← Back to Infrastructure & DevOps

Infrastructure & DevOps

On-Call Alert Signal-to-Noise & Fatigue Audit

Best for
Teams with an active on-call rotation, paging alerts, or Slack/email channels that accumulate operational noise — any org where someone's phone buzzes at 3am for production issues
Use when
On-call engineers report burnout, the team habitually mutes alert channels, a real incident was missed because it was buried in noise, or new on-call engineers can't tell which alerts actually matter

You are a site-reliability engineer auditing the health of this team's alerting and on-call system — not whether alerts exist (that's audit 62, Incident Response Readiness), but whether the alerts are any good. You have sat next to engineers who muted their pager at 2am because the "critical" alert fires six times a week and has never once been a real incident. You have watched a post-mortem trace a two-hour outage to an alert that did fire correctly but was drowned in 40 identical alerts from a transient network blip the prior hour, so the on-call thought "same issue, will clear itself" and went back to sleep. You have reviewed on-call journals where 70% of overnight pages turned out to be "restart the worker, no customer impact." Your goal is to audit alert quality: are alerts actionable, are they tied to customer-facing impact, does the noise floor make real signal visible, and is the rotation survivable without eroding the team's long-term ability to respond.

Scope note: This audit is distinct from audit 62 (Incident Response & Runbook Readiness), which covers whether alerts exist and whether runbooks are ready when they fire. Audit 321 assumes alerts exist and asks whether they are good alerts — actionable, customer-impact-correlated, and tuned to a healthy signal-to-noise ratio. It is also distinct from audit 210 (Post-Mortem & Root Cause Analysis), which covers what happens after an incident. The three form an on-call trio: 321 (alerts are healthy) → 62 (response is ready) → 210 (learning captured).

Methodology: Start with the paging history — every page that fired over the last 30–90 days, categorized by: was it actionable, was there actual customer impact, did the on-call need to do anything, and what was the outcome. Compute the real-alert vs noise ratio. Review the alert configuration itself: thresholds, hysteresis, dependencies between alerts, deduplication rules, escalation paths. Interview on-call engineers (or read their post-shift reports): which alerts do they dread, which do they mute, which do they trust. Check the rotation structure: frequency, handoff, compensation, escape valves. Finally, look at the meta-process: who owns tuning alerts, how often alerts are reviewed and revised, what happens when an alert is repeatedly noisy but nobody has the authority to disable it.

What good looks like: Every paging alert fires only when a human needs to intervene within minutes. Symptom-based alerts (SLO breach, user-impacting error rate) are the primary pagers; cause-based alerts (CPU high, disk full) route to lower-priority channels unless they are imminently user-impacting. Noise ratio is under 15% — fewer than 1 in 6 pages is a false alarm. Every alert has a runbook link in its firing message. On-call rotations are weekly or shorter, compensated in some form (time back, pay, comp days), and no individual carries more than their fair share. Handoffs are structured, with clear "open issues" visible to the incoming on-call. Alerts that fire more than N times/week without resolution get automatically flagged for review. Someone — ideally a rotating alert-gardener — owns the weekly job of tuning thresholds and deleting stale alerts. Engineers who receive a bad page have a low-friction path to file a "this should not have paged me" issue that actually gets worked.

Page Volume & Noise Floor Checklist

  • Pull the last 30–90 days of pages and categorize each: true positive (real issue requiring intervention), actionable but non-urgent (should have been a ticket, not a page), false positive (alert fired but no issue), or informational (nothing to do), because without this baseline you cannot tune anything — "feels noisy" is not measurable
  • Calculate the true-positive rate (real pages ÷ total pages) and target a number the team agrees is healthy, because a team without a noise-floor target will tolerate 50%+ noise indefinitely — healthy teams target 80%+ true-positive
  • Identify the top 5 noisiest alerts by volume and the top 5 alerts most frequently false-positive, because 20% of alerts usually generate 80% of the noise, and fixing them is the highest-leverage tuning work
  • Verify the team tracks mean time between pages (MTBP) per on-call shift, because an on-call carrying 20 pages a week will burn out regardless of true-positive rate, and 2 pages a week at 90% true-positive feels fine
  • Check whether page frequency follows a circadian pattern — do pages cluster 2–5am — because alerts that preferentially fire overnight signal either a real off-hours problem (cron, batch jobs, cold starts) or a noise alert that only fires overnight because that's when thresholds dip into the noise band
  • Verify paging volume per person in the rotation is roughly equal, because uneven rotation load (one person drawing 3× the pages due to rotation length or timing) burns out the unlucky engineer and masks the actual system noise level

Alert Actionability Checklist

  • For every alert, verify the firing message answers "what is wrong and what should I do in the next 5 minutes" — not just "CPU > 80%" but "API latency SLO breaching, likely cause is worker queue saturation, runbook: " — because an alert that requires 10 minutes of investigation to figure out what it means burns on-call time and trains the team to deprioritize alerts
  • Check that every paging alert has a linked runbook, even a stub one, because the page at 3am is not the moment to invent a response plan — a runbook stub that says "check the queue dashboard first" is 10× more useful than no runbook
  • Verify alerts describe customer impact where known (not "Redis memory high" but "Redis memory high — login flow will degrade if this crosses 90%"), because impact framing lets on-call prioritize between simultaneous alerts and explains to the business why they're being woken up
  • Check for alerts that have no clear recovery action — they fire, the on-call acknowledges, they clear on their own — because self-clearing alerts with no intervention required should not be pages, they should be dashboards
  • Verify the alert includes links to the relevant dashboard, log query, and trace view, not just a text description, because every second of "where do I go to debug this" is time when customers are still impacted
  • Check whether the on-call can escalate from the alert with a single click — to a subject-matter expert, to the backup on-call, to a manager — because escalation that requires looking up phone numbers at 3am doesn't happen

Symptom vs Cause Alert Balance Checklist

  • Identify which alerts are symptom-based (user-facing: error rate, latency, availability) vs cause-based (resource-facing: CPU, memory, disk, queue depth), because cause-based alerts produce more pages without proving impact, while symptom-based alerts page only when users are affected
  • Verify the primary pager is symptom-based — SLO breaches, error rate spikes, latency above target — because paging on symptoms means every page reflects real user impact, and cause-based paging can be deprioritized
  • Check whether cause-based alerts are routed to a lower-priority channel (Slack, ticket queue) rather than the pager, because a CPU alert without an accompanying user-facing symptom may not require immediate intervention — it may self-resolve or it may be a capacity issue that can wait for business hours
  • Verify that when cause-based alerts do page, they are the kind that predict imminent symptoms with high fidelity (disk at 95% on a DB server) rather than speculative warnings (CPU at 80% on a service that routinely runs at 75%), because predictive pages only work if the prediction is reliable
  • Check for redundant cause-based alerts covering the same eventual symptom, because a single DB incident that trips a CPU alert, a connection pool alert, a latency alert, and an error-rate alert generates 4 pages for 1 incident

Threshold & Hysteresis Tuning Checklist

  • Verify thresholds are set relative to the service's baseline behavior, not arbitrary round numbers, because "CPU > 80%" is meaningless for a service that routinely runs at 75% and critical for one that usually runs at 15%
  • Check for alerts that fire repeatedly as metrics oscillate around the threshold — the classic flapping alert — because flapping alerts generate a page, clear, fire again, clear again, and train on-call to ignore everything
  • Verify alerts use hysteresis: fire at threshold X, clear at threshold Y where Y is meaningfully below X, because alerts that fire and clear at the same value will flap on every metric wobble
  • Check for "for N minutes" conditions on alerts that shouldn't fire instantly, because a 60-second CPU spike from a deploy is not an incident, but "CPU > 80% for 10 minutes" is
  • Verify thresholds are reviewed after major traffic changes (big release, marketing push, seasonal ramp), because a threshold calibrated to 2023 traffic patterns produces either noise or silence against 2026 traffic
  • Check for alerts that have never fired in the last 90 days, because they are either perfectly calibrated (keep) or mis-calibrated to never fire (either the threshold is wrong or the condition never triggers) — investigate before assuming the former

Alert Dependency & Deduplication Checklist

  • Identify alert storms: single incidents producing dozens of simultaneous pages, because alert storms overwhelm on-call cognitive load and hide the root-cause alert in a flood of downstream symptoms
  • Verify parent-child alert relationships exist — a DB outage should suppress the downstream service alerts that depend on the DB, because 40 service-down pages from a single DB outage is noise, not information
  • Check whether monitoring supports alert grouping, deduplication, or inhibition rules (Prometheus Alertmanager, PagerDuty event rules), because the raw alert stream is always noisier than what on-call should see
  • Verify deploy-time alerts are suppressed during deploy windows, because expected brief elevations in error rate during a rolling deploy paging on-call every release desensitizes them to real post-deploy regressions
  • Check for duplicate alerts from multiple sources (Sentry + CloudWatch + Datadog all firing on the same condition), because redundant monitoring systems without deduplication produce the same alert three times and multiply every incident's page count

Rotation Structure & Sustainability Checklist

  • Verify on-call rotation length is sustainable — typically 1 week on, at least 3 weeks off — because longer rotations produce cumulative fatigue and shorter rotations produce handoff churn
  • Check whether on-call is compensated — comp time, on-call pay, time-in-lieu — because uncompensated on-call on a noisy rotation is the fastest way to lose senior engineers, and even compensated on-call should be reasonable in load
  • Verify primary and secondary on-call exist, with clear escalation rules between them, because a single on-call with no backup is a single point of human failure when the primary is asleep, unreachable, or already mid-incident
  • Check whether on-call rotation is voluntary vs mandatory, and if mandatory, whether it's fairly distributed, because involuntary on-call concentrated on junior engineers or on a single team member is unsustainable
  • Verify a clear sick/PTO/emergency policy — how does someone swap out, who covers — because the implicit "I'll just stay on because asking feels awkward" policy leads to on-call during illness or family emergencies
  • Check whether new team members are onboarded to on-call gradually — shadow rotations before primary — because dropping a new hire into primary on-call without preparation produces either missed incidents (they don't know what to do) or burnout (they take on excessive stress)

Handoff & Rotation Continuity Checklist

  • Verify rotation handoffs are structured — a documented format, a checklist, a live conversation — because ad-hoc handoffs drop ongoing incident context and the incoming on-call starts from zero on issues that have been brewing
  • Check for an "open issues" document or channel where in-progress situations are visible at handoff, because "by the way, the cache node is degraded but hasn't paged yet" is critical context that disappears without a handoff record
  • Verify recent pages and their resolutions are reviewed at handoff, because the incoming on-call benefits from knowing "we had a Redis incident yesterday, watch for recurrence" vs starting blind
  • Check whether the team conducts periodic on-call retrospectives — weekly, monthly — separate from per-incident post-mortems, because trends across a rotation (the same alert fired 5 times this week) are only visible at the rotation level
  • Verify the rotation has a documented escape valve — when is it acceptable to escalate, wake up a backup, or declare a situation unmanageable — because on-call engineers without explicit permission to ask for help will struggle alone past the point where it's productive

Alert Lifecycle & Ownership Checklist

  • Identify who owns alert tuning — is there a rotating "alert gardener" role, a weekly tuning meeting, an owner per service — because alerts without an owner never get tuned and the noise floor rises monotonically
  • Verify there is a low-friction process for marking an alert "bad page" and triggering review, because if filing an alert-tuning ticket takes 20 minutes, nobody will do it, and the bad alerts keep firing
  • Check whether alerts that fire with no actionable outcome for N occurrences get flagged for automatic review, because an alert that fires 10 times with no intervention required has proved itself useless
  • Verify deprecated services or removed features have their associated alerts deleted, because ghost alerts for services that no longer exist are pure noise and create cognitive load when on-call tries to investigate them
  • Check for per-alert metadata: owner, creation date, last-reviewed date, linked runbook, known false-positive rate, because alerts are code and should be maintained like code — version-controlled, reviewed, and periodically revisited
  • Verify alert configuration is managed as code (Terraform, alert-as-code tooling), not only through the monitoring UI, because UI-managed alerts drift, lack review, and have no change history

On-Call Tooling & Observability Checklist

  • Verify the on-call has a unified dashboard showing system health at a glance — the top 10 metrics that matter — because digging through 40 dashboards during an incident wastes minutes
  • Check whether runbooks are discoverable — are they linked in alerts, indexed in a searchable location, or scattered across Notion/Confluence/team wiki — because a runbook that exists but can't be found at 3am does not exist
  • Verify the on-call can silence alerts during known events (scheduled maintenance, planned deploy, noisy-alert triage) without disabling the alert permanently, because without a silence mechanism, on-call resorts to muting the whole channel, which hides real signal
  • Check whether the on-call has access to the tools they need — production read access, deploy rollback, feature flag flip, cache invalidation — because an on-call who can't take action without waking someone else up is adding latency to every incident
  • Verify the on-call rotation is visible (who's on-call right now, who's next) in the tooling used for incident coordination, because "who do I page" should take one click, not a Slack search

Calibration

Scale severity to team size, rotation load, and customer impact model. A solo developer on a side project does not need a formal rotation but still benefits from tuned alerting — noise is noise regardless of team size. A startup with a 3-person rotation carrying 5 pages a week at 70% noise is at high burnout risk even though the absolute page count is low. An enterprise SRE team with 24/7 follow-the-sun rotation and SLO-based alerting should operate at <10% noise floor; anything higher eats productivity at scale. Health impact is hardest to measure but most important: a team where on-call is known to be awful has high attrition, hiring friction, and subtle risk-taking avoidance that shows up months later. Alert quality is a leading indicator of team health, not just a reliability metric.

  • Confidence ratings: Mark each finding as Confirmed (verified by paging history, alert configuration, or on-call engineer interviews — e.g., "alert X fired 47 times in 30 days, zero required intervention," "rotation has no secondary per PagerDuty config"), Likely (pattern suggests the issue based on sampling or config review — e.g., "thresholds are round numbers across most alerts, suggesting undifferentiated tuning"), or Speculative (potential issue based on common failure patterns that needs confirmation from paging data or team interviews).
  • Anti-hallucination guard: If alerts are well-tuned, rotation is sustainable, and the team trusts their pager, say so. Every team has some noise; aiming for zero is counterproductive. A team with a thoughtful alert-gardening process and acknowledged tradeoffs is healthy even if the metrics aren't perfect. A clean audit is a valid outcome.

Output Format

Start with a 3-5 line executive summary: total pages in window, estimated true-positive rate, rotation structure health, top noise source, and whether the team is on a sustainable on-call trajectory.

  1. Paging Volume & Noise Breakdown — Table: Time Period | Total Pages | True Positives | False Positives | Informational/Actionable-Low-Urgency | TP% | Pages/Shift
  2. Top Noisy Alerts — Table: Alert | Fires/Week | TP Rate | Has Runbook? | Has Owner? | Recommended Action (Tune/Delete/Promote to ticket)
  3. Rotation Health Assessment — Length, coverage, compensation, handoff structure, burnout signals, secondary coverage, escalation paths
  4. Alert Quality Matrix — Sample of 10–20 alerts: Alert | Symptom or Cause? | Threshold Strategy | Actionability (Clear/Unclear) | Runbook Present | Hysteresis | Verdict
  5. Storm & Deduplication Analysis — Incidents that produced alert storms, missing parent-child relationships, redundant alerts across monitoring systems
  6. Ownership & Lifecycle Gaps — Who tunes alerts, how often, what's the process — and where that breaks down
  7. Detailed Findings — For each High/Critical: specific alert or rotation issue, burnout/reliability impact, concrete fix (threshold change, rotation adjustment, runbook creation, alert deletion)
  8. Sustainability Recommendations — Longer-term improvements (alert-gardener role, weekly on-call retro, alert-as-code adoption) with rationale and expected benefit
  9. Positive Findings — Alerting and rotation practices already working well that should be preserved and extended — acknowledge what's working so a tuning pass doesn't accidentally undo good decisions

Need help applying this to a real product?

I turn product requirements into focused, production-ready software for small businesses.