diff --git a/src/sentry/analytics/events/alert_created.py b/src/sentry/analytics/events/alert_created.py index c00ac0b2f4038b..cd20b542cff41f 100644 --- a/src/sentry/analytics/events/alert_created.py +++ b/src/sentry/analytics/events/alert_created.py @@ -1,22 +1,19 @@ from sentry import analytics +@analytics.eventclass("alert.created") class AlertCreatedEvent(analytics.Event): - type = "alert.created" - - attributes = ( - analytics.Attribute("user_id", required=False), - analytics.Attribute("default_user_id"), - analytics.Attribute("organization_id"), - analytics.Attribute("rule_id"), - analytics.Attribute("rule_type"), - analytics.Attribute("is_api_token"), - # `alert_rule_ui_component` can be `alert-rule-action` - analytics.Attribute("alert_rule_ui_component", required=False), - analytics.Attribute("duplicate_rule", required=False), - analytics.Attribute("wizard_v3", required=False), - analytics.Attribute("query_type", required=False), - ) + user_id: str | None = None + default_user_id: str + organization_id: str + rule_id: str + rule_type: str + is_api_token: str + # `alert_rule_ui_component` can be `alert-rule-action` + alert_rule_ui_component: str | None = None + duplicate_rule: str | None = None + wizard_v3: str | None = None + query_type: str | None = None analytics.register(AlertCreatedEvent) diff --git a/src/sentry/analytics/events/data_consent_org_creation.py b/src/sentry/analytics/events/data_consent_org_creation.py index baf9873042cc9f..80cc6c647ff232 100644 --- a/src/sentry/analytics/events/data_consent_org_creation.py +++ b/src/sentry/analytics/events/data_consent_org_creation.py @@ -1,10 +1,9 @@ from sentry import analytics +@analytics.eventclass("aggregated_data_consent.organization_created") class AggregatedDataConsentOrganizationCreatedEvent(analytics.Event): - type = "aggregated_data_consent.organization_created" - - attributes = (analytics.Attribute("organization_id"),) + organization_id: str analytics.register(AggregatedDataConsentOrganizationCreatedEvent) diff --git a/src/sentry/analytics/events/issue_archived.py b/src/sentry/analytics/events/issue_archived.py index e91c6592526c82..bfb74574bd2397 100644 --- a/src/sentry/analytics/events/issue_archived.py +++ b/src/sentry/analytics/events/issue_archived.py @@ -1,16 +1,13 @@ from sentry import analytics +@analytics.eventclass("issue.archived") class IssueArchivedEvent(analytics.Event): - type = "issue.archived" - - attributes = ( - analytics.Attribute("user_id", type=int, required=False), - analytics.Attribute("default_user_id", type=int), - analytics.Attribute("organization_id", type=int), - analytics.Attribute("group_id"), - analytics.Attribute("until_escalating", type=bool, required=False), - ) + user_id: int | None = None + default_user_id: int + organization_id: int + group_id: str + until_escalating: bool | None = None analytics.register(IssueArchivedEvent) diff --git a/src/sentry/analytics/events/issue_ignored.py b/src/sentry/analytics/events/issue_ignored.py index 5ee72f76d71d60..591899c0759cae 100644 --- a/src/sentry/analytics/events/issue_ignored.py +++ b/src/sentry/analytics/events/issue_ignored.py @@ -1,20 +1,17 @@ from sentry import analytics +@analytics.eventclass("issue.ignored") class IssueIgnoredEvent(analytics.Event): - type = "issue.ignored" - - attributes = ( - analytics.Attribute("user_id", type=int, required=False), - analytics.Attribute("default_user_id", type=int), - analytics.Attribute("organization_id", type=int), - analytics.Attribute("group_id"), - analytics.Attribute("ignore_duration", type=int, required=False), - analytics.Attribute("ignore_count", type=int, required=False), - analytics.Attribute("ignore_window", type=int, required=False), - analytics.Attribute("ignore_user_count", type=int, required=False), - analytics.Attribute("ignore_user_window", type=int, required=False), - ) + user_id: int | None = None + default_user_id: int + organization_id: int + group_id: str + ignore_duration: int | None = None + ignore_count: int | None = None + ignore_window: int | None = None + ignore_user_count: int | None = None + ignore_user_window: int | None = None analytics.register(IssueIgnoredEvent) diff --git a/src/sentry/analytics/events/issue_priority.py b/src/sentry/analytics/events/issue_priority.py index 5b900506512b70..183e7cc186f626 100644 --- a/src/sentry/analytics/events/issue_priority.py +++ b/src/sentry/analytics/events/issue_priority.py @@ -1,20 +1,17 @@ from sentry import analytics +@analytics.eventclass("issue.priority_updated") class IssuePriorityUpdatedEvent(analytics.Event): - type = "issue.priority_updated" - - attributes = ( - analytics.Attribute("group_id"), - analytics.Attribute("new_priority"), - analytics.Attribute("project_id"), - analytics.Attribute("organization_id"), - analytics.Attribute("user_id", required=False), - analytics.Attribute("issue_category", required=False), - analytics.Attribute("issue_type", required=False), - analytics.Attribute("previous_priority", required=False), - analytics.Attribute("reason", required=False), - ) + group_id: str + new_priority: str + project_id: str + organization_id: str + user_id: str | None = None + issue_category: str | None = None + issue_type: str | None = None + previous_priority: str | None = None + reason: str | None = None analytics.register(IssuePriorityUpdatedEvent) diff --git a/src/sentry/analytics/events/issue_search_endpoint_queried.py b/src/sentry/analytics/events/issue_search_endpoint_queried.py index f2ace304bd6037..96ee37e3e275f7 100644 --- a/src/sentry/analytics/events/issue_search_endpoint_queried.py +++ b/src/sentry/analytics/events/issue_search_endpoint_queried.py @@ -1,16 +1,13 @@ from sentry import analytics +@analytics.eventclass("issue_search.endpoint_queried") class IssueSearchEndpointQueriedEvent(analytics.Event): - type = "issue_search.endpoint_queried" - - attributes = ( - analytics.Attribute("user_id"), - analytics.Attribute("organization_id"), - analytics.Attribute("project_ids"), # This is a list of project ids - analytics.Attribute("full_query_params"), - analytics.Attribute("query"), - ) + user_id: str + organization_id: str + project_ids: str # This is a list of project ids + full_query_params: str + query: str analytics.register(IssueSearchEndpointQueriedEvent) diff --git a/src/sentry/analytics/events/issue_tracker_used.py b/src/sentry/analytics/events/issue_tracker_used.py index be22cb58d2c928..5c881bf1deacf8 100644 --- a/src/sentry/analytics/events/issue_tracker_used.py +++ b/src/sentry/analytics/events/issue_tracker_used.py @@ -1,16 +1,13 @@ from sentry import analytics +@analytics.eventclass("issue_tracker.used") class IssueTrackerUsedEvent(analytics.Event): - type = "issue_tracker.used" - - attributes = ( - analytics.Attribute("user_id", required=False), - analytics.Attribute("default_user_id"), - analytics.Attribute("organization_id"), - analytics.Attribute("issue_tracker"), - analytics.Attribute("project_id"), - ) + user_id: str | None = None + default_user_id: str + organization_id: str + issue_tracker: str + project_id: str analytics.register(IssueTrackerUsedEvent) diff --git a/src/sentry/analytics/events/issue_unresolved.py b/src/sentry/analytics/events/issue_unresolved.py index 2cb00392dd65f8..d3baf7ba06d70b 100644 --- a/src/sentry/analytics/events/issue_unresolved.py +++ b/src/sentry/analytics/events/issue_unresolved.py @@ -1,16 +1,13 @@ from sentry import analytics +@analytics.eventclass("issue.unresolved") class IssueUnresolvedEvent(analytics.Event): - type = "issue.unresolved" - - attributes = ( - analytics.Attribute("user_id", type=int, required=False), - analytics.Attribute("default_user_id", type=int), - analytics.Attribute("organization_id", type=int), - analytics.Attribute("group_id"), - analytics.Attribute("transition_type"), - ) + user_id: int | None = None + default_user_id: int + organization_id: int + group_id: str + transition_type: str analytics.register(IssueUnresolvedEvent) diff --git a/src/sentry/analytics/events/metric_alert_with_ui_component_created.py b/src/sentry/analytics/events/metric_alert_with_ui_component_created.py index 5a1b6a3a7a623d..3632216c8ad168 100644 --- a/src/sentry/analytics/events/metric_alert_with_ui_component_created.py +++ b/src/sentry/analytics/events/metric_alert_with_ui_component_created.py @@ -1,14 +1,11 @@ from sentry import analytics +@analytics.eventclass("metric_alert_with_ui_component.created") class MetricAlertWithUiComponentCreatedEvent(analytics.Event): - type = "metric_alert_with_ui_component.created" - - attributes = ( - analytics.Attribute("user_id", required=False), - analytics.Attribute("alert_rule_id"), - analytics.Attribute("organization_id"), - ) + user_id: str | None = None + alert_rule_id: str + organization_id: str analytics.register(MetricAlertWithUiComponentCreatedEvent) diff --git a/src/sentry/analytics/events/monitor_mark_failed.py b/src/sentry/analytics/events/monitor_mark_failed.py index d9101c9ec6fd66..1bc167da7befd7 100644 --- a/src/sentry/analytics/events/monitor_mark_failed.py +++ b/src/sentry/analytics/events/monitor_mark_failed.py @@ -1,15 +1,12 @@ from sentry import analytics +@analytics.eventclass("monitor_environment.mark_failed") class MonitorEnvironmentMarkFailed(analytics.Event): - type = "monitor_environment.mark_failed" - - attributes = ( - analytics.Attribute("organization_id"), - analytics.Attribute("monitor_id"), - analytics.Attribute("project_id"), - analytics.Attribute("environment_id"), - ) + organization_id: str + monitor_id: str + project_id: str + environment_id: str analytics.register(MonitorEnvironmentMarkFailed) diff --git a/src/sentry/analytics/events/organization_created.py b/src/sentry/analytics/events/organization_created.py index 99a3ea8ea78ae8..3394b35056f239 100644 --- a/src/sentry/analytics/events/organization_created.py +++ b/src/sentry/analytics/events/organization_created.py @@ -1,15 +1,12 @@ from sentry import analytics +@analytics.eventclass("organization.created") class OrganizationCreatedEvent(analytics.Event): - type = "organization.created" - - attributes = ( - analytics.Attribute("id"), - analytics.Attribute("name"), - analytics.Attribute("slug"), - analytics.Attribute("actor_id", required=False), - ) + id: str + name: str + slug: str + actor_id: str | None = None analytics.register(OrganizationCreatedEvent) diff --git a/src/sentry/analytics/events/organization_joined.py b/src/sentry/analytics/events/organization_joined.py index fbece75626a8cc..c47cce157f9e55 100644 --- a/src/sentry/analytics/events/organization_joined.py +++ b/src/sentry/analytics/events/organization_joined.py @@ -1,10 +1,10 @@ from sentry import analytics +@analytics.eventclass("organization.joined") class OrganizationJoinedEvent(analytics.Event): - type = "organization.joined" - - attributes = (analytics.Attribute("user_id"), analytics.Attribute("organization_id")) + user_id: str + organization_id: str analytics.register(OrganizationJoinedEvent) diff --git a/src/sentry/analytics/events/project_created.py b/src/sentry/analytics/events/project_created.py index 60bdcdd959a0d8..9d3767125e191e 100644 --- a/src/sentry/analytics/events/project_created.py +++ b/src/sentry/analytics/events/project_created.py @@ -1,17 +1,14 @@ from sentry import analytics +@analytics.eventclass("project.created") class ProjectCreatedEvent(analytics.Event): - type = "project.created" - - attributes = ( - analytics.Attribute("user_id", required=False), - analytics.Attribute("default_user_id"), - analytics.Attribute("organization_id"), - analytics.Attribute("origin", required=False), - analytics.Attribute("project_id"), - analytics.Attribute("platform", required=False), - ) + user_id: str | None = None + default_user_id: str + organization_id: str + origin: str | None = None + project_id: str + platform: str | None = None analytics.register(ProjectCreatedEvent) diff --git a/src/sentry/analytics/events/search_saved.py b/src/sentry/analytics/events/search_saved.py index 34c0041d1cf37b..df5e2f4de6dd4f 100644 --- a/src/sentry/analytics/events/search_saved.py +++ b/src/sentry/analytics/events/search_saved.py @@ -1,15 +1,12 @@ from sentry import analytics +@analytics.eventclass("search.saved") class SearchSavedEvent(analytics.Event): - type = "search.saved" - - attributes = ( - analytics.Attribute("user_id", required=False), - analytics.Attribute("default_user_id"), - analytics.Attribute("project_id"), - analytics.Attribute("organization_id"), - ) + user_id: str | None = None + default_user_id: str + project_id: str + organization_id: str analytics.register(SearchSavedEvent) diff --git a/src/sentry/analytics/events/sso_enabled.py b/src/sentry/analytics/events/sso_enabled.py index 1e2589127f678a..5a7223cfb6ae15 100644 --- a/src/sentry/analytics/events/sso_enabled.py +++ b/src/sentry/analytics/events/sso_enabled.py @@ -1,14 +1,11 @@ from sentry import analytics +@analytics.eventclass("sso.enabled") class SSOEnabledEvent(analytics.Event): - type = "sso.enabled" - - attributes = ( - analytics.Attribute("user_id"), - analytics.Attribute("organization_id"), - analytics.Attribute("provider"), - ) + user_id: str + organization_id: str + provider: str analytics.register(SSOEnabledEvent) diff --git a/src/sentry/analytics/events/team_created.py b/src/sentry/analytics/events/team_created.py index 63a7a606376b93..6218935b552379 100644 --- a/src/sentry/analytics/events/team_created.py +++ b/src/sentry/analytics/events/team_created.py @@ -1,15 +1,12 @@ from sentry import analytics +@analytics.eventclass("team.created") class TeamCreatedEvent(analytics.Event): - type = "team.created" - - attributes = ( - analytics.Attribute("user_id", required=False), - analytics.Attribute("default_user_id"), - analytics.Attribute("organization_id"), - analytics.Attribute("team_id"), - ) + user_id: str | None = None + default_user_id: str + organization_id: str + team_id: str analytics.register(TeamCreatedEvent) diff --git a/src/sentry/api/endpoints/organization_index.py b/src/sentry/api/endpoints/organization_index.py index 8626a0b2cd97b3..af67269833e1ef 100644 --- a/src/sentry/api/endpoints/organization_index.py +++ b/src/sentry/api/endpoints/organization_index.py @@ -10,6 +10,10 @@ from sentry import analytics, audit_log, features, options from sentry import ratelimits as ratelimiter +from sentry.analytics.events.data_consent_org_creation import ( + AggregatedDataConsentOrganizationCreatedEvent, +) +from sentry.analytics.events.organization_created import OrganizationCreatedEvent from sentry.api.api_publish_status import ApiPublishStatus from sentry.api.base import Endpoint, region_silo_endpoint from sentry.api.bases.organization import OrganizationPermission @@ -276,9 +280,9 @@ def post(self, request: Request) -> Response: ) analytics.record( - "organization.created", - org, - actor_id=request.user.id if request.user.is_authenticated else None, + OrganizationCreatedEvent( + actor_id=request.user.id if request.user.is_authenticated else None, + ) ) # TODO(hybrid-cloud): We'll need to catch a more generic error @@ -301,8 +305,9 @@ def post(self, request: Request) -> Response: org.update_option("sentry:aggregated_data_consent", True) analytics.record( - "aggregated_data_consent.organization_created", - organization_id=org.id, + AggregatedDataConsentOrganizationCreatedEvent( + organization_id=org.id, + ) ) # New organizations should not see the legacy UI diff --git a/src/sentry/incidents/serializers/alert_rule_trigger_action.py b/src/sentry/incidents/serializers/alert_rule_trigger_action.py index de37f0a17f5af2..277382ccee22ca 100644 --- a/src/sentry/incidents/serializers/alert_rule_trigger_action.py +++ b/src/sentry/incidents/serializers/alert_rule_trigger_action.py @@ -3,6 +3,9 @@ from rest_framework import serializers from sentry import analytics +from sentry.analytics.events.metric_alert_with_ui_component_created import ( + MetricAlertWithUiComponentCreatedEvent, +) from sentry.api.serializers.rest_framework.base import CamelSnakeModelSerializer from sentry.auth.access import Access from sentry.incidents.logic import ( @@ -209,10 +212,11 @@ def create(self, validated_data): raise serializers.ValidationError(str(e)) analytics.record( - "metric_alert_with_ui_component.created", - user_id=getattr(self.context["user"], "id", None), - alert_rule_id=getattr(self.context["alert_rule"], "id"), - organization_id=getattr(self.context["organization"], "id"), + MetricAlertWithUiComponentCreatedEvent( + user_id=getattr(self.context["user"], "id", None), + alert_rule_id=getattr(self.context["alert_rule"], "id"), + organization_id=getattr(self.context["organization"], "id"), + ) ) return action diff --git a/src/sentry/issues/endpoints/organization_group_index.py b/src/sentry/issues/endpoints/organization_group_index.py index 1b3573ed4d235f..af0857060cf3ae 100644 --- a/src/sentry/issues/endpoints/organization_group_index.py +++ b/src/sentry/issues/endpoints/organization_group_index.py @@ -12,6 +12,7 @@ from sentry_sdk import start_span from sentry import analytics, features, search +from sentry.analytics.events.issue_search_endpoint_queried import IssueSearchEndpointQueriedEvent from sentry.api.api_owners import ApiOwner from sentry.api.api_publish_status import ApiPublishStatus from sentry.api.base import region_silo_endpoint @@ -316,12 +317,15 @@ def get(self, request: Request, organization: Organization) -> Response: # record analytics for search query if request.user: analytics.record( - "issue_search.endpoint_queried", - user_id=request.user.id, - organization_id=organization.id, - project_ids=",".join(map(str, project_ids)), - full_query_params=",".join(f"{key}={value}" for key, value in request.GET.items()), - query=query, + IssueSearchEndpointQueriedEvent( + user_id=request.user.id, + organization_id=organization.id, + project_ids=",".join(map(str, project_ids)), + full_query_params=",".join( + f"{key}={value}" for key, value in request.GET.items() + ), + query=query, + ) ) if query: diff --git a/src/sentry/plugins/bases/issue.py b/src/sentry/plugins/bases/issue.py index 976a519e755a88..75c4a60d2d43d3 100644 --- a/src/sentry/plugins/bases/issue.py +++ b/src/sentry/plugins/bases/issue.py @@ -5,6 +5,7 @@ from rest_framework.request import Request from sentry import analytics +from sentry.analytics.events.issue_tracker_used import IssueTrackerUsedEvent from sentry.models.activity import Activity from sentry.models.groupmeta import GroupMeta from sentry.plugins.base.v1 import Plugin @@ -201,12 +202,13 @@ def view(self, request: Request, group, **kwargs): ) analytics.record( - "issue_tracker.used", - user_id=request.user.id, - default_user_id=project.organization.get_default_owner().id, - organization_id=project.organization_id, - project_id=project.id, - issue_tracker=self.slug, + IssueTrackerUsedEvent( + user_id=request.user.id, + default_user_id=project.organization.get_default_owner().id, + organization_id=project.organization_id, + project_id=project.id, + issue_tracker=self.slug, + ) ) return self.redirect(group.get_absolute_url()) diff --git a/src/sentry/plugins/bases/issue2.py b/src/sentry/plugins/bases/issue2.py index 9ed6b953e255d3..2ce6f21f52b3f3 100644 --- a/src/sentry/plugins/bases/issue2.py +++ b/src/sentry/plugins/bases/issue2.py @@ -10,6 +10,7 @@ from rest_framework.response import Response from sentry import analytics +from sentry.analytics.events.issue_tracker_used import IssueTrackerUsedEvent from sentry.api.api_publish_status import ApiPublishStatus from sentry.api.base import region_silo_endpoint from sentry.api.bases.group import GroupEndpoint @@ -315,12 +316,13 @@ def view_create(self, request: Request, group, **kwargs): ) analytics.record( - "issue_tracker.used", - user_id=request.user.id, - default_user_id=group.project.organization.get_default_owner().id, - organization_id=group.project.organization_id, - project_id=group.project.id, - issue_tracker=self.slug, + IssueTrackerUsedEvent( + user_id=request.user.id, + default_user_id=group.project.organization.get_default_owner().id, + organization_id=group.project.organization_id, + project_id=group.project.id, + issue_tracker=self.slug, + ) ) return Response( diff --git a/src/sentry/receivers/features.py b/src/sentry/receivers/features.py index 07b4af5d2528a7..fbbe41655d3a71 100644 --- a/src/sentry/receivers/features.py +++ b/src/sentry/receivers/features.py @@ -4,6 +4,16 @@ from sentry import analytics from sentry.adoption import manager +from sentry.analytics.events.alert_created import AlertCreatedEvent +from sentry.analytics.events.issue_archived import IssueArchivedEvent +from sentry.analytics.events.issue_ignored import IssueIgnoredEvent +from sentry.analytics.events.issue_priority import IssuePriorityUpdatedEvent +from sentry.analytics.events.issue_unresolved import IssueUnresolvedEvent +from sentry.analytics.events.monitor_mark_failed import MonitorEnvironmentMarkFailed +from sentry.analytics.events.organization_joined import OrganizationJoinedEvent +from sentry.analytics.events.search_saved import SearchSavedEvent +from sentry.analytics.events.sso_enabled import SSOEnabledEvent +from sentry.analytics.events.team_created import TeamCreatedEvent from sentry.integrations.services.integration import integration_service from sentry.models.featureadoption import FeatureAdoption from sentry.models.group import Group @@ -185,7 +195,7 @@ def record_member_joined(organization_id: int, user_id: int, **kwargs): FeatureAdoption.objects.record( organization_id=organization_id, feature_slug="invite_team", complete=True ) - analytics.record("organization.joined", user_id=user_id, organization_id=organization_id) + analytics.record(OrganizationJoinedEvent(user_id=user_id, organization_id=organization_id)) @issue_assigned.connect(weak=False) @@ -253,12 +263,13 @@ def record_issue_unresolved(project, user, group, transition_type, **kwargs): default_user_id = project.organization.default_owner_id or UNKNOWN_DEFAULT_USER_ID analytics.record( - "issue.unresolved", - user_id=user_id, - default_user_id=default_user_id, - organization_id=project.organization_id, - group_id=group.id, - transition_type=transition_type, + IssueUnresolvedEvent( + user_id=user_id, + default_user_id=default_user_id, + organization_id=project.organization_id, + group_id=group.id, + transition_type=transition_type, + ) ) @@ -301,11 +312,12 @@ def record_save_search_created(project, user, **kwargs): default_user_id = project.organization.get_default_owner().id analytics.record( - "search.saved", - user_id=user_id, - default_user_id=default_user_id, - project_id=project.id, - organization_id=project.organization_id, + SearchSavedEvent( + user_id=user_id, + default_user_id=default_user_id, + project_id=project.id, + organization_id=project.organization_id, + ) ) @@ -344,20 +356,21 @@ def record_alert_rule_created( default_user_id = project.organization.get_default_owner().id analytics.record( - "alert.created", - user_id=user_id, - default_user_id=default_user_id, - organization_id=project.organization_id, - project_id=project.id, - rule_id=rule_id, - rule_type=rule_type, - referrer=referrer, - session_id=session_id, - is_api_token=is_api_token, - alert_rule_ui_component=alert_rule_ui_component, - duplicate_rule=duplicate_rule, - wizard_v3=wizard_v3, - query_type=query_type, + AlertCreatedEvent( + user_id=user_id, + default_user_id=default_user_id, + organization_id=project.organization_id, + project_id=project.id, + rule_id=rule_id, + rule_type=rule_type, + referrer=referrer, + session_id=session_id, + is_api_token=is_api_token, + alert_rule_ui_component=alert_rule_ui_component, + duplicate_rule=duplicate_rule, + wizard_v3=wizard_v3, + query_type=query_type, + ) ) @@ -418,7 +431,7 @@ def record_sso_enabled(organization_id, user_id, provider, **kwargs): ) analytics.record( - "sso.enabled", user_id=user_id, organization_id=organization_id, provider=provider + SSOEnabledEvent(user_id=user_id, organization_id=organization_id, provider=provider) ) @@ -495,16 +508,17 @@ def record_issue_ignored(project, user, group_list, activity_data, **kwargs): for group in group_list: analytics.record( - "issue.ignored", - user_id=user_id, - default_user_id=default_user_id, - organization_id=project.organization_id, - group_id=group.id, - ignore_duration=activity_data.get("ignoreDuration"), - ignore_count=activity_data.get("ignoreCount"), - ignore_window=activity_data.get("ignoreWindow"), - ignore_user_count=activity_data.get("ignoreUserCount"), - ignore_user_window=activity_data.get("ignoreUserWindow"), + IssueIgnoredEvent( + user_id=user_id, + default_user_id=default_user_id, + organization_id=project.organization_id, + group_id=group.id, + ignore_duration=activity_data.get("ignoreDuration"), + ignore_count=activity_data.get("ignoreCount"), + ignore_window=activity_data.get("ignoreWindow"), + ignore_user_count=activity_data.get("ignoreUserCount"), + ignore_user_window=activity_data.get("ignoreUserWindow"), + ) ) @@ -518,12 +532,13 @@ def record_issue_archived(project, user, group_list, activity_data, **kwargs): for group in group_list: analytics.record( - "issue.archived", - user_id=user_id, - default_user_id=default_user_id, - organization_id=project.organization_id, - group_id=group.id, - until_escalating=activity_data.get("until_escalating"), + IssueArchivedEvent( + user_id=user_id, + default_user_id=default_user_id, + organization_id=project.organization_id, + group_id=group.id, + until_escalating=activity_data.get("until_escalating"), + ) ) @@ -550,16 +565,17 @@ def record_update_priority( **kwargs, ): analytics.record( - "issue.priority_updated", - group_id=group.id, - new_priority=new_priority, - organization_id=project.organization_id, - project_id=project.id if project else None, - user_id=user_id, - previous_priority=previous_priority, - issue_category=group.issue_category.name.lower(), - issue_type=group.issue_type.slug, - reason=reason, + IssuePriorityUpdatedEvent( + group_id=group.id, + new_priority=new_priority, + organization_id=project.organization_id, + project_id=project.id if project else None, + user_id=user_id, + previous_priority=previous_priority, + issue_category=group.issue_category.name.lower(), + issue_type=group.issue_type.slug, + reason=reason, + ) ) @@ -621,11 +637,12 @@ def record_team_created( default_user_id = user_id analytics.record( - "team.created", - user_id=user_id, - default_user_id=default_user_id, - organization_id=organization.id, - team_id=team_id, + TeamCreatedEvent( + user_id=user_id, + default_user_id=default_user_id, + organization_id=organization.id, + team_id=team_id, + ) ) @@ -712,11 +729,12 @@ def record_issue_deleted(group, user, delete_type, **kwargs): @monitor_environment_failed.connect(weak=False) def record_monitor_failure(monitor_environment, **kwargs): analytics.record( - "monitor_environment.mark_failed", - organization_id=monitor_environment.monitor.organization_id, - monitor_id=monitor_environment.monitor.guid, - project_id=monitor_environment.monitor.project_id, - environment_id=monitor_environment.environment_id, + MonitorEnvironmentMarkFailed( + organization_id=monitor_environment.monitor.organization_id, + monitor_id=monitor_environment.monitor.guid, + project_id=monitor_environment.monitor.project_id, + environment_id=monitor_environment.environment_id, + ) ) diff --git a/src/sentry/receivers/onboarding.py b/src/sentry/receivers/onboarding.py index f2ad6b7158cd74..473cb870cd908f 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.project_created import ProjectCreatedEvent from sentry.integrations.base import IntegrationDomain, get_integration_types from sentry.integrations.services.integration import RpcIntegration, integration_service from sentry.models.organization import Organization @@ -89,13 +90,14 @@ def record_new_project(project, user=None, user_id=None, origin=None, **kwargs): return analytics.record( - "project.created", - user_id=user_id, - default_user_id=default_user_id, - organization_id=project.organization_id, - origin=origin, - project_id=project.id, - platform=project.platform, + ProjectCreatedEvent( + user_id=user_id, + default_user_id=default_user_id, + organization_id=project.organization_id, + origin=origin, + project_id=project.id, + platform=project.platform, + ) ) completed = complete_onboarding_task(