Skip to content

Commit 7b6199a

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

20 files changed

+273
-276
lines changed
Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
from sentry import analytics
22

33

4+
@analytics.eventclass("eventuser_endpoint.request")
45
class EventUserEndpointRequest(analytics.Event):
5-
type = "eventuser_endpoint.request"
6-
7-
attributes = (
8-
analytics.Attribute("endpoint", required=True),
9-
analytics.Attribute("project_id", required=False),
10-
)
6+
endpoint: str
7+
project_id: str | None = None
118

129

1310
analytics.register(EventUserEndpointRequest)
Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
11
from sentry import analytics
22

33

4+
@analytics.eventclass("groupowner.assignment")
45
class GroupOwnerAssignment(analytics.Event):
5-
type = "groupowner.assignment"
6-
7-
attributes = (
8-
analytics.Attribute("organization_id"),
9-
analytics.Attribute("project_id"),
10-
analytics.Attribute("group_id"),
11-
analytics.Attribute("new_assignment", type=bool),
12-
analytics.Attribute("user_id", required=False),
13-
analytics.Attribute("group_owner_type"),
14-
analytics.Attribute("method", required=False),
15-
)
6+
organization_id: str
7+
project_id: str
8+
group_id: str
9+
new_assignment: bool
10+
user_id: str | None = None
11+
group_owner_type: str
12+
method: str | None = None
1613

1714

1815
analytics.register(GroupOwnerAssignment)

src/sentry/analytics/events/integration_commit_context_all_frames.py

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,30 @@
11
from sentry import analytics
22

33

4+
@analytics.eventclass("integrations.failed_to_fetch_commit_context_all_frames")
45
class IntegrationsFailedToFetchCommitContextAllFrames(analytics.Event):
5-
type = "integrations.failed_to_fetch_commit_context_all_frames"
6-
7-
attributes = (
8-
analytics.Attribute("organization_id"),
9-
analytics.Attribute("project_id"),
10-
analytics.Attribute("group_id"),
11-
analytics.Attribute("event_id"),
12-
analytics.Attribute("num_frames", type=int),
13-
analytics.Attribute("num_successfully_mapped_frames", type=int),
14-
analytics.Attribute("reason"),
15-
)
6+
organization_id: str
7+
project_id: str
8+
group_id: str
9+
event_id: str
10+
num_frames: int
11+
num_successfully_mapped_frames: int
12+
reason: str
1613

1714

15+
@analytics.eventclass("integrations.successfully_fetched_commit_context_all_frames")
1816
class IntegrationsSuccessfullyFetchedCommitContextAllFrames(analytics.Event):
19-
type = "integrations.successfully_fetched_commit_context_all_frames"
20-
21-
attributes = (
22-
analytics.Attribute("organization_id"),
23-
analytics.Attribute("project_id"),
24-
analytics.Attribute("group_id"),
25-
analytics.Attribute("event_id"),
26-
analytics.Attribute("num_frames", type=int),
27-
analytics.Attribute("num_unique_commits", type=int),
28-
analytics.Attribute("num_unique_commit_authors", type=int),
29-
analytics.Attribute("num_successfully_mapped_frames", type=int),
30-
analytics.Attribute("selected_frame_index", type=int),
31-
analytics.Attribute("selected_provider", type=str),
32-
analytics.Attribute("selected_code_mapping_id"),
33-
)
17+
organization_id: str
18+
project_id: str
19+
group_id: str
20+
event_id: str
21+
num_frames: int
22+
num_unique_commits: int
23+
num_unique_commit_authors: int
24+
num_successfully_mapped_frames: int
25+
selected_frame_index: int
26+
selected_provider: str
27+
selected_code_mapping_id: str
3428

3529

3630
analytics.register(IntegrationsSuccessfullyFetchedCommitContextAllFrames)
Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
11
from sentry import analytics
22

33

4+
@analytics.eventclass("issue.resolved")
45
class IssueResolvedEvent(analytics.Event):
5-
type = "issue.resolved"
6-
7-
attributes = (
8-
analytics.Attribute("user_id", required=False),
9-
analytics.Attribute("project_id", required=False),
10-
analytics.Attribute("default_user_id"),
11-
analytics.Attribute("organization_id"),
12-
analytics.Attribute("group_id"),
13-
analytics.Attribute("resolution_type"),
14-
# TODO: make required once we validate that all events have this
15-
analytics.Attribute("issue_category", required=False),
16-
analytics.Attribute("issue_type", required=False),
17-
)
6+
user_id: str | None = None
7+
project_id: str | None = None
8+
default_user_id: str
9+
organization_id: str
10+
group_id: str
11+
resolution_type: str
12+
# TODO: make required once we validate that all events have this
13+
issue_category: str | None = None
14+
issue_type: str | None = None
1815

1916

2017
analytics.register(IssueResolvedEvent)

src/sentry/api/endpoints/group_tagkey_values.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from rest_framework.response import Response
44

55
from sentry import analytics, tagstore
6+
from sentry.analytics.events.eventuser_endpoint_request import EventUserEndpointRequest
67
from sentry.api.api_owners import ApiOwner
78
from sentry.api.api_publish_status import ApiPublishStatus
89
from sentry.api.base import region_silo_endpoint
@@ -68,9 +69,10 @@ def get(self, request: Request, group, key) -> Response:
6869
List a Tag's Values
6970
"""
7071
analytics.record(
71-
"eventuser_endpoint.request",
72-
project_id=group.project_id,
73-
endpoint="sentry.api.endpoints.group_tagkey_values.get",
72+
EventUserEndpointRequest(
73+
project_id=group.project_id,
74+
endpoint="sentry.api.endpoints.group_tagkey_values.get",
75+
)
7476
)
7577
lookup_key = tagstore.backend.prefix_reserved_key(key)
7678

src/sentry/api/endpoints/project_users.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from rest_framework.response import Response
33

44
from sentry import analytics
5+
from sentry.analytics.events.eventuser_endpoint_request import EventUserEndpointRequest
56
from sentry.api.api_publish_status import ApiPublishStatus
67
from sentry.api.base import region_silo_endpoint
78
from sentry.api.bases.project import ProjectAndStaffPermission, ProjectEndpoint
@@ -41,9 +42,10 @@ def get(self, request: Request, project) -> Response:
4142
For example, ``query=email:foo@example.com``
4243
"""
4344
analytics.record(
44-
"eventuser_endpoint.request",
45-
project_id=project.id,
46-
endpoint="sentry.api.endpoints.project_users.get",
45+
EventUserEndpointRequest(
46+
project_id=project.id,
47+
endpoint="sentry.api.endpoints.project_users.get",
48+
)
4749
)
4850
field, identifier = None, None
4951
if request.GET.get("query"):

src/sentry/integrations/analytics.py

Lines changed: 57 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,127 +1,94 @@
11
from sentry import analytics
22

33

4+
@analytics.eventclass("integration.added")
45
class IntegrationAddedEvent(analytics.Event):
5-
type = "integration.added"
6-
7-
attributes = (
8-
analytics.Attribute("provider"),
9-
analytics.Attribute("id"),
10-
analytics.Attribute("organization_id"),
11-
analytics.Attribute("user_id", required=False),
12-
analytics.Attribute("default_user_id"),
13-
)
6+
provider: str
7+
id: str
8+
organization_id: str
9+
user_id: str | None = None
10+
default_user_id: str
1411

1512

13+
@analytics.eventclass("integration.disabled.notified")
1614
class IntegrationDisabledNotified(analytics.Event):
17-
type = "integration.disabled.notified"
18-
19-
attributes = (
20-
analytics.Attribute("organization_id"),
21-
analytics.Attribute("provider"),
22-
analytics.Attribute("integration_type"),
23-
analytics.Attribute("integration_id"),
24-
analytics.Attribute("user_id", required=False),
25-
)
15+
organization_id: str
16+
provider: str
17+
integration_type: str
18+
integration_id: str
19+
user_id: str | None = None
2620

2721

22+
@analytics.eventclass("integration.issue.created")
2823
class IntegrationIssueCreatedEvent(analytics.Event):
29-
type = "integration.issue.created"
30-
31-
attributes = (
32-
analytics.Attribute("provider"),
33-
analytics.Attribute("id"),
34-
analytics.Attribute("organization_id"),
35-
analytics.Attribute("user_id", required=False),
36-
analytics.Attribute("default_user_id"),
37-
)
24+
provider: str
25+
id: str
26+
organization_id: str
27+
user_id: str | None = None
28+
default_user_id: str
3829

3930

31+
@analytics.eventclass("integration.issue.linked")
4032
class IntegrationIssueLinkedEvent(analytics.Event):
41-
type = "integration.issue.linked"
42-
43-
attributes = (
44-
analytics.Attribute("provider"),
45-
analytics.Attribute("id"),
46-
analytics.Attribute("organization_id"),
47-
analytics.Attribute("user_id", required=False),
48-
analytics.Attribute("default_user_id"),
49-
)
33+
provider: str
34+
id: str
35+
organization_id: str
36+
user_id: str | None = None
37+
default_user_id: str
5038

5139

40+
@analytics.eventclass("integration.issue.status.synced")
5241
class IntegrationIssueStatusSyncedEvent(analytics.Event):
53-
type = "integration.issue.status.synced"
54-
55-
attributes = (
56-
analytics.Attribute("provider"),
57-
analytics.Attribute("id"),
58-
analytics.Attribute("organization_id"),
59-
)
42+
provider: str
43+
id: str
44+
organization_id: str
6045

6146

47+
@analytics.eventclass("integration.issue.assignee.synced")
6248
class IntegrationIssueAssigneeSyncedEvent(analytics.Event):
63-
type = "integration.issue.assignee.synced"
64-
65-
attributes = (
66-
analytics.Attribute("provider"),
67-
analytics.Attribute("id"),
68-
analytics.Attribute("organization_id"),
69-
)
49+
provider: str
50+
id: str
51+
organization_id: str
7052

7153

54+
@analytics.eventclass("integration.issue.comments.synced")
7255
class IntegrationIssueCommentsSyncedEvent(analytics.Event):
73-
type = "integration.issue.comments.synced"
74-
75-
attributes = (
76-
analytics.Attribute("provider"),
77-
analytics.Attribute("id"),
78-
analytics.Attribute("organization_id"),
79-
)
56+
provider: str
57+
id: str
58+
organization_id: str
8059

8160

61+
@analytics.eventclass("integration.repo.added")
8262
class IntegrationRepoAddedEvent(analytics.Event):
83-
type = "integration.repo.added"
84-
85-
attributes = (
86-
analytics.Attribute("provider"),
87-
analytics.Attribute("id"),
88-
analytics.Attribute("organization_id"),
89-
)
63+
provider: str
64+
id: str
65+
organization_id: str
9066

9167

68+
@analytics.eventclass("integration.resolve.commit")
9269
class IntegrationResolveCommitEvent(analytics.Event):
93-
type = "integration.resolve.commit"
94-
95-
attributes = (
96-
analytics.Attribute("provider"),
97-
analytics.Attribute("id"),
98-
analytics.Attribute("organization_id"),
99-
)
70+
provider: str
71+
id: str
72+
organization_id: str
10073

10174

75+
@analytics.eventclass("integration.resolve.pr")
10276
class IntegrationResolvePREvent(analytics.Event):
103-
type = "integration.resolve.pr"
104-
105-
attributes = (
106-
analytics.Attribute("provider"),
107-
analytics.Attribute("id"),
108-
analytics.Attribute("organization_id"),
109-
)
77+
provider: str
78+
id: str
79+
organization_id: str
11080

11181

82+
@analytics.eventclass("integration.stacktrace.linked")
11283
class IntegrationStacktraceLinkEvent(analytics.Event):
113-
type = "integration.stacktrace.linked"
114-
115-
attributes = (
116-
analytics.Attribute("provider"),
117-
analytics.Attribute("config_id"),
118-
analytics.Attribute("project_id"),
119-
analytics.Attribute("organization_id"),
120-
analytics.Attribute("filepath"),
121-
analytics.Attribute("status"),
122-
analytics.Attribute("link_fetch_iterations"),
123-
analytics.Attribute("platform", required=False),
124-
)
84+
provider: str
85+
config_id: str
86+
project_id: str
87+
organization_id: str
88+
filepath: str
89+
status: str
90+
link_fetch_iterations: str
91+
platform: str | None = None
12592

12693

12794
def register_analytics() -> None:

src/sentry/integrations/tasks/create_comment.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from sentry import analytics
2+
from sentry.integrations.analytics import IntegrationIssueCommentsSyncedEvent
23
from sentry.integrations.models.external_issue import ExternalIssue
34
from sentry.integrations.models.integration import Integration
45
from sentry.integrations.source_code_management.metrics import (
@@ -68,10 +69,10 @@ def create_comment(external_issue_id: int, user_id: int, group_note_id: int) ->
6869
note.data["external_id"] = installation.get_comment_id(comment)
6970
note.save()
7071
analytics.record(
71-
# TODO(lb): this should be changed and/or specified?
72-
"integration.issue.comments.synced",
73-
provider=installation.model.provider,
74-
id=installation.model.id,
75-
organization_id=external_issue.organization_id,
76-
user_id=user_id,
72+
IntegrationIssueCommentsSyncedEvent(
73+
provider=installation.model.provider,
74+
id=installation.model.id,
75+
organization_id=external_issue.organization_id,
76+
user_id=user_id,
77+
)
7778
)

0 commit comments

Comments
 (0)