Skip to content

Commit 7961fcb

Browse files
committed
ref(analytics): Transform analytics events for TET-831
- Transform event classes to use @analytics.eventclass decorator - Transform analytics.record calls to use event class instances - Update imports as needed Closes TET-831
1 parent 986ceec commit 7961fcb

File tree

12 files changed

+130
-137
lines changed

12 files changed

+130
-137
lines changed

src/sentry/api/endpoints/codeowners/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from rest_framework.request import Request
99

1010
from sentry import analytics, features
11+
from sentry.api.endpoints.codeowners.analytics import CodeOwnersMaxLengthExceeded
1112
from sentry.api.serializers.rest_framework.base import CamelSnakeModelSerializer
1213
from sentry.api.validators.project_codeowners import validate_codeowners_associations
1314
from sentry.integrations.models.repository_project_path_config import RepositoryProjectPathConfig
@@ -56,8 +57,9 @@ def validate(self, attrs: Mapping[str, Any]) -> Mapping[str, Any]:
5657
max_length = self.get_max_length()
5758
if len(attrs["raw"]) > max_length and len(existing_raw) <= max_length:
5859
analytics.record(
59-
"codeowners.max_length_exceeded",
60-
organization_id=self.context["project"].organization.id,
60+
CodeOwnersMaxLengthExceeded(
61+
organization_id=self.context["project"].organization.id,
62+
)
6163
)
6264
raise serializers.ValidationError(
6365
{"raw": f"Raw needs to be <= {max_length} characters in length"}
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
from sentry import analytics
22

33

4+
@analytics.eventclass("codeowners.max_length_exceeded")
45
class CodeOwnersMaxLengthExceeded(analytics.Event):
5-
type = "codeowners.max_length_exceeded"
6-
7-
attributes = (analytics.Attribute("organization_id"),)
6+
organization_id: str
87

98

109
analytics.register(CodeOwnersMaxLengthExceeded)

src/sentry/integrations/discord/analytics.py

Lines changed: 25 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,50 @@
11
from sentry import analytics
22

33

4+
@analytics.eventclass("integrations.discord.notification_sent")
45
class DiscordIntegrationNotificationSent(analytics.Event):
5-
type = "integrations.discord.notification_sent"
6-
7-
attributes = (
8-
analytics.Attribute("organization_id"),
9-
analytics.Attribute("project_id"),
10-
analytics.Attribute("category"),
11-
analytics.Attribute("group_id"),
12-
analytics.Attribute("notification_uuid"),
13-
analytics.Attribute("alert_id", required=False),
14-
)
6+
organization_id: str
7+
project_id: str
8+
category: str
9+
group_id: str
10+
notification_uuid: str
11+
alert_id: str | None = None
1512

1613

14+
@analytics.eventclass("integrations.discord.command_interaction")
1715
class DiscordIntegrationCommandInteractionReceived(analytics.Event):
18-
type = "integrations.discord.command_interaction"
19-
20-
attributes = (analytics.Attribute("command_name"),)
16+
command_name: str
2117

2218

19+
@analytics.eventclass("integrations.discord.identity_linked")
2320
class DiscordIntegrationIdentityLinked(analytics.Event):
24-
type = "integrations.discord.identity_linked"
25-
26-
attributes = (
27-
analytics.Attribute("provider"),
28-
analytics.Attribute("actor_id"),
29-
analytics.Attribute("actor_type"),
30-
)
21+
provider: str
22+
actor_id: str
23+
actor_type: str
3124

3225

26+
@analytics.eventclass("integrations.discord.identity_unlinked")
3327
class DiscordIntegrationIdentityUnlinked(analytics.Event):
34-
type = "integrations.discord.identity_unlinked"
35-
36-
attributes = (
37-
analytics.Attribute("provider"),
38-
analytics.Attribute("actor_id"),
39-
analytics.Attribute("actor_type"),
40-
)
28+
provider: str
29+
actor_id: str
30+
actor_type: str
4131

4232

33+
@analytics.eventclass("integrations.discord.message_interaction")
4334
class DiscordIntegrationMessageInteractionReceived(analytics.Event):
44-
type = "integrations.discord.message_interaction"
45-
46-
attributes = (analytics.Attribute("custom_id"),)
35+
custom_id: str
4736

4837

38+
@analytics.eventclass("integrations.discord.assign")
4939
class DiscordIntegrationAssign(analytics.Event):
50-
type = "integrations.discord.assign"
51-
52-
attributes = (analytics.Attribute("actor_id"),)
40+
actor_id: str
5341

5442

43+
@analytics.eventclass("integrations.discord.status")
5544
class DiscordIntegrationStatus(analytics.Event):
56-
type = "integrations.discord.status"
57-
58-
attributes = (
59-
analytics.Attribute("organization_id"),
60-
analytics.Attribute("user_id"),
61-
analytics.Attribute("status"),
62-
)
45+
organization_id: str
46+
user_id: str
47+
status: str
6348

6449

6550
analytics.register(DiscordIntegrationCommandInteractionReceived)

src/sentry/integrations/discord/webhooks/base.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
from sentry.api.api_owners import ApiOwner
1212
from sentry.api.api_publish_status import ApiPublishStatus
1313
from sentry.api.base import Endpoint, all_silo_endpoint
14+
from sentry.integrations.discord.analytics import (
15+
DiscordIntegrationCommandInteractionReceived,
16+
DiscordIntegrationMessageInteractionReceived,
17+
)
1418
from sentry.integrations.discord.requests.base import DiscordRequest, DiscordRequestError
1519
from sentry.integrations.discord.webhooks.command import DiscordCommandHandler
1620
from sentry.integrations.discord.webhooks.message_component import DiscordMessageComponentHandler
@@ -58,15 +62,17 @@ def post(self, request: Request) -> HttpResponse:
5862

5963
elif discord_request.is_command():
6064
analytics.record(
61-
"integrations.discord.command_interaction",
62-
command_name=discord_request.get_command_name(),
65+
DiscordIntegrationCommandInteractionReceived(
66+
command_name=discord_request.get_command_name(),
67+
)
6368
)
6469
return DiscordCommandHandler(discord_request).handle()
6570

6671
elif discord_request.is_message_component():
6772
analytics.record(
68-
"integrations.discord.message_interaction",
69-
custom_id=discord_request.get_component_custom_id(),
73+
DiscordIntegrationMessageInteractionReceived(
74+
custom_id=discord_request.get_component_custom_id(),
75+
)
7076
)
7177
return DiscordMessageComponentHandler(discord_request).handle()
7278

src/sentry/integrations/discord/webhooks/message_component.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from sentry import analytics
99
from sentry.api.helpers.group_index.update import update_groups
10+
from sentry.integrations.discord.analytics import DiscordIntegrationAssign, DiscordIntegrationStatus
1011
from sentry.integrations.discord.message_builder.base.base import DiscordMessageBuilder
1112
from sentry.integrations.discord.message_builder.base.component import (
1213
DiscordComponentCustomIds as CustomIds,
@@ -175,8 +176,9 @@ def assign(self) -> Response:
175176
assert self.request.user is not None
176177

177178
analytics.record(
178-
"integrations.discord.assign",
179-
actor_id=self.request.user.id,
179+
DiscordIntegrationAssign(
180+
actor_id=self.request.user.id,
181+
)
180182
)
181183

182184
message = DiscordMessageBuilder(
@@ -241,10 +243,11 @@ def archive(self) -> Response:
241243
def update_group(self, data: Mapping[str, object]) -> None:
242244
if self.group:
243245
analytics.record(
244-
"integrations.discord.status",
245-
organization_id=self.group.organization.id,
246-
user_id=self.user.id,
247-
status=data,
246+
DiscordIntegrationStatus(
247+
organization_id=self.group.organization.id,
248+
user_id=self.user.id,
249+
status=data,
250+
)
248251
)
249252
update_groups(
250253
request=self.request.request, groups=[self.group], user=self.user, data=data

src/sentry/integrations/messaging/linkage.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from sentry.integrations.models.external_actor import ExternalActor
2121
from sentry.integrations.models.integration import Integration
2222
from sentry.integrations.services.integration import RpcIntegration, integration_service
23+
from sentry.integrations.slack.analytics import IntegrationIdentityLinked
2324
from sentry.integrations.types import ExternalProviderEnum, ExternalProviders
2425
from sentry.integrations.utils.identities import get_identity_or_404
2526
from sentry.models.organizationmember import OrganizationMember
@@ -492,10 +493,11 @@ def execute(
492493
)
493494

494495
analytics.record(
495-
"integrations.identity_linked",
496-
provider=self.provider_slug,
497-
actor_id=team.id,
498-
actor_type="team",
496+
IntegrationIdentityLinked(
497+
provider=self.provider_slug,
498+
actor_id=team.id,
499+
actor_type="team",
500+
)
499501
)
500502

501503
if not created:

src/sentry/integrations/slack/analytics.py

Lines changed: 35 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,58 @@
11
from sentry import analytics
22

33

4+
@analytics.eventclass("integrations.slack.assign")
45
class SlackIntegrationAssign(analytics.Event):
5-
type = "integrations.slack.assign"
6-
7-
attributes = (analytics.Attribute("actor_id", required=False),)
6+
actor_id: str | None = None
87

98

9+
@analytics.eventclass("integrations.slack.status")
1010
class SlackIntegrationStatus(analytics.Event):
11-
type = "integrations.slack.status"
12-
13-
attributes = (
14-
analytics.Attribute("organization_id"),
15-
analytics.Attribute("status"),
16-
analytics.Attribute("resolve_type", required=False),
17-
analytics.Attribute("user_id", required=False),
18-
)
11+
organization_id: str
12+
status: str
13+
resolve_type: str | None = None
14+
user_id: str | None = None
1915

2016

17+
@analytics.eventclass("integrations.slack.notification_sent")
2118
class SlackIntegrationNotificationSent(analytics.Event):
22-
type = "integrations.slack.notification_sent"
23-
24-
attributes = (
25-
analytics.Attribute("organization_id"),
26-
analytics.Attribute("project_id", required=False),
27-
analytics.Attribute("category"),
28-
analytics.Attribute("actor_id", required=False),
29-
analytics.Attribute("user_id", required=False),
30-
analytics.Attribute("group_id", required=False),
31-
analytics.Attribute("notification_uuid"),
32-
analytics.Attribute("alert_id", required=False),
33-
analytics.Attribute("actor_type", required=False),
34-
)
35-
36-
19+
organization_id: str
20+
project_id: str | None = None
21+
category: str
22+
actor_id: str | None = None
23+
user_id: str | None = None
24+
group_id: str | None = None
25+
notification_uuid: str
26+
alert_id: str | None = None
27+
actor_type: str | None = None
28+
29+
30+
@analytics.eventclass("integrations.identity_linked")
3731
class IntegrationIdentityLinked(analytics.Event):
38-
type = "integrations.identity_linked"
39-
40-
attributes = (
41-
analytics.Attribute("provider"),
42-
analytics.Attribute("actor_id"),
43-
analytics.Attribute("actor_type"),
44-
)
32+
provider: str
33+
actor_id: str
34+
actor_type: str
4535

4636

37+
@analytics.eventclass("integrations.slack.chart_unfurl")
4738
class IntegrationSlackChartUnfurl(analytics.Event):
48-
type = "integrations.slack.chart_unfurl"
49-
50-
attributes = (
51-
analytics.Attribute("user_id", required=False),
52-
analytics.Attribute("organization_id"),
53-
analytics.Attribute("unfurls_count", type=int),
54-
)
39+
user_id: str | None = None
40+
organization_id: str
41+
unfurls_count: int
5542

5643

44+
@analytics.eventclass("integrations.slack.chart_unfurl_action")
5745
class IntegrationSlackLinkIdentity(analytics.Event):
58-
type = "integrations.slack.chart_unfurl_action"
59-
60-
attributes = (
61-
analytics.Attribute("organization_id"),
62-
analytics.Attribute("action"),
63-
)
46+
organization_id: str
47+
action: str
6448

6549

50+
@analytics.eventclass("integrations.slack.approve_member_invitation")
6651
class IntegrationSlackApproveMemberInvitation(analytics.Event):
67-
type = "integrations.slack.approve_member_invitation"
68-
69-
attributes = (
70-
analytics.Attribute("organization_id"),
71-
analytics.Attribute("actor_id"),
72-
analytics.Attribute("invitation_type"),
73-
analytics.Attribute("invited_member_id"),
74-
)
52+
organization_id: str
53+
actor_id: str
54+
invitation_type: str
55+
invited_member_id: str
7556

7657

7758
class IntegrationSlackRejectMemberInvitation(IntegrationSlackApproveMemberInvitation):

src/sentry/integrations/slack/unfurl/discover.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
)
2222
from sentry.integrations.models.integration import Integration
2323
from sentry.integrations.services.integration import integration_service
24+
from sentry.integrations.slack.analytics import IntegrationSlackChartUnfurl
2425
from sentry.integrations.slack.message_builder.discover import SlackDiscoverMessageBuilder
2526
from sentry.integrations.slack.spec import SlackMessagingSpec
2627
from sentry.integrations.slack.unfurl.types import Handler, UnfurlableUrl, UnfurledUrl
@@ -298,10 +299,11 @@ def _unfurl_discover(
298299
first_org_integration = org_integrations[0] if len(org_integrations) > 0 else None
299300
if first_org_integration is not None and hasattr(first_org_integration, "id"):
300301
analytics.record(
301-
"integrations.slack.chart_unfurl",
302-
organization_id=first_org_integration.organization_id,
303-
user_id=user.id if user else None,
304-
unfurls_count=len(unfurls),
302+
IntegrationSlackChartUnfurl(
303+
organization_id=first_org_integration.organization_id,
304+
user_id=user.id if user else None,
305+
unfurls_count=len(unfurls),
306+
)
305307
)
306308

307309
return unfurls

0 commit comments

Comments
 (0)