Browse Source

feat(sourcemaps): Add metrics for flat file meta (#53693)

Riccardo Busetti 1 year ago
parent
commit
816a8559d1

+ 37 - 4
src/sentry/debug_files/artifact_bundle_indexing.py

@@ -42,9 +42,6 @@ class FlatFileMeta:
     id: int
     id: int
     date: datetime
     date: datetime
 
 
-    def to_string(self) -> str:
-        return f"bundle_index/{self.id}/{int(self.date.timestamp() * 1000)}"
-
     @staticmethod
     @staticmethod
     def from_str(bundle_meta: str) -> "FlatFileMeta":
     def from_str(bundle_meta: str) -> "FlatFileMeta":
         parsed = bundle_meta.split("/")
         parsed = bundle_meta.split("/")
@@ -53,6 +50,16 @@ class FlatFileMeta:
 
 
         return FlatFileMeta(id=int(parsed[1]), date=datetime.fromtimestamp(int(parsed[2]) / 1000))
         return FlatFileMeta(id=int(parsed[1]), date=datetime.fromtimestamp(int(parsed[2]) / 1000))
 
 
+    @staticmethod
+    def build_none():
+        return FlatFileMeta(id=-1, date=datetime.min)
+
+    def to_string(self) -> str:
+        return f"bundle_index/{self.id}/{int(self.date.timestamp() * 1000)}"
+
+    def is_none(self):
+        return self.id == -1 and self.date == datetime.min
+
 
 
 @sentry_sdk.tracing.trace
 @sentry_sdk.tracing.trace
 def mark_bundle_for_flat_file_indexing(
 def mark_bundle_for_flat_file_indexing(
@@ -181,13 +188,39 @@ class FlatFileIdentifier(NamedTuple):
         return FlatFileMeta(id=result.id, date=result.date_added)
         return FlatFileMeta(id=result.id, date=result.date_added)
 
 
     def get_flat_file_meta(self) -> Optional[FlatFileMeta]:
     def get_flat_file_meta(self) -> Optional[FlatFileMeta]:
+        meta_type = "release" if self.is_indexing_by_release() else "debug_id"
+
         meta = self.get_flat_file_meta_from_cache()
         meta = self.get_flat_file_meta_from_cache()
         if meta is None:
         if meta is None:
+            metrics.incr(
+                "artifact_bundle_flat_file_indexing.flat_file_meta.cache_miss",
+                tags={"meta_type": meta_type},
+            )
+
             meta = self.get_flat_file_meta_from_db()
             meta = self.get_flat_file_meta_from_db()
             if meta is None:
             if meta is None:
-                return None
+                metrics.incr(
+                    "artifact_bundle_flat_file_indexing.flat_file_meta.db_miss",
+                    tags={"meta_type": meta_type},
+                )
+                meta = FlatFileMeta.build_none()
+            else:
+                metrics.incr(
+                    "artifact_bundle_flat_file_indexing.flat_file_meta.db_hit",
+                    tags={"meta_type": meta_type},
+                )
 
 
+            # We want to cache in both cases, either a value is found or a value was not found.
             self.set_flat_file_meta_in_cache(meta)
             self.set_flat_file_meta_in_cache(meta)
+        else:
+            metrics.incr(
+                "artifact_bundle_flat_file_indexing.flat_file_meta.cache_hit",
+                tags={"meta_type": meta_type},
+            )
+
+        # In case the meta that we found was none, we want to return None.
+        if meta.is_none():
+            return None
 
 
         return meta
         return meta
 
 

+ 13 - 1
tests/sentry/lang/native/test_sources.py

@@ -5,6 +5,7 @@ from django.utils import timezone
 from freezegun import freeze_time
 from freezegun import freeze_time
 
 
 from sentry.debug_files.artifact_bundle_indexing import FlatFileIdentifier, FlatFileMeta
 from sentry.debug_files.artifact_bundle_indexing import FlatFileIdentifier, FlatFileMeta
+from sentry.debug_files.artifact_bundles import get_redis_cluster_for_artifact_bundles
 from sentry.lang.native.sources import get_bundle_index_urls
 from sentry.lang.native.sources import get_bundle_index_urls
 from sentry.models import ArtifactBundleFlatFileIndex
 from sentry.models import ArtifactBundleFlatFileIndex
 from sentry.testutils.helpers import override_options
 from sentry.testutils.helpers import override_options
@@ -24,6 +25,11 @@ def _mock_flat_file_index(
     return index
     return index
 
 
 
 
+def _clear_cache():
+    redis_client = get_redis_cluster_for_artifact_bundles()
+    redis_client.flushall()
+
+
 @pytest.mark.django_db
 @pytest.mark.django_db
 @freeze_time("2023-07-26T10:00:00")
 @freeze_time("2023-07-26T10:00:00")
 @override_options({"symbolicator.sourcemaps-bundle-index-sample-rate": 0.0})
 @override_options({"symbolicator.sourcemaps-bundle-index-sample-rate": 0.0})
@@ -61,9 +67,11 @@ def test_get_bundle_index_urls_with_no_cached_values(default_project):
         FlatFileIdentifier(
         FlatFileIdentifier(
             project_id=default_project.id, release=release, dist=dist
             project_id=default_project.id, release=release, dist=dist
         ).get_flat_file_meta_from_cache()
         ).get_flat_file_meta_from_cache()
-        is None
+        == FlatFileMeta.build_none()
     )
     )
 
 
+    _clear_cache()
+
     index_1 = _mock_flat_file_index(project_id=default_project.id, release=release, dist=dist)
     index_1 = _mock_flat_file_index(project_id=default_project.id, release=release, dist=dist)
 
 
     # We test the generation with release only.
     # We test the generation with release only.
@@ -83,6 +91,8 @@ def test_get_bundle_index_urls_with_no_cached_values(default_project):
         is not None
         is not None
     )
     )
 
 
+    _clear_cache()
+
     index_2 = _mock_flat_file_index(project_id=default_project.id, release=None, dist=None)
     index_2 = _mock_flat_file_index(project_id=default_project.id, release=None, dist=None)
 
 
     # We test the generation with debug id only.
     # We test the generation with debug id only.
@@ -102,6 +112,8 @@ def test_get_bundle_index_urls_with_no_cached_values(default_project):
         is not None
         is not None
     )
     )
 
 
+    _clear_cache()
+
     # We test the generation with release and debug id.
     # We test the generation with release and debug id.
     debug_id_index, url_index = get_bundle_index_urls(
     debug_id_index, url_index = get_bundle_index_urls(
         project=default_project, release=release, dist=dist
         project=default_project, release=release, dist=dist