Skip to content

fix(statuspage): Keep affected components attached on incident updates - #418

Merged
rgibert merged 1 commit into
mainfrom
fix/statuspage-keep-affected-components
Oct 21, 2026
Merged

rgibert merged 1 commit into
mainfrom
fix/statuspage-keep-affected-components

Conversation

@sentry-junior

@sentry-junior sentry-junior Bot commented Oct 21, 2026

Copy link
Copy Markdown
Contributor

Summary

Follow-up to #279. update_incident only puts non-operational components in component_ids. The Slack modal sends every component, so when an update sets all components back to operational (usually the resolve), component_ids goes out as [] and Statuspage removes every component from the incident.

Statuspage sends incident updates to component subscribers based on the incident's affected components (docs). Once none are left, component subscribers stop getting that update and every later one, even when they're subscribed to every component.

Evidence (#triage-incidents, subscriber = Slack subscription with all components checked)

  • qt0614n6hpn1 "Sentry.io not loading": create, both updates and Monitoring all reached the subscriber while Dashboard/API were degraded. The resolve, sent with every component back to operational, never did.
  • gbgxwj82brd4 "Sentry is down": create and first update reached it. Then an update set every component to operational and moved the incident to Monitoring, and the subscriber missed that update, the next one and the resolve.
  • gts1fg3r2j4b (create with components in major outage) was delivered normally.

Fix

On update, fetch the incident and send component_ids = its current components plus any newly non-operational components. Components that recover stay attached, the incident keeps showing what it affected, and subscribers still get the resolve. components still carries every status, so resets to operational still apply. create_incident is unchanged, since there's nothing to keep yet.

Cost: one extra GET for each update that includes components.

Tests

  • uv run pytest src/firetower/integrations/tests/test_statuspage.py passes: 25 tests, including 2 new ones for keeping existing components and adding new ones.
  • pre-commit (ruff, mypy, etc.) passes on the changed files.
  • Not run: slack_app/tests/handlers/test_statuspage.py, which needs Postgres that wasn't available locally (it mocks StatuspageService anyway).

via Richard Gibert.

--

View Junior Session [Sentry]

#279 only sent non-operational components in component_ids. When an
update sets every component back to operational (e.g. resolve), the
incident ends up with no affected components, so component subscribers
stop receiving that update and any later ones, including the resolve.

Union the incident's existing components with newly non-operational
ones so recovered components stay attached to the incident.

Co-Authored-By: Richard Gibert <richard.gibert@sentry.io>
@sentry-junior
sentry-junior Bot requested a review from a team as a code owner October 21, 2026 14:23
@rgibert
rgibert merged commit 747a25a into main Oct 21, 2026
24 checks passed
@rgibert
rgibert deleted the fix/statuspage-keep-affected-components branch October 21, 2026 14:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants