Browse Source

fix(snuba): fix referrer attribution (#46013)

**context**
sooo https://github.com/getsentry/sentry/pull/45902 worked great except
for two things:
* forgot to pass through the `referrer_suffix` in `get_range`
* `tsdb-modelid:4` is not used for the user queries

So this PR fixes both of those issues
MeredithAnya 2 years ago
parent
commit
140d20c3a8
3 changed files with 40 additions and 15 deletions
  1. 32 13
      src/sentry/snuba/referrer.py
  2. 1 0
      src/sentry/tsdb/snuba.py
  3. 7 2
      tests/snuba/test_referrer.py

+ 32 - 13
src/sentry/snuba/referrer.py

@@ -2,7 +2,7 @@ import enum
 import logging
 from enum import Enum, unique
 from itertools import chain
-from typing import Optional
+from typing import Mapping, Optional
 
 from sentry.tsdb.base import TSDBModel
 from sentry.utils import metrics
@@ -546,25 +546,44 @@ TSDBModelReferrer = enum.Enum(
     {f"TSDB_MODELID_{model.value}": f"tsdb-modelid:{model.value}" for model in TSDBModel},
 )
 
-# specific suffixes that apply to tsdb-modelid:4 referrers, these are optional
-# and are passed around through using `referrer_suffix`
-TSDB_4_SUFFIXES = {
-    "frequency_snoozes",
-    "user_count_snoozes",
-    "alert_event_frequency",
-    "alert_event_uniq_user_frequency",
-    "alert_event_frequency_percent",
+# specific suffixes that apply to tsdb-modelid referrers, these are optional
+# and are passed around through using `referrer_suffix`.
+TSDB_MODEL_TO_SUFFIXES = {
+    TSDBModel.group: {
+        "frequency_snoozes",
+        "alert_event_frequency",
+        "alert_event_frequency_percent",
+    },
+    TSDBModel.group_performance: {
+        "frequency_snoozes",
+        "alert_event_frequency",
+        "alert_event_frequency_percent",
+    },
+    TSDBModel.users_affected_by_group: {"user_count_snoozes", "alert_event_uniq_user_frequency"},
+    TSDBModel.users_affected_by_perf_group: {
+        "user_count_snoozes",
+        "alert_event_uniq_user_frequency",
+    },
 }
 
-TSDBModel4Referrer = enum.Enum(
-    "TSDBModel4Referrer",
-    {f"TSDB_MODELID_4_{suffix}": f"tsdb-modelid:4.{suffix}" for suffix in TSDB_4_SUFFIXES},
+
+def generate_enums() -> Mapping[str, str]:
+    enums = {}
+    for model, suffixes in TSDB_MODEL_TO_SUFFIXES.items():
+        for suffix in suffixes:
+            enums[f"TSDB_MODELID_{model.value}_{suffix}"] = f"tsdb-modelid:{model.value}.{suffix}"
+    return enums
+
+
+TSDBModelSuffixReferrer = enum.Enum(
+    "TSDBModelSuffixReferrer",
+    generate_enums(),
 )
 
 
 Referrer = enum.Enum(
     "Referrer",
-    [(i.name, i.value) for i in chain(ReferrerBase, TSDBModelReferrer, TSDBModel4Referrer)],
+    [(i.name, i.value) for i in chain(ReferrerBase, TSDBModelReferrer, TSDBModelSuffixReferrer)],
 )
 
 

+ 1 - 0
src/sentry/tsdb/snuba.py

@@ -751,6 +751,7 @@ class SnubaTSDB(BaseTSDB):
             use_cache=use_cache,
             jitter_value=jitter_value,
             tenant_ids=tenant_ids,
+            referrer_suffix=referrer_suffix,
         )
         # convert
         #    {group:{timestamp:count, ...}}

+ 7 - 2
tests/snuba/test_referrer.py

@@ -20,10 +20,15 @@ class ReferrerTest(TestCase):
         assert warn_log.call_count == 0
 
     @patch("sentry.snuba.referrer.logger.warning")
-    def test_referrer_validate_tsdb_4_model_with_suffix(self, warn_log):
+    def test_referrer_validate_tsdb_model_with_suffix(self, warn_log):
         assert warn_log.call_count == 0
-        validate_referrer("tsdb-modelid:4.user_count_snoozes")
+        validate_referrer("tsdb-modelid:300.user_count_snoozes")
+        assert warn_log.call_count == 0
+        validate_referrer("tsdb-modelid:4.frequency_snoozes")
         assert warn_log.call_count == 0
+        # tsdb-modelid:4 doesn't use the `user_count_snoozes` suffix
+        validate_referrer("tsdb-modelid:4.user_count_snoozes")
+        assert warn_log.call_count == 1
 
     @patch("sentry.snuba.referrer.logger.warning")
     def test_referrer_validate_base_enum_values(self, warn_log):