Skip to content

feat(slos): multiwindow burn-rate alerts - #2296

Merged
Makisuo merged 20 commits into
feat/slo-computefrom
feat/slo-burn-alerts
Nov 6, 2026
Merged

Makisuo merged 20 commits into
feat/slo-computefrom
feat/slo-burn-alerts

test(slos): each burn tier notifies its own destinations

fef1f48
Select commit
Loading
Failed to load commit list.
Maple Review Bot / Maple / review succeeded Nov 6, 2026 in 2m 55s

Confidence 10/10 · No issues found

🟢 Confidence 10/10 · safe to merge. Hold semantics ride alerting-core's existing hold tier and the tier/destination pairing is now pinned by scheduler tests; only two info-level copy/flag items remain open.
2 notes · tests covered · risk medium · 1/1 new units observable

Each SLO now owns a hidden slo_burn_rate rule written in the same transaction, whose evaluator judges a critical (1h+5m, 14.4x) and a warning (6h+30m, 6x) tier on their own window pairs through the existing incident engine. The change is safe to merge; the outstanding items are copy and flag-state, not behavior.

  • sloRuleFields/evaluateSloBurn write and judge the hidden per-SLO burn rule
  • isManagedSignalType hides uptime and SLO rules from the rule APIs and the active cap
  • SLO update rewrites its rule and restores one whose row is gone
  • Destinations are split per tier and validated against the org

Still open from earlier reviews

Fixed since the last review

  • ✅ F11 · No test tells the critical and warning destinations apart, so a swap passes

Production impact

Production traffic of the changed files (last 7 days)
File Calls/day Busiest operations
packages/backend/src/services/alerts/AlertDeliveryDispatch.ts 26 test 26/day, 18.5% err
Telemetry this change adds and removes (1)
  • ➕ span name SloAlertSource.observe · packages/backend/src/services/slos/SloAlertSource.ts:35
What was checked
  • A held tier encodes as alerting-core's hold status, which counts as neither breach nor clear (tiers.ts:16, tiers.ts:114)
  • MANAGED_RULE_PLAN.noDataBehavior is skip, so a skipped SLO tick cannot resolve an open page (AlertRuleModel.ts:250)
  • Every new SLO and rule read/write filters orgId, and destination ids are validated per org before use
Observability coverage: 1 of 1 changes observable
Change Kind Observable Evidence
SLO burn-rate evaluation per rule, on each scheduler tick background yes Effect.fn("SloAlertSource.observe") span under the scheduler tick, with the burn read in the warehouse query context

fef1f48 · Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.