โ† Tutorials
๐Ÿ”• Monitoring

Reduce alert fatigue without hiding failures

Choose alert thresholds, test failure and recovery delays, and handle missing data without silencing outages.

By The Downtime ยท Jul 14, 2026 ยท 1:30 PM ยทUpdated 14 hours ago
Reduce alert fatigue without hiding failures

A noisy alert needs a diagnosis before it gets a longer delay. A rule may fire on harmless variation, page several teams for one failure, or resolve while the service is still broken. Each needs a different fix.

Start with one noisy alert and the action it asks someone to take. Keep its incident history while you change the rule. Fewer notifications only count as an improvement if the revised rule still catches the failures you care about.

Choose a signal that deserves a page

A page should mean someone needs to act now. CPU usage and queue depth can help explain a failure, but a user-facing error or a stalled job may be a better trigger. The Prometheus alerting guidance recommends alerts based on symptoms and calls for monitoring the monitoring system itself.

Check the logic before raising thresholds. Suppose a hypothetical rule requires high errors and high latency. A service that immediately returns HTTP 503 can have a severe error rate and low latency. That rule stays quiet. Use separate error and latency alerts when either failure needs intervention.

Low traffic needs its own policy. A minimum-volume guard can keep one failed request from producing a noisy percentage, but it also suppresses a complete outage below that volume. For a quiet payment endpoint, a controlled synthetic transaction or a longer measurement window may provide better evidence. Google's SRE workbook discusses these low-traffic tradeoffs and multiwindow burn-rate alerts. Our SLO tutorial explains the budget arithmetic.

Static limits and learned baselines answer different questions

A fixed latency limit can express a user requirement. A learned baseline asks whether current behavior differs from its history. A slow service can be normal for its baseline and still fail its users.

Using p95 does not make a threshold dynamic. In the hypothetical rule "p95 latency exceeds 800 ms," p95 is the statistic and 800 ms is a fixed threshold. Change the statistic when the average hides the behavior you need to measure; change the threshold model when historical variation matters.

There is no universal one-to-four-hour training window. CloudWatch anomaly detection, for example, models trends and hourly, daily and weekly patterns using up to two weeks of history. It allows selected periods to be excluded from training. Check what your tool learns and how deployments affect it. Compare a proposed model with known incidents before routing it to an on-call phone.

Failure confirmation has a time cost

Consecutive failures, an M-of-N window and flap detection are separate mechanisms. A consecutive rule resets when a good result arrives. An M-of-N rule counts failures within its window even when they are separated by good results. Nagios Core's flap detection evaluates recent state changes and uses separate high and low thresholds to start and stop notification suppression. It is more than a retry count.

For a hypothetical fixed-start probe schedule, three failed checks spaced 30 seconds apart span 60 seconds from the first failure result to the third, assuming equal check durations. Measured from the outage's start, the wait also includes the offset to the next check. It is roughly 60 to 90 seconds before allowing for timeout, collection and delivery delays. A scheduler that waits until each check finishes before starting its interval has different timing.

The table below isolates a rolling three-of-five rule. Each row is a full window, oldest result first; F means failure and P means pass. Assume fresh results and immediate reevaluation, with no separate recovery hold.

Last five Failures State
F F P F P 3 Firing
F P F P P 2 Clear
F F F F F 5 Firing
F F F F P 4 Firing
F F F P P 3 Firing
F F P P P 2 Clear

The first pair clears after one new pass because an old failure leaves the window. The second sequence needs three passes. Recovery depends on the window contents. It does not always require M consecutive passes. Actual services may add evaluation and missing-data rules, so replay the sequence against the tool you use.

A Prometheus rule with a recovery hold

This example assumes a configured probe exporter supplies a fresh probe_success sample for each checkout target. Zero means the probe failed; one means it passed. The timings are illustrative, not recommended defaults.

groups:
  - name: checkout-probe
    interval: 30s
    rules:
      - alert: CheckoutProbeFailing
        expr: probe_success{job="checkout"} == 0
        for: 1m
        keep_firing_for: 1m
        labels:
          severity: page
        annotations:
          summary: Checkout probe is failing

Prometheus's for and keep_firing_for control the pending duration and the hold after the expression stops matching. A hold does not require fresh successful probes.

We checked this rule with Prometheus 3.5.0's promtool check rules and promtool test rules. Synthetic samples arrived on the evaluation timestamps below. These are rule-engine results, not measured notification delivery times.

Time Probe Alert state
0:00 Pass Inactive
0:30 Fail Pending
1:00 Fail Pending
1:30 Fail Firing
2:00 Pass Firing, held
2:30 Fail Firing
3:00 Pass Firing, held
3:30 Pass Firing, held
4:00 Pass Inactive

A separate test confirmed that an isolated failure resets the pending period after a pass. Another removed the series after firing: the alert eventually cleared even though no successful probe arrived. Prometheus documents the rule-test format, including missing samples and stale markers, so these cases can be tested before a rule is enabled.

Missing data needs an explicit policy

An exporter outage, a removed target and a successful application request are different events. A failed-probe expression alone cannot cover all three. Watch scrape health and expected-target coverage alongside probe results. If a target disappears from discovery, its former metric labels may disappear too.

Prometheus's absent_over_time() can detect an empty range for a specified selector. Plan the expected target set: a broad selector can still return data from one healthy target while another has vanished. An independent check should detect failure of the monitoring pipeline itself.

Other tools have their own policies. CloudWatch's missing-data settings include treating missing points as breaching or good, retaining the current state, or using insufficient-data behavior. Its evaluation can retrieve older real points before filling gaps. Test the actual alarm history rather than assuming every missing point becomes a pass.

Reduce duplicate notifications after detection

Notification timing is another layer. In Alertmanager, group_wait delays the first notification for a new group, group_interval controls checks for changes in an existing group, and repeat_interval controls repeat notifications when the group is unchanged. Those delays contribute to how long a person waits to hear about a firing rule.

Group alerts by labels that describe one incident and one owner. Keep target details in the notification. Inhibition can suppress dependent notifications while a matching parent alert fires; scope its matching labels carefully so a failure in one environment cannot silence another. Use time-limited silences for planned work and verify who receives any unsilenced failures.

Preserve regional evidence too. A failure from one location can reflect a user-visible routing, DNS or address-family problem. A global quorum rule can stay healthy during that failure. Define a separate response for sustained regional trouble; the multi-region monitoring tutorial covers that distinction.

Before enabling a revision, replay a sustained outage, an isolated bad result, alternating failures, missing telemetry and recovery. Record the rule-state timestamps and then test delivery through the configured notification channel. Keep the previous rule available until the revised alert has caught the expected failures and reached the responsible person.

๐Ÿ’ฌ Comments (0)

No comments yet โ€” be the first to weigh in.

Join the conversation.