Просмотр исходного кода

feat(profiling): add cardinality option for profiles metrics (#66503)

* add `sentry-metrics.cardinality-limiter.limits.profiles.per-org` option
* register the cardinality limit quota
Francesco Vigliaturo 1 год назад
Родитель
Сommit
69e4c48384

+ 1 - 1
requirements-base.txt

@@ -65,7 +65,7 @@ sentry-arroyo>=2.16.2
 sentry-kafka-schemas>=0.1.58
 sentry-ophio==0.1.5
 sentry-redis-tools>=0.1.7
-sentry-relay>=0.8.48
+sentry-relay>=0.8.49
 sentry-sdk>=1.39.2
 snuba-sdk>=2.0.29
 simplejson>=3.17.6

+ 1 - 1
requirements-dev-frozen.txt

@@ -180,7 +180,7 @@ sentry-forked-djangorestframework-stubs==3.14.5.post1
 sentry-kafka-schemas==0.1.58
 sentry-ophio==0.1.5
 sentry-redis-tools==0.1.7
-sentry-relay==0.8.48
+sentry-relay==0.8.49
 sentry-sdk==1.39.2
 sentry-usage-accountant==0.0.10
 simplejson==3.17.6

+ 1 - 1
requirements-frozen.txt

@@ -122,7 +122,7 @@ sentry-arroyo==2.16.2
 sentry-kafka-schemas==0.1.58
 sentry-ophio==0.1.5
 sentry-redis-tools==0.1.7
-sentry-relay==0.8.48
+sentry-relay==0.8.49
 sentry-sdk==1.39.2
 sentry-usage-accountant==0.0.10
 simplejson==3.17.6

+ 7 - 0
src/sentry/options/defaults.py

@@ -1243,6 +1243,13 @@ register(
     ],
     flags=FLAG_AUTOMATOR_MODIFIABLE,
 )
+register(
+    "sentry-metrics.cardinality-limiter.limits.profiles.per-org",
+    default=[
+        {"window_seconds": 3600, "granularity_seconds": 600, "limit": 10000},
+    ],
+    flags=FLAG_AUTOMATOR_MODIFIABLE,
+)
 register(
     "sentry-metrics.cardinality-limiter.limits.generic-metrics.per-org",
     default=[

+ 1 - 0
src/sentry/sentry_metrics/use_case_id_registry.py

@@ -45,6 +45,7 @@ USE_CASE_ID_CARDINALITY_LIMIT_QUOTA_OPTIONS = {
     UseCaseID.SESSIONS: "sentry-metrics.cardinality-limiter.limits.releasehealth.per-org",
     UseCaseID.SPANS: "sentry-metrics.cardinality-limiter.limits.spans.per-org",
     UseCaseID.CUSTOM: "sentry-metrics.cardinality-limiter.limits.custom.per-org",
+    UseCaseID.PROFILES: "sentry-metrics.cardinality-limiter.limits.profiles.per-org",
 }
 
 USE_CASE_ID_WRITES_LIMIT_QUOTA_OPTIONS = {

+ 4 - 0
tests/sentry/api/endpoints/test_relay_globalconfig_v3.py

@@ -38,16 +38,20 @@ def test_global_config():
     config["options"]["profiling.profile_metrics.unsampled_profiles.enabled"] = True
     config["options"]["profiling.profile_metrics.unsampled_profiles.platforms"] = ["fake-platform"]
     config["options"]["profiling.profile_metrics.unsampled_profiles.sample_rate"] = 1.0
+
     config["options"]["relay.metric-bucket-encodings"] = {
         "sessions": "array",
         "transactions": "array",
         "spans": "array",
         "custom": "array",
+        "profiles": "array",
         "unsupported": "array",
     }
     config["options"]["relay.span-usage-metric"] = True
     config["options"]["relay.cardinality-limiter.mode"] = "passive"
 
+    config["options"]["profiling.generic_metrics.functions_ingestion.enabled"] = True
+
     normalized = normalize_global_config(config)
     assert normalized == config
 

+ 7 - 0
tests/sentry/relay/snapshots/test_config/test_project_config_cardinality_limits/False/REGION.pysnap

@@ -30,3 +30,10 @@ cardinalityLimits:
   window:
     granularitySeconds: 400
     windowSeconds: 4000
+- id: profiles
+  limit: 60
+  namespace: profiles
+  scope: organization
+  window:
+    granularitySeconds: 600
+    windowSeconds: 3600

+ 8 - 0
tests/sentry/relay/snapshots/test_config/test_project_config_cardinality_limits/True/REGION.pysnap

@@ -34,3 +34,11 @@ cardinalityLimits:
   window:
     granularitySeconds: 400
     windowSeconds: 4000
+- id: profiles
+  limit: 60
+  namespace: profiles
+  passive: true
+  scope: organization
+  window:
+    granularitySeconds: 600
+    windowSeconds: 3600

+ 10 - 1
tests/sentry/relay/test_config.py

@@ -932,11 +932,20 @@ def test_project_config_cardinality_limits(default_project, insta_snapshot, pass
         "sentry-metrics.cardinality-limiter.limits.generic-metrics.per-org": [
             {"window_seconds": 5000, "granularity_seconds": 500, "limit": 50}
         ],
+        "sentry-metrics.cardinality-limiter.limits.profiles.per-org": [
+            {"window_seconds": 3600, "granularity_seconds": 600, "limit": 60}
+        ],
     }
 
     if passive:
         options["relay.cardinality-limiter.passive-limits-by-org"] = {
-            default_project.organization.id: ["sessions", "transactions", "spans", "custom"]
+            default_project.organization.id: [
+                "sessions",
+                "transactions",
+                "spans",
+                "profiles",
+                "custom",
+            ]
         }
 
     features = Feature({"organizations:relay-cardinality-limiter": True})