Skip to content

ref(analytics): Transform analytics events for TET-831 #95211

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 2 commits 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
6 changes: 4 additions & 2 deletions src/sentry/api/endpoints/codeowners/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from rest_framework.request import Request

from sentry import analytics, features
from sentry.api.endpoints.codeowners.analytics import CodeOwnersMaxLengthExceeded
from sentry.api.serializers.rest_framework.base import CamelSnakeModelSerializer
from sentry.api.validators.project_codeowners import validate_codeowners_associations
from sentry.integrations.models.repository_project_path_config import RepositoryProjectPathConfig
Expand Down Expand Up @@ -56,8 +57,9 @@ def validate(self, attrs: Mapping[str, Any]) -> Mapping[str, Any]:
max_length = self.get_max_length()
if len(attrs["raw"]) > max_length and len(existing_raw) <= max_length:
analytics.record(
"codeowners.max_length_exceeded",
organization_id=self.context["project"].organization.id,
CodeOwnersMaxLengthExceeded(
organization_id=self.context["project"].organization.id,
)
)
raise serializers.ValidationError(
{"raw": f"Raw needs to be <= {max_length} characters in length"}
Expand Down
5 changes: 2 additions & 3 deletions src/sentry/api/endpoints/codeowners/analytics.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
from sentry import analytics


@analytics.eventclass("codeowners.max_length_exceeded")
class CodeOwnersMaxLengthExceeded(analytics.Event):
type = "codeowners.max_length_exceeded"

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


analytics.register(CodeOwnersMaxLengthExceeded)
65 changes: 25 additions & 40 deletions src/sentry/integrations/discord/analytics.py
Original file line number Diff line number Diff line change
@@ -1,65 +1,50 @@
from sentry import analytics


@analytics.eventclass("integrations.discord.notification_sent")
class DiscordIntegrationNotificationSent(analytics.Event):
type = "integrations.discord.notification_sent"

attributes = (
analytics.Attribute("organization_id"),
analytics.Attribute("project_id"),
analytics.Attribute("category"),
analytics.Attribute("group_id"),
analytics.Attribute("notification_uuid"),
analytics.Attribute("alert_id", required=False),
)
organization_id: str
project_id: str
category: str
group_id: str
notification_uuid: str
alert_id: str | None = None


@analytics.eventclass("integrations.discord.command_interaction")
class DiscordIntegrationCommandInteractionReceived(analytics.Event):
type = "integrations.discord.command_interaction"

attributes = (analytics.Attribute("command_name"),)
command_name: str


@analytics.eventclass("integrations.discord.identity_linked")
class DiscordIntegrationIdentityLinked(analytics.Event):
type = "integrations.discord.identity_linked"

attributes = (
analytics.Attribute("provider"),
analytics.Attribute("actor_id"),
analytics.Attribute("actor_type"),
)
provider: str
actor_id: str
actor_type: str


@analytics.eventclass("integrations.discord.identity_unlinked")
class DiscordIntegrationIdentityUnlinked(analytics.Event):
type = "integrations.discord.identity_unlinked"

attributes = (
analytics.Attribute("provider"),
analytics.Attribute("actor_id"),
analytics.Attribute("actor_type"),
)
provider: str
actor_id: str
actor_type: str


@analytics.eventclass("integrations.discord.message_interaction")
class DiscordIntegrationMessageInteractionReceived(analytics.Event):
type = "integrations.discord.message_interaction"

attributes = (analytics.Attribute("custom_id"),)
custom_id: str


@analytics.eventclass("integrations.discord.assign")
class DiscordIntegrationAssign(analytics.Event):
type = "integrations.discord.assign"

attributes = (analytics.Attribute("actor_id"),)
actor_id: str


@analytics.eventclass("integrations.discord.status")
class DiscordIntegrationStatus(analytics.Event):
type = "integrations.discord.status"

attributes = (
analytics.Attribute("organization_id"),
analytics.Attribute("user_id"),
analytics.Attribute("status"),
)
organization_id: str
user_id: str
status: str


analytics.register(DiscordIntegrationCommandInteractionReceived)
Expand Down
14 changes: 10 additions & 4 deletions src/sentry/integrations/discord/webhooks/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@
from sentry.api.api_owners import ApiOwner
from sentry.api.api_publish_status import ApiPublishStatus
from sentry.api.base import Endpoint, all_silo_endpoint
from sentry.integrations.discord.analytics import (
DiscordIntegrationCommandInteractionReceived,
DiscordIntegrationMessageInteractionReceived,
)
from sentry.integrations.discord.requests.base import DiscordRequest, DiscordRequestError
from sentry.integrations.discord.webhooks.command import DiscordCommandHandler
from sentry.integrations.discord.webhooks.message_component import DiscordMessageComponentHandler
Expand Down Expand Up @@ -58,15 +62,17 @@ def post(self, request: Request) -> HttpResponse:

elif discord_request.is_command():
analytics.record(
"integrations.discord.command_interaction",
command_name=discord_request.get_command_name(),
DiscordIntegrationCommandInteractionReceived(
command_name=discord_request.get_command_name(),
)
)
return DiscordCommandHandler(discord_request).handle()

elif discord_request.is_message_component():
analytics.record(
"integrations.discord.message_interaction",
custom_id=discord_request.get_component_custom_id(),
DiscordIntegrationMessageInteractionReceived(
custom_id=discord_request.get_component_custom_id(),
)
)
return DiscordMessageComponentHandler(discord_request).handle()

Expand Down
15 changes: 9 additions & 6 deletions src/sentry/integrations/discord/webhooks/message_component.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

from sentry import analytics
from sentry.api.helpers.group_index.update import update_groups
from sentry.integrations.discord.analytics import DiscordIntegrationAssign, DiscordIntegrationStatus
from sentry.integrations.discord.message_builder.base.base import DiscordMessageBuilder
from sentry.integrations.discord.message_builder.base.component import (
DiscordComponentCustomIds as CustomIds,
Expand Down Expand Up @@ -175,8 +176,9 @@ def assign(self) -> Response:
assert self.request.user is not None

analytics.record(
"integrations.discord.assign",
actor_id=self.request.user.id,
DiscordIntegrationAssign(
actor_id=self.request.user.id,
)
)

message = DiscordMessageBuilder(
Expand Down Expand Up @@ -241,10 +243,11 @@ def archive(self) -> Response:
def update_group(self, data: Mapping[str, object]) -> None:
if self.group:
analytics.record(
"integrations.discord.status",
organization_id=self.group.organization.id,
user_id=self.user.id,
status=data,
DiscordIntegrationStatus(
organization_id=self.group.organization.id,
user_id=self.user.id,
status=data,
)
)
update_groups(
request=self.request.request, groups=[self.group], user=self.user, data=data
Expand Down
10 changes: 6 additions & 4 deletions src/sentry/integrations/messaging/linkage.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from sentry.integrations.models.external_actor import ExternalActor
from sentry.integrations.models.integration import Integration
from sentry.integrations.services.integration import RpcIntegration, integration_service
from sentry.integrations.slack.analytics import IntegrationIdentityLinked
from sentry.integrations.types import ExternalProviderEnum, ExternalProviders
from sentry.integrations.utils.identities import get_identity_or_404
from sentry.models.organizationmember import OrganizationMember
Expand Down Expand Up @@ -492,10 +493,11 @@ def execute(
)

analytics.record(
"integrations.identity_linked",
provider=self.provider_slug,
actor_id=team.id,
actor_type="team",
IntegrationIdentityLinked(
provider=self.provider_slug,
actor_id=team.id,
actor_type="team",
)
)

if not created:
Expand Down
89 changes: 35 additions & 54 deletions src/sentry/integrations/slack/analytics.py
Original file line number Diff line number Diff line change
@@ -1,77 +1,58 @@
from sentry import analytics


@analytics.eventclass("integrations.slack.assign")
class SlackIntegrationAssign(analytics.Event):
type = "integrations.slack.assign"

attributes = (analytics.Attribute("actor_id", required=False),)
actor_id: str | None = None


@analytics.eventclass("integrations.slack.status")
class SlackIntegrationStatus(analytics.Event):
type = "integrations.slack.status"

attributes = (
analytics.Attribute("organization_id"),
analytics.Attribute("status"),
analytics.Attribute("resolve_type", required=False),
analytics.Attribute("user_id", required=False),
)
organization_id: str
status: str
resolve_type: str | None = None
user_id: str | None = None


@analytics.eventclass("integrations.slack.notification_sent")
class SlackIntegrationNotificationSent(analytics.Event):
type = "integrations.slack.notification_sent"

attributes = (
analytics.Attribute("organization_id"),
analytics.Attribute("project_id", required=False),
analytics.Attribute("category"),
analytics.Attribute("actor_id", required=False),
analytics.Attribute("user_id", required=False),
analytics.Attribute("group_id", required=False),
analytics.Attribute("notification_uuid"),
analytics.Attribute("alert_id", required=False),
analytics.Attribute("actor_type", required=False),
)


organization_id: str
project_id: str | None = None
category: str
actor_id: str | None = None
user_id: str | None = None
group_id: str | None = None
notification_uuid: str
alert_id: str | None = None
actor_type: str | None = None


@analytics.eventclass("integrations.identity_linked")
class IntegrationIdentityLinked(analytics.Event):
type = "integrations.identity_linked"

attributes = (
analytics.Attribute("provider"),
analytics.Attribute("actor_id"),
analytics.Attribute("actor_type"),
)
provider: str
actor_id: str
actor_type: str


@analytics.eventclass("integrations.slack.chart_unfurl")
class IntegrationSlackChartUnfurl(analytics.Event):
type = "integrations.slack.chart_unfurl"

attributes = (
analytics.Attribute("user_id", required=False),
analytics.Attribute("organization_id"),
analytics.Attribute("unfurls_count", type=int),
)
user_id: str | None = None
organization_id: str
unfurls_count: int


@analytics.eventclass("integrations.slack.chart_unfurl_action")
class IntegrationSlackLinkIdentity(analytics.Event):
type = "integrations.slack.chart_unfurl_action"

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


@analytics.eventclass("integrations.slack.approve_member_invitation")
class IntegrationSlackApproveMemberInvitation(analytics.Event):
type = "integrations.slack.approve_member_invitation"

attributes = (
analytics.Attribute("organization_id"),
analytics.Attribute("actor_id"),
analytics.Attribute("invitation_type"),
analytics.Attribute("invited_member_id"),
)
organization_id: str
actor_id: str
invitation_type: str
invited_member_id: str


class IntegrationSlackRejectMemberInvitation(IntegrationSlackApproveMemberInvitation):
Expand Down
10 changes: 6 additions & 4 deletions src/sentry/integrations/slack/unfurl/discover.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
)
from sentry.integrations.models.integration import Integration
from sentry.integrations.services.integration import integration_service
from sentry.integrations.slack.analytics import IntegrationSlackChartUnfurl
from sentry.integrations.slack.message_builder.discover import SlackDiscoverMessageBuilder
from sentry.integrations.slack.spec import SlackMessagingSpec
from sentry.integrations.slack.unfurl.types import Handler, UnfurlableUrl, UnfurledUrl
Expand Down Expand Up @@ -298,10 +299,11 @@ def _unfurl_discover(
first_org_integration = org_integrations[0] if len(org_integrations) > 0 else None
if first_org_integration is not None and hasattr(first_org_integration, "id"):
analytics.record(
"integrations.slack.chart_unfurl",
organization_id=first_org_integration.organization_id,
user_id=user.id if user else None,
unfurls_count=len(unfurls),
IntegrationSlackChartUnfurl(
organization_id=first_org_integration.organization_id,
user_id=user.id if user else None,
unfurls_count=len(unfurls),
)
)

return unfurls
Expand Down
Loading
Loading