Skip to content

ref(analytics): Transform analytics events for TET-833 #95213

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 3 additions & 6 deletions src/sentry/analytics/events/eventuser_endpoint_request.py
Original file line number Diff line number Diff line change
@@ -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: str | None = None


analytics.register(EventUserEndpointRequest)
19 changes: 8 additions & 11 deletions src/sentry/analytics/events/groupowner_assignment.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
from sentry import analytics


@analytics.eventclass("groupowner.assignment")
class GroupOwnerAssignment(analytics.Event):
type = "groupowner.assignment"

attributes = (
analytics.Attribute("organization_id"),
analytics.Attribute("project_id"),
analytics.Attribute("group_id"),
analytics.Attribute("new_assignment", type=bool),
analytics.Attribute("user_id", required=False),
analytics.Attribute("group_owner_type"),
analytics.Attribute("method", required=False),
)
organization_id: str
project_id: str
group_id: str
new_assignment: bool
user_id: str | None = None
group_owner_type: str
method: str | None = None


analytics.register(GroupOwnerAssignment)
Original file line number Diff line number Diff line change
@@ -1,36 +1,30 @@
from sentry import analytics


@analytics.eventclass("integrations.failed_to_fetch_commit_context_all_frames")
class IntegrationsFailedToFetchCommitContextAllFrames(analytics.Event):
type = "integrations.failed_to_fetch_commit_context_all_frames"

attributes = (
analytics.Attribute("organization_id"),
analytics.Attribute("project_id"),
analytics.Attribute("group_id"),
analytics.Attribute("event_id"),
analytics.Attribute("num_frames", type=int),
analytics.Attribute("num_successfully_mapped_frames", type=int),
analytics.Attribute("reason"),
)
organization_id: str
project_id: str
group_id: str
event_id: str
num_frames: int
num_successfully_mapped_frames: int
reason: str


@analytics.eventclass("integrations.successfully_fetched_commit_context_all_frames")
class IntegrationsSuccessfullyFetchedCommitContextAllFrames(analytics.Event):
type = "integrations.successfully_fetched_commit_context_all_frames"

attributes = (
analytics.Attribute("organization_id"),
analytics.Attribute("project_id"),
analytics.Attribute("group_id"),
analytics.Attribute("event_id"),
analytics.Attribute("num_frames", type=int),
analytics.Attribute("num_unique_commits", type=int),
analytics.Attribute("num_unique_commit_authors", type=int),
analytics.Attribute("num_successfully_mapped_frames", type=int),
analytics.Attribute("selected_frame_index", type=int),
analytics.Attribute("selected_provider", type=str),
analytics.Attribute("selected_code_mapping_id"),
)
organization_id: str
project_id: str
group_id: str
event_id: str
num_frames: int
num_unique_commits: int
num_unique_commit_authors: int
num_successfully_mapped_frames: int
selected_frame_index: int
selected_provider: str
selected_code_mapping_id: str


analytics.register(IntegrationsSuccessfullyFetchedCommitContextAllFrames)
Expand Down
23 changes: 10 additions & 13 deletions src/sentry/analytics/events/issue_resolved.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,17 @@
from sentry import analytics


@analytics.eventclass("issue.resolved")
class IssueResolvedEvent(analytics.Event):
type = "issue.resolved"

attributes = (
analytics.Attribute("user_id", required=False),
analytics.Attribute("project_id", required=False),
analytics.Attribute("default_user_id"),
analytics.Attribute("organization_id"),
analytics.Attribute("group_id"),
analytics.Attribute("resolution_type"),
# TODO: make required once we validate that all events have this
analytics.Attribute("issue_category", required=False),
analytics.Attribute("issue_type", required=False),
)
user_id: str | None = None
project_id: str | None = None
default_user_id: str
organization_id: str
group_id: str
resolution_type: str
# TODO: make required once we validate that all events have this
issue_category: str | None = None
issue_type: str | None = None


analytics.register(IssueResolvedEvent)
8 changes: 5 additions & 3 deletions src/sentry/api/endpoints/group_tagkey_values.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)

Expand Down
8 changes: 5 additions & 3 deletions src/sentry/api/endpoints/project_users.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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"):
Expand Down
147 changes: 57 additions & 90 deletions src/sentry/integrations/analytics.py
Original file line number Diff line number Diff line change
@@ -1,127 +1,94 @@
from sentry import analytics


@analytics.eventclass("integration.added")
class IntegrationAddedEvent(analytics.Event):
type = "integration.added"

attributes = (
analytics.Attribute("provider"),
analytics.Attribute("id"),
analytics.Attribute("organization_id"),
analytics.Attribute("user_id", required=False),
analytics.Attribute("default_user_id"),
)
provider: str
id: str
organization_id: str
user_id: str | None = None
default_user_id: str


@analytics.eventclass("integration.disabled.notified")
class IntegrationDisabledNotified(analytics.Event):
type = "integration.disabled.notified"

attributes = (
analytics.Attribute("organization_id"),
analytics.Attribute("provider"),
analytics.Attribute("integration_type"),
analytics.Attribute("integration_id"),
analytics.Attribute("user_id", required=False),
)
organization_id: str
provider: str
integration_type: str
integration_id: str
user_id: str | None = None


@analytics.eventclass("integration.issue.created")
class IntegrationIssueCreatedEvent(analytics.Event):
type = "integration.issue.created"

attributes = (
analytics.Attribute("provider"),
analytics.Attribute("id"),
analytics.Attribute("organization_id"),
analytics.Attribute("user_id", required=False),
analytics.Attribute("default_user_id"),
)
provider: str
id: str
organization_id: str
user_id: str | None = None
default_user_id: str


@analytics.eventclass("integration.issue.linked")
class IntegrationIssueLinkedEvent(analytics.Event):
type = "integration.issue.linked"

attributes = (
analytics.Attribute("provider"),
analytics.Attribute("id"),
analytics.Attribute("organization_id"),
analytics.Attribute("user_id", required=False),
analytics.Attribute("default_user_id"),
)
provider: str
id: str
organization_id: str
user_id: str | None = None
default_user_id: str


@analytics.eventclass("integration.issue.status.synced")
class IntegrationIssueStatusSyncedEvent(analytics.Event):
type = "integration.issue.status.synced"

attributes = (
analytics.Attribute("provider"),
analytics.Attribute("id"),
analytics.Attribute("organization_id"),
)
provider: str
id: str
organization_id: str


@analytics.eventclass("integration.issue.assignee.synced")
class IntegrationIssueAssigneeSyncedEvent(analytics.Event):
type = "integration.issue.assignee.synced"

attributes = (
analytics.Attribute("provider"),
analytics.Attribute("id"),
analytics.Attribute("organization_id"),
)
provider: str
id: str
organization_id: str


@analytics.eventclass("integration.issue.comments.synced")
class IntegrationIssueCommentsSyncedEvent(analytics.Event):
type = "integration.issue.comments.synced"

attributes = (
analytics.Attribute("provider"),
analytics.Attribute("id"),
analytics.Attribute("organization_id"),
)
provider: str
id: str
organization_id: str


@analytics.eventclass("integration.repo.added")
class IntegrationRepoAddedEvent(analytics.Event):
type = "integration.repo.added"

attributes = (
analytics.Attribute("provider"),
analytics.Attribute("id"),
analytics.Attribute("organization_id"),
)
provider: str
id: str
organization_id: str


@analytics.eventclass("integration.resolve.commit")
class IntegrationResolveCommitEvent(analytics.Event):
type = "integration.resolve.commit"

attributes = (
analytics.Attribute("provider"),
analytics.Attribute("id"),
analytics.Attribute("organization_id"),
)
provider: str
id: str
organization_id: str


@analytics.eventclass("integration.resolve.pr")
class IntegrationResolvePREvent(analytics.Event):
type = "integration.resolve.pr"

attributes = (
analytics.Attribute("provider"),
analytics.Attribute("id"),
analytics.Attribute("organization_id"),
)
provider: str
id: str
organization_id: str


@analytics.eventclass("integration.stacktrace.linked")
class IntegrationStacktraceLinkEvent(analytics.Event):
type = "integration.stacktrace.linked"

attributes = (
analytics.Attribute("provider"),
analytics.Attribute("config_id"),
analytics.Attribute("project_id"),
analytics.Attribute("organization_id"),
analytics.Attribute("filepath"),
analytics.Attribute("status"),
analytics.Attribute("link_fetch_iterations"),
analytics.Attribute("platform", required=False),
)
provider: str
config_id: str
project_id: str
organization_id: str
filepath: str
status: str
link_fetch_iterations: str
platform: str | None = None


def register_analytics() -> None:
Expand Down
13 changes: 7 additions & 6 deletions src/sentry/integrations/tasks/create_comment.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from sentry import analytics
from sentry.integrations.analytics import IntegrationIssueCommentsSyncedEvent
from sentry.integrations.models.external_issue import ExternalIssue
from sentry.integrations.models.integration import Integration
from sentry.integrations.source_code_management.metrics import (
Expand Down Expand Up @@ -68,10 +69,10 @@ def create_comment(external_issue_id: int, user_id: int, group_note_id: int) ->
note.data["external_id"] = installation.get_comment_id(comment)
note.save()
analytics.record(
# TODO(lb): this should be changed and/or specified?
"integration.issue.comments.synced",
provider=installation.model.provider,
id=installation.model.id,
organization_id=external_issue.organization_id,
user_id=user_id,
IntegrationIssueCommentsSyncedEvent(
provider=installation.model.provider,
id=installation.model.id,
organization_id=external_issue.organization_id,
user_id=user_id,
)
)
Loading
Loading