From 8803213ae6f250c5ebd7ad7813accf70f61b47f4 Mon Sep 17 00:00:00 2001 From: Andrew Liu <159852527+aliu39@users.noreply.github.com> Date: Mon, 24 Nov 2025 14:15:20 -0800 Subject: [PATCH 1/3] ref(explorer): update issue details copy and rm old rpc --- src/sentry/seer/explorer/tools.py | 120 ------------------------ static/app/views/seerExplorer/utils.tsx | 4 +- 2 files changed, 2 insertions(+), 122 deletions(-) diff --git a/src/sentry/seer/explorer/tools.py b/src/sentry/seer/explorer/tools.py index 5a5c09cdb0f5b3..11c17cb214947d 100644 --- a/src/sentry/seer/explorer/tools.py +++ b/src/sentry/seer/explorer/tools.py @@ -653,126 +653,6 @@ def _get_issue_event_timeseries( return data, stats_period, interval -def get_issue_details( - *, - issue_id: str, - organization_id: int, - selected_event: str, -) -> dict[str, Any] | None: - """ - Args: - issue_id: The issue/group ID (numeric) or short ID (string) to look up. - organization_id: The ID of the issue's organization. - selected_event: The event to return - "oldest", "latest", "recommended", or the event's UUID. - - Returns: - A dict containing: - `issue`: Serialized issue details. - `tags_overview`: A summary of all tags in the issue. - `event`: Serialized event details, selected according to `selected_event`. - `event_id`: The event ID of the selected event. - `event_trace_id`: The trace ID of the selected event. - `project_id`: The ID of the issue's project. - `project_slug`: The slug of the issue's project. - Returns None when the event is not found or an error occurred. - """ - try: - organization = Organization.objects.get(id=organization_id) - except Organization.DoesNotExist: - logger.warning( - "Organization does not exist", - extra={"organization_id": organization_id, "issue_id": issue_id}, - ) - return None - - org_project_ids = Project.objects.filter( - organization=organization, status=ObjectStatus.ACTIVE - ).values_list("id", flat=True) - - try: - if issue_id.isdigit(): - group = Group.objects.get(project_id__in=org_project_ids, id=int(issue_id)) - else: - group = Group.objects.by_qualified_short_id(organization_id, issue_id) - - except Group.DoesNotExist: - logger.warning( - "Issue does not exist for organization", - extra={"organization_id": organization_id, "issue_id": issue_id}, - ) - return None - - serialized_group: dict = serialize(group, user=None, serializer=GroupSerializer()) - - # Add issueTypeDescription as it provides better context for LLMs. Note the initial type should be BaseGroupSerializerResponse. - serialized_group["issueTypeDescription"] = group.issue_type.description - - event: Event | GroupEvent | None - if selected_event == "oldest": - event = group.get_oldest_event() - elif selected_event == "latest": - event = group.get_latest_event() - elif selected_event == "recommended": - event = group.get_recommended_event() - else: - event = eventstore.backend.get_event_by_id( - project_id=group.project_id, - event_id=selected_event, - group_id=group.id, - tenant_ids={"organization_id": organization_id}, - ) - - if not event: - logger.warning( - "Could not find the selected event for the issue", - extra={ - "organization_id": organization_id, - "issue_id": issue_id, - "selected_event": selected_event, - }, - ) - return None - - serialized_event: IssueEventSerializerResponse = serialize( - event, user=None, serializer=EventSerializer() - ) - - try: - tags_overview = get_all_tags_overview(group) - except Exception: - logger.exception( - "Failed to get tags overview for issue", - extra={"organization_id": organization_id, "issue_id": issue_id}, - ) - tags_overview = None - - ts_result = _get_issue_event_timeseries( - organization=organization, - project_id=group.project_id, - issue_short_id=group.qualified_short_id, - first_seen_delta=datetime.now(UTC) - group.first_seen, - ) - if ts_result: - timeseries, stats_period, interval = ts_result - else: - timeseries = None - stats_period = None - interval = None - - return { - "issue": serialized_group, - "event_timeseries": timeseries, - "timeseries_stats_period": stats_period, - "timeseries_interval": interval, - "tags_overview": tags_overview, - "event": serialized_event, - "event_id": event.event_id, - "event_trace_id": event.trace_id, - "project_id": int(serialized_group["project"]["id"]), - "project_slug": serialized_group["project"]["slug"], - } - - def get_issue_and_event_details( *, organization_id: int, diff --git a/static/app/views/seerExplorer/utils.tsx b/static/app/views/seerExplorer/utils.tsx index 03acc4ffe96515..a2b5e96bf9758d 100644 --- a/static/app/views/seerExplorer/utils.tsx +++ b/static/app/views/seerExplorer/utils.tsx @@ -62,7 +62,7 @@ const TOOL_FORMATTERS: Record = { : `Viewed waterfall for trace ${traceId.slice(0, 8)}`; }, - get_issue_details: (args, isLoading) => { + get_issue_and_event_details: (args, isLoading) => { const issueId = args.issue_id || ''; const selectedEvent = args.selected_event; if (selectedEvent) { @@ -414,7 +414,7 @@ export function buildToolLinkUrl( query, }; } - case 'get_issue_details': { + case 'get_issue_and_event_details': { const {event_id, issue_id} = toolLink.params; return {pathname: `/issues/${issue_id}/events/${event_id}/`}; From 9313f1bd2e06ca33042d4eb2f276a584b8c4126c Mon Sep 17 00:00:00 2001 From: Andrew Liu <159852527+aliu39@users.noreply.github.com> Date: Mon, 24 Nov 2025 14:23:18 -0800 Subject: [PATCH 2/3] rev rename --- static/app/views/seerExplorer/utils.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/static/app/views/seerExplorer/utils.tsx b/static/app/views/seerExplorer/utils.tsx index a2b5e96bf9758d..03acc4ffe96515 100644 --- a/static/app/views/seerExplorer/utils.tsx +++ b/static/app/views/seerExplorer/utils.tsx @@ -62,7 +62,7 @@ const TOOL_FORMATTERS: Record = { : `Viewed waterfall for trace ${traceId.slice(0, 8)}`; }, - get_issue_and_event_details: (args, isLoading) => { + get_issue_details: (args, isLoading) => { const issueId = args.issue_id || ''; const selectedEvent = args.selected_event; if (selectedEvent) { @@ -414,7 +414,7 @@ export function buildToolLinkUrl( query, }; } - case 'get_issue_and_event_details': { + case 'get_issue_details': { const {event_id, issue_id} = toolLink.params; return {pathname: `/issues/${issue_id}/events/${event_id}/`}; From f9af9b92d076b5c1dc3249d92f1cbd753cc07deb Mon Sep 17 00:00:00 2001 From: Andrew Liu <159852527+aliu39@users.noreply.github.com> Date: Tue, 25 Nov 2025 13:04:54 -0800 Subject: [PATCH 3/3] rm from rpc --- src/sentry/seer/endpoints/seer_rpc.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/sentry/seer/endpoints/seer_rpc.py b/src/sentry/seer/endpoints/seer_rpc.py index eabbdf1fee1bb0..2c71da086fb592 100644 --- a/src/sentry/seer/endpoints/seer_rpc.py +++ b/src/sentry/seer/endpoints/seer_rpc.py @@ -90,7 +90,6 @@ execute_table_query, execute_timeseries_query, get_issue_and_event_details, - get_issue_details, get_replay_metadata, get_repository_definition, get_trace_item_attributes, @@ -1031,7 +1030,6 @@ def check_repository_integrations_status(*, repository_integrations: list[dict[s "get_profiles_for_trace": rpc_get_profiles_for_trace, "get_issues_for_transaction": rpc_get_issues_for_transaction, "get_trace_waterfall": rpc_get_trace_waterfall, - "get_issue_details": get_issue_details, "get_issue_and_event_details": get_issue_and_event_details, "get_profile_flamegraph": rpc_get_profile_flamegraph, "execute_table_query": execute_table_query,