Browse Source

feat(workflow): Track alert rule edited events (#32600)

Scott Cooper 3 years ago
parent
commit
64fa43efe5

+ 17 - 0
src/sentry/analytics/events/alert_edited.py

@@ -0,0 +1,17 @@
+from sentry import analytics
+
+
+class AlertEditedEvent(analytics.Event):
+    type = "alert.edited"
+
+    attributes = (
+        analytics.Attribute("user_id", required=False),
+        analytics.Attribute("default_user_id"),
+        analytics.Attribute("organization_id"),
+        analytics.Attribute("rule_id"),
+        analytics.Attribute("rule_type"),
+        analytics.Attribute("is_api_token"),
+    )
+
+
+analytics.register(AlertEditedEvent)

+ 9 - 0
src/sentry/api/endpoints/project_rule_details.py

@@ -19,6 +19,7 @@ from sentry.models import (
     Team,
     User,
 )
+from sentry.signals import alert_rule_edited
 from sentry.web.decorators import transaction_start
 
 
@@ -141,6 +142,14 @@ class ProjectRuleDetailsEndpoint(RuleEndpoint):
                 event=AuditLogEntryEvent.RULE_EDIT,
                 data=updated_rule.get_audit_log_data(),
             )
+            alert_rule_edited.send_robust(
+                user=request.user,
+                project=project,
+                rule=rule,
+                rule_type="issue",
+                sender=self,
+                is_api_token=request.auth is not None,
+            )
 
             return Response(serialize(updated_rule, request.user))
 

+ 28 - 0
src/sentry/receivers/features.py

@@ -12,6 +12,7 @@ from sentry.signals import (
     advanced_search,
     advanced_search_feature_gated,
     alert_rule_created,
+    alert_rule_edited,
     data_scrubber_enabled,
     deploy_created,
     event_processed,
@@ -320,6 +321,33 @@ def record_alert_rule_created(
     )
 
 
+@alert_rule_edited.connect(weak=False)
+def record_alert_rule_edited(
+    user,
+    project,
+    rule,
+    rule_type,
+    is_api_token,
+    **kwargs,
+):
+    if user and user.is_authenticated:
+        user_id = default_user_id = user.id
+    else:
+        user_id = None
+        default_user_id = project.organization.get_default_owner().id
+
+    analytics.record(
+        "alert.edited",
+        user_id=user_id,
+        default_user_id=default_user_id,
+        organization_id=project.organization_id,
+        project_id=project.id,
+        rule_id=rule.id,
+        rule_type=rule_type,
+        is_api_token=is_api_token,
+    )
+
+
 @plugin_enabled.connect(weak=False)
 def record_plugin_enabled(plugin, project, user, **kwargs):
     if isinstance(plugin, (IssueTrackingPlugin, IssueTrackingPlugin2)):

+ 3 - 0
src/sentry/signals.py

@@ -87,6 +87,9 @@ data_scrubber_enabled = BetterSignal(providing_args=["organization"])
 alert_rule_created = BetterSignal(
     providing_args=["project", "rule", "user", "rule_type", "is_api_token"]
 )
+alert_rule_edited = BetterSignal(
+    providing_args=["project", "rule", "user", "rule_type", "is_api_token"]
+)
 repo_linked = BetterSignal(providing_args=["repo", "user"])
 release_created = BetterSignal(providing_args=["release"])
 deploy_created = BetterSignal(providing_args=["deploy"])

+ 3 - 1
tests/sentry/api/endpoints/test_project_rule_details.py

@@ -234,7 +234,8 @@ class ProjectRuleDetailsTest(APITestCase):
 
 
 class UpdateProjectRuleTest(APITestCase):
-    def test_simple(self):
+    @patch("sentry.signals.alert_rule_edited.send_robust")
+    def test_simple(self, send_robust):
         self.login_as(user=self.user)
 
         project = self.create_project()
@@ -286,6 +287,7 @@ class UpdateProjectRuleTest(APITestCase):
         assert rule.data["conditions"] == conditions
 
         assert RuleActivity.objects.filter(rule=rule, type=RuleActivityType.UPDATED.value).exists()
+        assert send_robust.called
 
     def test_no_owner(self):
         self.login_as(user=self.user)