Skip to content

Commit 3f1576c

Browse files
authored
feat(org-tokens): Track creation/deletion of tokens (#51438)
This adds analytics for when tokens are created/deleted: New tracking added: * `api_token.created` * `api_token.deleted` * `org_auth_token.created` * `org_auth_token.deleted`
1 parent e49a813 commit 3f1576c

File tree

8 files changed

+69
-2
lines changed

8 files changed

+69
-2
lines changed

src/sentry/analytics/events/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
from .alert_created import * # noqa: F401,F403
33
from .alert_edited import * # noqa: F401,F403
44
from .alert_rule_ui_component_webhook_sent import * # noqa: F401,F403
5+
from .api_token_created import * # noqa: F401,F403
6+
from .api_token_deleted import * # noqa: F401,F403
57
from .codeowners_assignment import * # noqa: F401,F403
68
from .codeowners_created import * # noqa: F401,F403
79
from .codeowners_updated import * # noqa: F401,F403
@@ -43,6 +45,8 @@
4345
from .monitor_mark_failed import * # noqa: F401,F403
4446
from .notifications_settings_updated import * # noqa: F401,F403
4547
from .onboarding_continuation_sent import * # noqa: F401,F403
48+
from .org_auth_token_created import * # noqa: F401,F403
49+
from .org_auth_token_deleted import * # noqa: F401,F403
4650
from .organization_created import * # noqa: F401,F403
4751
from .organization_joined import * # noqa: F401,F403
4852
from .plugin_enabled import * # noqa: F401,F403
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from sentry import analytics
2+
3+
4+
class ApiTokenCreated(analytics.Event):
5+
type = "api_token.created"
6+
7+
attributes = (analytics.Attribute("user_id"),)
8+
9+
10+
analytics.register(ApiTokenCreated)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from sentry import analytics
2+
3+
4+
class ApiTokenDeleted(analytics.Event):
5+
type = "api_token.deleted"
6+
7+
attributes = (analytics.Attribute("user_id"),)
8+
9+
10+
analytics.register(ApiTokenDeleted)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from sentry import analytics
2+
3+
4+
class OrgAuthTokenCreated(analytics.Event):
5+
type = "org_auth_token.created"
6+
7+
attributes = (
8+
analytics.Attribute("user_id"),
9+
analytics.Attribute("organization_id"),
10+
)
11+
12+
13+
analytics.register(OrgAuthTokenCreated)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from sentry import analytics
2+
3+
4+
class OrgAuthTokenDeleted(analytics.Event):
5+
type = "org_auth_token.deleted"
6+
7+
attributes = (
8+
analytics.Attribute("user_id"),
9+
analytics.Attribute("organization_id"),
10+
)
11+
12+
13+
analytics.register(OrgAuthTokenDeleted)

src/sentry/api/endpoints/api_tokens.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from rest_framework.request import Request
66
from rest_framework.response import Response
77

8+
from sentry import analytics
89
from sentry.api.base import Endpoint, SessionAuthentication, control_silo_endpoint
910
from sentry.api.fields import MultipleChoiceField
1011
from sentry.api.serializers import serialize
@@ -59,6 +60,8 @@ def post(self, request: Request) -> Response:
5960
send_email=True,
6061
)
6162

63+
analytics.record("api_token.created", user_id=request.user.id)
64+
6265
return Response(serialize(token, request.user), status=201)
6366
return Response(serializer.errors, status=400)
6467

@@ -73,4 +76,6 @@ def delete(self, request: Request):
7376

7477
ApiToken.objects.filter(user_id=user_id, token=token, application__isnull=True).delete()
7578

79+
analytics.record("api_token.deleted", user_id=request.user.id)
80+
7681
return Response(status=204)

src/sentry/api/endpoints/org_auth_token_details.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from rest_framework.request import Request
33
from rest_framework.response import Response
44

5-
from sentry import audit_log
5+
from sentry import analytics, audit_log
66
from sentry.api.base import control_silo_endpoint
77
from sentry.api.bases.organization import OrganizationEndpoint, OrgAuthTokenPermission
88
from sentry.api.exceptions import ResourceDoesNotExist
@@ -60,4 +60,10 @@ def delete(self, request: Request, organization, token_id):
6060
data=instance.get_audit_log_data(),
6161
)
6262

63+
analytics.record(
64+
"org_auth_token.deleted",
65+
user_id=request.user.id,
66+
organization_id=organization.id,
67+
)
68+
6369
return Response(status=204)

src/sentry/api/endpoints/org_auth_tokens.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from rest_framework.request import Request
99
from rest_framework.response import Response
1010

11-
from sentry import audit_log
11+
from sentry import analytics, audit_log
1212
from sentry.api.base import control_silo_endpoint
1313
from sentry.api.bases.organization import OrganizationEndpoint, OrgAuthTokenPermission
1414
from sentry.api.serializers import serialize
@@ -71,6 +71,12 @@ def post(self, request: Request, organization: Organization) -> Response:
7171
data=token.get_audit_log_data(),
7272
)
7373

74+
analytics.record(
75+
"org_auth_token.created",
76+
user_id=request.user.id,
77+
organization_id=organization.id,
78+
)
79+
7480
# This is THE ONLY TIME that the token is available
7581
serialized_token = serialize(token, request.user, token=jwt_token)
7682

0 commit comments

Comments
 (0)