Skip to content

Commit d267770

Browse files
authored
feat(explorer): return issue activity in issue details rpc (#105017)
Returns certain Activity types that seem useful as context in the issue-level data (only if include_issue is true) Closes AIML-2043
1 parent a6d8a7f commit d267770

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

src/sentry/seer/explorer/tools.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212
from sentry.api import client
1313
from sentry.api.endpoints.organization_events_timeseries import TOP_EVENTS_DATASETS
1414
from sentry.api.serializers.base import serialize
15+
from sentry.api.serializers.models.activity import ActivitySerializer
1516
from sentry.api.serializers.models.event import EventSerializer
1617
from sentry.api.serializers.models.group import GroupSerializer
1718
from sentry.api.utils import default_start_end_dates
1819
from sentry.constants import ALL_ACCESS_PROJECT_ID, ObjectStatus
1920
from sentry.issues.grouptype import GroupCategory
21+
from sentry.models.activity import Activity
2022
from sentry.models.apikey import ApiKey
2123
from sentry.models.group import EventOrdering, Group
2224
from sentry.models.organization import Organization
@@ -42,6 +44,7 @@
4244
from sentry.snuba.trace import query_trace_data
4345
from sentry.snuba.trace_metrics import TraceMetrics
4446
from sentry.snuba.utils import get_dataset
47+
from sentry.types.activity import ActivityType
4548
from sentry.utils.dates import outside_retention_with_modified_start, parse_stats_period
4649
from sentry.utils.snuba_rpc import get_trace_rpc
4750

@@ -825,6 +828,18 @@ def _get_recommended_event(
825828
return events[0].for_group(group)
826829

827830

831+
# Activity types to include in issue details for Seer Explorer (manual actions only)
832+
_SEER_EXPLORER_ACTIVITY_TYPES = [
833+
ActivityType.NOTE.value,
834+
ActivityType.SET_RESOLVED.value,
835+
ActivityType.SET_RESOLVED_IN_RELEASE.value,
836+
ActivityType.SET_RESOLVED_IN_COMMIT.value,
837+
ActivityType.SET_RESOLVED_IN_PULL_REQUEST.value,
838+
ActivityType.SET_UNRESOLVED.value,
839+
ActivityType.ASSIGNED.value,
840+
]
841+
842+
828843
def get_issue_and_event_response(
829844
event: Event | GroupEvent, group: Group | None, organization: Organization
830845
) -> dict[str, Any]:
@@ -865,13 +880,30 @@ def get_issue_and_event_response(
865880
else:
866881
timeseries, timeseries_stats_period, timeseries_interval = None, None, None
867882

883+
# Fetch user activity (comments, status changes, etc.)
884+
try:
885+
activities = Activity.objects.filter(
886+
group=group,
887+
type__in=_SEER_EXPLORER_ACTIVITY_TYPES,
888+
).order_by("-datetime")[:50]
889+
serialized_activities = serialize(
890+
list(activities), user=None, serializer=ActivitySerializer()
891+
)
892+
except Exception:
893+
logger.exception(
894+
"Failed to get user activity for issue",
895+
extra={"organization_id": organization.id, "issue_id": group.id},
896+
)
897+
serialized_activities = []
898+
868899
result = {
869900
**result,
870901
"issue": serialized_group,
871902
"event_timeseries": timeseries,
872903
"timeseries_stats_period": timeseries_stats_period,
873904
"timeseries_interval": timeseries_interval,
874905
"tags_overview": tags_overview,
906+
"user_activity": serialized_activities,
875907
}
876908

877909
return result

0 commit comments

Comments
 (0)