diff --git a/src/sentry/analytics/events/eventuser_endpoint_request.py b/src/sentry/analytics/events/eventuser_endpoint_request.py index 79c28fdc6868a5..f54012239e4bac 100644 --- a/src/sentry/analytics/events/eventuser_endpoint_request.py +++ b/src/sentry/analytics/events/eventuser_endpoint_request.py @@ -1,13 +1,10 @@ from sentry import analytics +@analytics.eventclass("eventuser_endpoint.request") class EventUserEndpointRequest(analytics.Event): - type = "eventuser_endpoint.request" - - attributes = ( - analytics.Attribute("endpoint", required=True), - analytics.Attribute("project_id", required=False), - ) + endpoint: str + project_id: int | None = None analytics.register(EventUserEndpointRequest) diff --git a/src/sentry/analytics/events/first_profile_sent.py b/src/sentry/analytics/events/first_profile_sent.py index caa3a81a6d6750..8ec146785ee937 100644 --- a/src/sentry/analytics/events/first_profile_sent.py +++ b/src/sentry/analytics/events/first_profile_sent.py @@ -1,15 +1,12 @@ from sentry import analytics +@analytics.eventclass("first_profile.sent") class FirstProfileSentEvent(analytics.Event): - type = "first_profile.sent" - - attributes = ( - analytics.Attribute("organization_id"), - analytics.Attribute("project_id"), - analytics.Attribute("platform", required=False), - analytics.Attribute("user_id", required=False), - ) + organization_id: int + project_id: int + platform: str | None = None + user_id: int | None = None analytics.register(FirstProfileSentEvent) diff --git a/src/sentry/api/endpoints/group_tagkey_values.py b/src/sentry/api/endpoints/group_tagkey_values.py index 57a77ca2c44b8a..103b938527cf9d 100644 --- a/src/sentry/api/endpoints/group_tagkey_values.py +++ b/src/sentry/api/endpoints/group_tagkey_values.py @@ -3,6 +3,7 @@ from rest_framework.response import Response from sentry import analytics, tagstore +from sentry.analytics.events.eventuser_endpoint_request import EventUserEndpointRequest from sentry.api.api_owners import ApiOwner from sentry.api.api_publish_status import ApiPublishStatus from sentry.api.base import region_silo_endpoint @@ -68,9 +69,10 @@ def get(self, request: Request, group, key) -> Response: List a Tag's Values """ analytics.record( - "eventuser_endpoint.request", - project_id=group.project_id, - endpoint="sentry.api.endpoints.group_tagkey_values.get", + EventUserEndpointRequest( + project_id=group.project_id, + endpoint="sentry.api.endpoints.group_tagkey_values.get", + ) ) lookup_key = tagstore.backend.prefix_reserved_key(key) diff --git a/src/sentry/api/endpoints/project_users.py b/src/sentry/api/endpoints/project_users.py index fffd5df8ac17b0..70714ef3c87d65 100644 --- a/src/sentry/api/endpoints/project_users.py +++ b/src/sentry/api/endpoints/project_users.py @@ -2,6 +2,7 @@ from rest_framework.response import Response from sentry import analytics +from sentry.analytics.events.eventuser_endpoint_request import EventUserEndpointRequest from sentry.api.api_publish_status import ApiPublishStatus from sentry.api.base import region_silo_endpoint from sentry.api.bases.project import ProjectAndStaffPermission, ProjectEndpoint @@ -41,9 +42,10 @@ def get(self, request: Request, project) -> Response: For example, ``query=email:foo@example.com`` """ analytics.record( - "eventuser_endpoint.request", - project_id=project.id, - endpoint="sentry.api.endpoints.project_users.get", + EventUserEndpointRequest( + project_id=project.id, + endpoint="sentry.api.endpoints.project_users.get", + ) ) field, identifier = None, None if request.GET.get("query"): diff --git a/src/sentry/receivers/onboarding.py b/src/sentry/receivers/onboarding.py index f2ad6b7158cd74..8cd420b13e0752 100644 --- a/src/sentry/receivers/onboarding.py +++ b/src/sentry/receivers/onboarding.py @@ -7,6 +7,7 @@ from django.db.models import F from sentry import analytics +from sentry.analytics.events.first_profile_sent import FirstProfileSentEvent from sentry.integrations.base import IntegrationDomain, get_integration_types from sentry.integrations.services.integration import RpcIntegration, integration_service from sentry.models.organization import Organization @@ -182,11 +183,12 @@ def record_first_transaction(project, event, **kwargs): @first_profile_received.connect(weak=False, dispatch_uid="onboarding.record_first_profile") def record_first_profile(project, **kwargs): analytics.record( - "first_profile.sent", - user_id=get_owner_id(project), - organization_id=project.organization_id, - project_id=project.id, - platform=project.platform, + FirstProfileSentEvent( + user_id=get_owner_id(project), + organization_id=project.organization_id, + project_id=project.id, + platform=project.platform, + ) ) diff --git a/src/sentry/tasks/unmerge.py b/src/sentry/tasks/unmerge.py index 3afb03d2aa4c3d..680913b781edbd 100644 --- a/src/sentry/tasks/unmerge.py +++ b/src/sentry/tasks/unmerge.py @@ -11,6 +11,7 @@ from django.db.models.base import Model from sentry import analytics, eventstore, features, similarity, tsdb +from sentry.analytics.events.eventuser_endpoint_request import EventUserEndpointRequest from sentry.constants import DEFAULT_LOGGER_NAME, LOG_LEVELS_MAP from sentry.culprit import generate_culprit from sentry.eventstore.models import BaseEvent @@ -380,9 +381,10 @@ def repair_group_release_data(caches, project, events): def get_event_user_from_interface(value, project): analytics.record( - "eventuser_endpoint.request", - project_id=project.id, - endpoint="sentry.tasks.unmerge.get_event_user_from_interface", + EventUserEndpointRequest( + project_id=project.id, + endpoint="sentry.tasks.unmerge.get_event_user_from_interface", + ) ) return EventUser( user_ident=value.get("id"), diff --git a/tests/sentry/api/endpoints/test_group_tagkey_values.py b/tests/sentry/api/endpoints/test_group_tagkey_values.py index 63334eb6c9ab80..b593e7f37e15e6 100644 --- a/tests/sentry/api/endpoints/test_group_tagkey_values.py +++ b/tests/sentry/api/endpoints/test_group_tagkey_values.py @@ -5,7 +5,9 @@ from django.test import override_settings from django.utils import timezone +from sentry.analytics.events.eventuser_endpoint_request import EventUserEndpointRequest from sentry.testutils.cases import APITestCase, PerformanceIssueTestCase, SnubaTestCase +from sentry.testutils.helpers.analytics import assert_last_analytics_event from sentry.testutils.helpers.datetime import before_now, freeze_time @@ -33,10 +35,12 @@ def test_simple(self, mock_record): assert response.data[0]["value"] == "bar" - mock_record.assert_called_with( - "eventuser_endpoint.request", - project_id=project.id, - endpoint="sentry.api.endpoints.group_tagkey_values.get", + assert_last_analytics_event( + mock_record, + EventUserEndpointRequest( + project_id=project.id, + endpoint="sentry.api.endpoints.group_tagkey_values.get", + ), ) def test_simple_perf(self): @@ -208,8 +212,10 @@ def test_ratelimit(self, mock_record) -> None: response = self.client.get(url) assert response.status_code == 429 - mock_record.assert_called_with( - "eventuser_endpoint.request", - project_id=project.id, - endpoint="sentry.api.endpoints.group_tagkey_values.get", + assert_last_analytics_event( + mock_record, + EventUserEndpointRequest( + project_id=project.id, + endpoint="sentry.api.endpoints.group_tagkey_values.get", + ), ) diff --git a/tests/sentry/api/endpoints/test_project_users.py b/tests/sentry/api/endpoints/test_project_users.py index e90ff08b168e8f..c5ac4e65d23092 100644 --- a/tests/sentry/api/endpoints/test_project_users.py +++ b/tests/sentry/api/endpoints/test_project_users.py @@ -3,7 +3,9 @@ from django.utils import timezone +from sentry.analytics.events.eventuser_endpoint_request import EventUserEndpointRequest from sentry.testutils.cases import APITestCase, SnubaTestCase +from sentry.testutils.helpers.analytics import assert_any_analytics_event from sentry.utils.eventuser import EventUser @@ -55,10 +57,13 @@ def _assert_simple_response(self, response, mock_record): assert sorted(map(lambda x: x["id"], response.data)) == sorted( [str(self.euser1.id), str(self.euser2.id)] ) - mock_record.assert_any_call( - "eventuser_endpoint.request", - project_id=self.project.id, - endpoint="sentry.api.endpoints.project_users.get", + + assert_any_analytics_event( + mock_record, + EventUserEndpointRequest( + project_id=self.project.id, + endpoint="sentry.api.endpoints.project_users.get", + ), ) @mock.patch("sentry.analytics.record") diff --git a/tests/snuba/tasks/test_unmerge.py b/tests/snuba/tasks/test_unmerge.py index 61f56c54749576..88fab269a161a9 100644 --- a/tests/snuba/tasks/test_unmerge.py +++ b/tests/snuba/tasks/test_unmerge.py @@ -12,6 +12,7 @@ from django.utils import timezone from sentry import eventstream, tsdb +from sentry.analytics.events.eventuser_endpoint_request import EventUserEndpointRequest from sentry.eventstore.models import Event from sentry.models.environment import Environment from sentry.models.group import Group @@ -31,6 +32,7 @@ unmerge, ) from sentry.testutils.cases import SnubaTestCase, TestCase +from sentry.testutils.helpers.analytics import assert_last_analytics_event from sentry.testutils.helpers.datetime import before_now from sentry.testutils.helpers.features import with_feature from sentry.tsdb.base import TSDBModel @@ -452,10 +454,12 @@ def collect_by_user_tag(aggregate, event): aggregate.add( get_event_user_from_interface(event.data["user"], event.group.project).tag_value ) - mock_record.assert_called_with( - "eventuser_endpoint.request", - project_id=event.group.project.id, - endpoint="sentry.tasks.unmerge.get_event_user_from_interface", + assert_last_analytics_event( + mock_record, + EventUserEndpointRequest( + project_id=event.group.project.id, + endpoint="sentry.tasks.unmerge.get_event_user_from_interface", + ), ) return aggregate