Raxx · internal docs

internal · gated

RCA — CI Alertmanager paged the operator during an authorized maintenance window, then kept paging for an unrelated stale target

Incident ID: 2026-08-07-ci-alertmanager-maintenance-noise Date: 2026-08-07 Severity: SEV-3 (non-blocking degradation, single-system alert-fidelity impact — no customer-facing outage) Duration: Notification-noise window ~06:20-06:43 UTC (the #4416 maintenance window itself); stale-target false-positive re-paging ~06:22-08:32 UTC (~2h10m) until caught and fixed during this response Blast radius: Operator notification channel only (email via Postmark → kris@moosequest.net). No CI or production functional impact — this incident is about alert-signal quality, not the underlying #4416 outage (which has its own RCA). Author: sre-agent

Summary

The authorized #4416 Woodpecker-server-replace maintenance window (~06:20-06:43 UTC, see docs/incidents/2026-08-07-woodpecker-server-replace-pip-cache-activation.md) fired real Alertmanager email notifications (NodeDown, WoodpeckerHealthzDown) to the operator for outage conditions that were expected and authorized. There was no mechanism to say "this specific, time-boxed page is expected" before starting the work. Separately, and more seriously, the replace left a stale Prometheus scrape target: the ci-monitoring Terraform root (a separate root from infra/ci) hardcodes the WP server's private IP as a static scrape target for node_exporter and WP's own /metrics endpoint. When the WP server was replaced, this target was never updated, so node-woodpecker kept trying to reach the destroyed instance's dead IP — connection refused — and the resulting critical NodeDown alert re-fired every repeat_interval (1h) for approximately two hours after the maintenance window closed, with no maintenance excuse at all. Both problems were fixed during this response: a new CI-scoped Alertmanager silence tool (scripts/ops/ci-maintenance-silence.sh) now lets planned CI maintenance suppress exactly the alerts it should, and the stale target was fixed forward (Prometheus config updated + reloaded, node_exporter reinstalled on the new WP server instance) and the underlying Terraform defaults corrected so future replacements start from the right baseline.

Timeline (all times UTC)

Impact

What went well

What didn't go well

Root cause analysis

Detection

Resolution

Action items

# Action Owner Due Issue
1 Bake node_exporter installation into infra/ci/server.tf's boot template (user_data_server.sh.tpl) so a WP server replace doesn't silently drop CI-monitoring's ability to see the box, mirroring the ECR-login fix already tracked for the same template in the #4416 RCA sre-agent 2026-08-14 #4432
2 Evaluate wiring terraform/ci-monitoring's wp_server_private_ip/wp_server_instance_id to a stable, non-IP reference (SSM parameter written by the infra/ci replace procedure, or Terraform remote-state data source across the two roots) instead of a hand-maintained default that must be remembered on every replace sre-agent 2026-08-21 #4433 — DONE, terraform_remote_state chosen, see docs/ops/runbooks/ci-monitoring.md §Cross-root remote state
3 Add a Prometheus alert rule (or Alertmanager time_active matcher check) for "critical alert has been continuously firing longer than N hours with no maintenance silence on record" — turns "silent 2-hour false page" into its own detectable signal instead of relying on operator complaint operator 2026-08-21 #4434
4 Right-size or memory-tune the ci-monitoring box (t4g.small, 2GB RAM, now running 6 containers incl. registry-mirror added 2026-08-05) — MemoryPressureHigh has been active since 07:19 UTC today, a genuine resource-pressure signal, not noise. Options: resize to t4g.medium (+~$13/mo) or tune container memory limits operator 2026-08-14 #4435
5 Adopt scripts/ops/ci-maintenance-silence.sh step 0/last-step discipline for the WP agent ASG's routine instance-refresh path too (not just the full server replace) — already noted inline in ci-build-cache.md step 5, tracked here to confirm it's actually followed on the next agent AMI/LT rotation sre-agent 2026-08-21 #4436

References