Browse Source

fix(replays): truncate culprit URL in issue creation (#65809)

Fixes SENTRY-2JF4

TODO: validate length of culprit in schema verification instead of
downstream when we insert into postgres in issue platform.
Josh Ferge 1 year ago
parent
commit
d5d74a340f

+ 3 - 3
src/sentry/replays/usecases/ingest/issue_creation.py

@@ -2,6 +2,7 @@ import datetime
 import logging
 from typing import Any
 
+from sentry.constants import MAX_CULPRIT_LENGTH
 from sentry.issues.grouptype import ReplayRageClickType
 from sentry.issues.issue_occurrence import IssueEvidence
 from sentry.models.project import Project
@@ -50,9 +51,8 @@ def report_rage_click_issue(project_id: int, replay_id: str, event: SentryEvent)
 
     selector = payload["message"]
     clicked_element = selector.split(" > ")[-1]
-
     new_issue_occurrence(
-        culprit=payload["data"]["url"],
+        culprit=payload["data"]["url"][:MAX_CULPRIT_LENGTH],
         environment=replay_info["agg_environment"],
         fingerprint=[selector],
         issue_type=ReplayRageClickType,
@@ -105,7 +105,7 @@ def report_rage_click_issue_with_replay_event(
     clicked_element = selector.split(" > ")[-1]
 
     new_issue_occurrence(
-        culprit=url,
+        culprit=url[:MAX_CULPRIT_LENGTH],
         environment=replay_event["environment"],
         fingerprint=[selector],
         issue_type=ReplayRageClickType,

+ 55 - 0
tests/sentry/replays/unit/test_rage_click_issue.py → tests/sentry/replays/unit/test_issue_creation.py

@@ -8,12 +8,14 @@ import requests
 from django.conf import settings
 
 from sentry.issues.issue_occurrence import IssueEvidence
+from sentry.models.group import Group
 from sentry.replays.testutils import mock_replay
 from sentry.replays.usecases.ingest.events import SentryEvent
 from sentry.replays.usecases.ingest.issue_creation import (
     report_rage_click_issue,
     report_rage_click_issue_with_replay_event,
 )
+from sentry.testutils.helpers.features import Feature
 from sentry.testutils.pytest.fixtures import django_db_all
 from sentry.testutils.skips import requires_snuba
 from tests.sentry.replays.unit.test_ingest_dom_index import mock_replay_event
@@ -149,3 +151,56 @@ def test_report_rage_click_issue_with_replay_event(mock_new_issue_occurrence, de
             "email": "test@test.com",
         },
     }
+
+
+@pytest.mark.snuba
+@django_db_all
+def test_report_rage_click_long_url(default_project):
+    replay_id = "b58a67446c914f44a4e329763420047b"
+    seq1_timestamp = datetime.now() - timedelta(minutes=10, seconds=52)
+    seq2_timestamp = datetime.now() - timedelta(minutes=10, seconds=35)
+    response = requests.post(
+        settings.SENTRY_SNUBA + "/tests/entities/replays/insert",
+        json=[
+            mock_replay(
+                seq1_timestamp,
+                default_project.id,
+                replay_id,
+                segment_id=0,
+                urls=[
+                    "http://localhost/",
+                    "http://localhost/home/",
+                    "http://localhost/profile/",
+                ],
+            ),
+            mock_replay(seq2_timestamp, default_project.id, replay_id, segment_id=1),
+        ],
+    )
+    assert response.status_code == 200
+
+    event = {
+        "data": {
+            "payload": {
+                "data": {
+                    "node": {"tagName": "a"},
+                    "endReason": "timeout",
+                    "url": f"https://www.sentry.io{'a' * 300}",
+                },
+                "message": "div.xyz > a",
+                "timestamp": time.time(),
+            }
+        }
+    }
+
+    with Feature(
+        {
+            "organizations:replay-click-rage-ingest": True,
+        }
+    ):
+        report_rage_click_issue(
+            project_id=default_project.id, replay_id=replay_id, event=cast(SentryEvent, event)
+        )
+
+    # test that the Issue gets created with the truncated url
+    assert Group.objects.get(message__contains="div.xyz > a")
+    assert Group.objects.get(culprit__contains="www.sentry.io")