Browse Source

fix(span-clusterer): Fetch empty databag when None (#56647)

Iker Barriocanal 1 year ago
parent
commit
35bd9d73c7

+ 2 - 2
src/sentry/ingest/transaction_clusterer/datasource/redis.py

@@ -203,7 +203,7 @@ def record_span_descriptions(
 def _get_span_description_to_store(span: Mapping[str, Any]) -> Optional[str]:
     if not span.get("op", "").startswith("http"):
         return None
-    data = span.get("data", {})
+    data = span.get("data") or {}
     return data.get("description.scrubbed") or span.get("description")
 
 
@@ -225,7 +225,7 @@ def _update_span_description_rule_lifetime(project: Project, event_data: Mapping
 
     spans = event_data.get("_meta", {}).get("spans", {})
     for span in spans.values():
-        data = span.get("data", {})
+        data = span.get("data") or {}
         applied_rule = data.get("description.scrubbed", {}).get("", {}).get("rem", [[]])[0]
         if not applied_rule:
             continue

+ 20 - 0
tests/sentry/ingest/test_span_desc_clusterer.py

@@ -498,6 +498,26 @@ def test_dont_store_inexisting_rules(_, default_organization):
         assert get_rules(ClustererNamespace.SPANS, project1) == {"**/user/*/**": 1}
 
 
+@django_db_all
+def test_record_span_descriptions_no_databag(default_organization):
+    """Verify a `None` databag doesn't break the span description clusterer."""
+    with Feature("projects:span-metrics-extraction"), override_options(
+        {"span_descs.bump-lifetime-sample-rate": 1.0}
+    ):
+        payload = {
+            "spans": [
+                {
+                    "description": "GET a",
+                    "op": "http.client",
+                    "data": None,
+                }
+            ],
+        }
+
+        project = Project(id=123, name="project", organization_id=default_organization.id)
+        record_span_descriptions(project, payload)
+
+
 @django_db_all
 def test_stale_rules_arent_saved(default_project):
     assert len(get_sorted_rules(ClustererNamespace.SPANS, default_project)) == 0