Browse Source

feat(replays): Setup backend for session-replay onboarding task (#40928)

Related to: #40787
Ryan Albrecht 2 years ago
parent
commit
4fed5ab416

+ 4 - 0
src/sentry/models/organizationonboardingtask.py

@@ -28,6 +28,7 @@ class OnboardingTask:
     FIRST_TRANSACTION = 11
     METRIC_ALERT = 12
     INTEGRATIONS = 13
+    SESSION_REPLAY = 14
 
 
 class OnboardingTaskStatus:
@@ -122,6 +123,7 @@ class OrganizationOnboardingTask(AbstractOnboardingTask):
         (OnboardingTask.FIRST_TRANSACTION, "setup_transactions"),
         (OnboardingTask.METRIC_ALERT, "setup_metric_alert_rules"),
         (OnboardingTask.INTEGRATIONS, "setup_integrations"),
+        (OnboardingTask.SESSION_REPLAY, "setup_session_replay"),
     )
 
     # Used in the API to map IDs to string keys. This keeps things
@@ -147,6 +149,7 @@ class OrganizationOnboardingTask(AbstractOnboardingTask):
             OnboardingTask.FIRST_TRANSACTION,
             OnboardingTask.METRIC_ALERT,
             OnboardingTask.INTEGRATIONS,
+            OnboardingTask.SESSION_REPLAY,
         ]
     )
 
@@ -163,6 +166,7 @@ class OrganizationOnboardingTask(AbstractOnboardingTask):
             OnboardingTask.FIRST_TRANSACTION,
             OnboardingTask.METRIC_ALERT,
             OnboardingTask.INTEGRATIONS,
+            OnboardingTask.SESSION_REPLAY,
         ]
     )
 

+ 15 - 5
src/sentry/receivers/onboarding.py

@@ -226,14 +226,24 @@ def record_first_profile(project, **kwargs):
 @first_replay_received.connect(weak=False)
 def record_first_replay(project, **kwargs):
     project.update(flags=F("flags").bitor(Project.flags.has_replays))
-    analytics.record(
-        "first_replay.sent",
-        user_id=project.organization.default_owner_id,
+
+    success = OrganizationOnboardingTask.objects.record(
         organization_id=project.organization_id,
-        project_id=project.id,
-        platform=project.platform,
+        task=OnboardingTask.SESSION_REPLAY,
+        status=OnboardingTaskStatus.COMPLETE,
+        date_completed=timezone.now(),
     )
 
+    if success:
+        analytics.record(
+            "first_replay.sent",
+            user_id=project.organization.default_owner_id,
+            organization_id=project.organization_id,
+            project_id=project.id,
+            platform=project.platform,
+        )
+        try_mark_onboarding_complete(project.organization_id)
+
 
 @member_invited.connect(weak=False)
 def record_member_invited(member, user, **kwargs):

+ 2 - 0
tests/sentry/receivers/test_onboarding.py

@@ -14,6 +14,7 @@ from sentry.signals import (
     event_processed,
     first_event_pending,
     first_event_received,
+    first_replay_received,
     first_transaction_received,
     integration_added,
     issue_tracker_used,
@@ -473,6 +474,7 @@ class OrganizationOnboardingTaskTest(TestCase):
             sender=type(Rule),
             is_api_token=False,
         )
+        first_replay_received.send(project=project, sender=type(project))
 
         assert (
             OrganizationOption.objects.filter(

+ 11 - 3
tests/sentry/replays/consumers/recording_consumer/test_consumer.py

@@ -4,13 +4,13 @@ import uuid
 import zlib
 from datetime import datetime
 from hashlib import sha1
-from unittest.mock import patch
+from unittest.mock import ANY, patch
 
 import msgpack
 from arroyo import Message, Partition, Topic
 from arroyo.backends.kafka import KafkaPayload
 
-from sentry.models import File
+from sentry.models import File, OnboardingTask, OnboardingTaskStatus
 from sentry.replays.consumers.recording.factory import ProcessReplayRecordingStrategyFactory
 from sentry.replays.models import ReplayRecordingSegment
 from sentry.testutils import TransactionTestCase
@@ -25,8 +25,9 @@ class TestRecordingsConsumerEndToEnd(TransactionTestCase):
         self.replay_id = uuid.uuid4().hex
         self.replay_recording_id = uuid.uuid4().hex
 
+    @patch("sentry.models.OrganizationOnboardingTask.objects.record")
     @patch("sentry.analytics.record")
-    def test_basic_flow_compressed(self, mock_record):
+    def test_basic_flow_compressed(self, mock_record, mock_onboarding_task):
         processing_strategy = self.processing_factory().create_with_partitions(lambda x: None, None)
         segment_id = 0
         consumer_messages = [
@@ -88,6 +89,13 @@ class TestRecordingsConsumerEndToEnd(TransactionTestCase):
         self.project.refresh_from_db()
         assert self.project.flags.has_replays
 
+        mock_onboarding_task.assert_called_with(
+            organization_id=self.project.organization_id,
+            task=OnboardingTask.SESSION_REPLAY,
+            status=OnboardingTaskStatus.COMPLETE,
+            date_completed=ANY,
+        )
+
         mock_record.assert_called_with(
             "first_replay.sent",
             organization_id=self.organization.id,