Browse Source

fix(snuba): Fix cache key for snql queries (#30191)

Use only SnubaQuery, not translators, for cache key generation.
Joris Bayer 3 years ago
parent
commit
36fbaf188d
2 changed files with 23 additions and 2 deletions
  1. 2 2
      src/sentry/utils/snuba.py
  2. 21 0
      tests/snuba/test_snql_snuba.py

+ 2 - 2
src/sentry/utils/snuba.py

@@ -672,7 +672,7 @@ def raw_snql_query(
     # other functions do here. It does not add any automatic conditions, format
     # results, nothing. Use at your own risk.
     metrics.incr("snql.sdk.api", tags={"referrer": referrer or "unknown"})
-    params: SnubaQuery = (query, lambda x: x, lambda x: x)
+    params: SnubaQueryBody = (query, lambda x: x, lambda x: x)
     return _apply_cache_and_build_results([params], referrer=referrer, use_cache=use_cache)[0]
 
 
@@ -723,7 +723,7 @@ def _apply_cache_and_build_results(
     results = []
 
     if use_cache:
-        cache_keys = [get_cache_key(query_params) for _, query_params in query_param_list]
+        cache_keys = [get_cache_key(query_params[0]) for _, query_params in query_param_list]
         cache_data = cache.get_many(cache_keys)
         to_query: List[Tuple[int, SnubaQueryBody, Optional[str]]] = []
         for (query_pos, query_params), cache_key in zip(query_param_list, cache_keys):

+ 21 - 0
tests/snuba/test_snql_snuba.py

@@ -3,9 +3,11 @@ import uuid
 from datetime import datetime, timedelta
 from typing import Optional
 
+from django.utils import timezone
 from snuba_sdk.column import Column
 from snuba_sdk.conditions import Condition, Op
 from snuba_sdk.entity import Entity
+from snuba_sdk.expressions import Limit
 from snuba_sdk.function import Function
 from snuba_sdk.query import Query
 
@@ -56,3 +58,22 @@ class SnQLTest(TestCase, SnubaTestCase):
         result = snuba.raw_snql_query(query)
         assert len(result["data"]) == 1
         assert result["data"][0] == {"count": 1, "project_id": self.project.id}
+
+    def test_cache(self):
+        """Minimal test to verify if use_cache works"""
+        results = snuba.raw_snql_query(
+            Query(
+                "events",
+                Entity("events"),
+                select=[Column("event_id")],
+                where=[
+                    Condition(Column("project_id"), Op.EQ, self.project.id),
+                    Condition(Column("timestamp"), Op.GTE, timezone.now() - timedelta(days=1)),
+                    Condition(Column("timestamp"), Op.LT, timezone.now()),
+                ],
+                limit=Limit(1),
+            ),
+            use_cache=True,
+        )
+
+        assert results["data"] == []