Alert fatigue is self-inflicted observability debt: pages that wake humans for conditions that self-heal, duplicate alerts across layers, thresholds set once in 2022. AI is genuinely good at the analysis half — mining firing history for noise patterns and proposing threshold/grouping/inhibition changes.
Tier: Core · Hands-on time: ~75 minutes
The industry's AI-SRE guides converge on alert correlation as the entry-point use case, and they converge on the delivery mechanism too: given how engineers distrust unverified AI changes, every tuning change ships as a reviewed PR with before/after precision-and-recall numbers attached — never auto-applied. This playbook is that measured-PR recipe.
Do not run this during or immediately after a major incident — tuning decisions made in trauma either overcorrect into silence or enshrine panic thresholds.
Export and label the history. Produce one row per firing: rule name, timestamps, duration, labels, disposition (actioned / self-resolved before ack / acked-no-action / storm-member). Disposition is the ground truth for everything downstream; spend the time to get it, scripting joins between Alertmanager and your incident tool.
Mine for noise patterns with claims tied to data.
Analyze this alert firing history (CSV). Identify:
1. NOISY RULES: fired often, rarely actioned — rank by pages-per-action.
2. FLAPPERS: short-duration self-resolvers (candidates for longer `for:`).
3. STORM CLUSTERS: rules that co-fire within 5 minutes (candidates for
grouping or inhibition, with the implied parent-child hypothesis).
4. DEAD RULES: never fired (candidates for deletion or broken-rule check).
For every finding, cite the supporting rows (rule name + firing IDs/dates
+ the computed stat). No recommendation without its numbers.
Spot-check the arithmetic: recompute pages-per-action for two rules by hand or pivot table. Models miscount; the citations make miscounting catchable.
Generate the change set as diffs, one concern per PR. For each accepted finding, have the model draft the concrete edit: raised threshold with rationale, extended for: duration, Alertmanager group_by/inhibition rule with the parent-child claim stated, deletions listed separately. Small PRs — a threshold change and an inhibition rule need different reviewers' attention.
Attach the measurement: replay before/after. This is the load-bearing step. Replay the proposed rules against the same history window and compute per-PR: pages before → pages after; recall check — of the firings that led to real incidents, how many still fire? (must be 100% unless explicitly accepted otherwise, in writing, in the PR); precision estimate — of remaining pages, what fraction were actioned? For Prometheus, replay = re-evaluating rule expressions with new thresholds/durations over historical data (promtool + recorded series, or a script against the HTTP API). The PR description template: problem, change, pages/week before → after, incidents-still-caught 100%, dispositions of what was cut.
Review, merge, and verify live. The reviewer's job: check the replay honestly covers incident recall (open the cited incident firings and confirm the after-rules catch them), sanity-check the inhibition hypothesis (does the parent alert REALLY imply the children are redundant, including during partial failures?), then merge. Tag rules with tuned-by: <PR> and re-measure after two weeks of live traffic; revert is one git revert away — which is the whole reason this ships as PRs.
"Pages down 40%" is not the success metric — "pages down 40%, incident recall still 100%, measured on replay and confirmed live" is. The recall line is what makes noise reduction different from turning off the smoke detector.
Run the aggregation in pandas and give the model the summary table instead of 50,000 raw rows — cheaper, faster, and it converts the model's job from counting (weak) to pattern-reasoning over verified numbers (strong).