From b93044e6f01598e72ba4cf6dce841f322da9693e Mon Sep 17 00:00:00 2001 From: sehr-m <58871345+sehr-m@users.noreply.github.com> Date: Fri, 7 Aug 2026 10:36:54 -0700 Subject: [PATCH] ref(seer): add viewer_context_scope to post_process_group Set ViewerContext after project/org resolution in post_process_group, covering all downstream Seer calls in the post-process pipeline (lightweight_rca_cluster, etc.) and any tasks dispatched from it via ViewerContextHook propagation. Part of AIML-3206 (SeerViewerContext retirement Step 2). --- src/sentry/tasks/post_process.py | 70 ++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src/sentry/tasks/post_process.py b/src/sentry/tasks/post_process.py index e384e9be8b9b..7bd16131d91c 100644 --- a/src/sentry/tasks/post_process.py +++ b/src/sentry/tasks/post_process.py @@ -44,6 +44,7 @@ from sentry.utils.sdk_crashes.sdk_crash_detection_config import build_sdk_crash_detection_configs from sentry.utils.services import build_instance_from_options_of_type from sentry.utils.tracing import start_span, trace +from sentry.viewer_context import ActorType, ViewerContext, viewer_context_scope if TYPE_CHECKING: from sentry.eventstream.base import GroupState @@ -610,41 +611,48 @@ def get_event_raise_exception() -> Event: Organization.objects.get_from_cache(id=event.project.organization_id), ) - is_reprocessed = is_reprocessed_event(event.data) - sentry_sdk.set_tag("is_reprocessed", is_reprocessed) - sentry_sdk.set_attribute("is_reprocessed", is_reprocessed) - - metric_tags = {} - if group_id: - group_state: GroupState = { - "id": group_id, - "is_new": is_new, - "is_regression": bool(is_regression), - "is_new_group_environment": is_new_group_environment, - } + with viewer_context_scope( + ViewerContext( + organization_id=event.project.organization_id, + project_id=event.project_id, + actor_type=ActorType.SYSTEM, + ) + ): + is_reprocessed = is_reprocessed_event(event.data) + sentry_sdk.set_tag("is_reprocessed", is_reprocessed) + sentry_sdk.set_attribute("is_reprocessed", is_reprocessed) + + metric_tags = {} + if group_id: + group_state: GroupState = { + "id": group_id, + "is_new": is_new, + "is_regression": bool(is_regression), + "is_new_group_environment": is_new_group_environment, + } - group_event = update_event_group(event, group_state) - bind_organization_context(event.project.organization) - _capture_event_stats(event) + group_event = update_event_group(event, group_state) + bind_organization_context(event.project.organization) + _capture_event_stats(event) - group_event.occurrence = occurrence + group_event.occurrence = occurrence - run_post_process_job( - { - "event": group_event, - "group_state": group_state, - "is_reprocessed": is_reprocessed, - "has_reappeared": bool(not group_state["is_new"]), - "has_escalated": kwargs.get("has_escalated", False), - } - ) - metric_tags["occurrence_type"] = group_event.group.issue_type.slug + run_post_process_job( + { + "event": group_event, + "group_state": group_state, + "is_reprocessed": is_reprocessed, + "has_reappeared": bool(not group_state["is_new"]), + "has_escalated": kwargs.get("has_escalated", False), + } + ) + metric_tags["occurrence_type"] = group_event.group.issue_type.slug - track_event_since_received( - step="end_post_process", - event_data=event.data, - tags=metric_tags, - ) + track_event_since_received( + step="end_post_process", + event_data=event.data, + tags=metric_tags, + ) def run_post_process_job(job: PostProcessJob) -> None: