diff --git a/requirements-base.txt b/requirements-base.txt index 04deebce004cb..6d4ea4605e13c 100644 --- a/requirements-base.txt +++ b/requirements-base.txt @@ -65,7 +65,7 @@ sentry-arroyo>=2.16.5 sentry-kafka-schemas>=0.1.65 sentry-ophio==0.2.6 sentry-redis-tools>=0.1.7 -sentry-relay>=0.8.55 +sentry-relay>=0.8.56 sentry-sdk>=1.44.0 snuba-sdk>=2.0.31 simplejson>=3.17.6 diff --git a/requirements-dev-frozen.txt b/requirements-dev-frozen.txt index 9467e856cfc52..1504b1655b86c 100644 --- a/requirements-dev-frozen.txt +++ b/requirements-dev-frozen.txt @@ -179,7 +179,7 @@ sentry-forked-djangorestframework-stubs==3.14.5.post1 sentry-kafka-schemas==0.1.65 sentry-ophio==0.2.6 sentry-redis-tools==0.1.7 -sentry-relay==0.8.55 +sentry-relay==0.8.56 sentry-sdk==1.44.0 sentry-usage-accountant==0.0.10 simplejson==3.17.6 diff --git a/requirements-frozen.txt b/requirements-frozen.txt index 5f9e37970f1c5..cc524d5c42eea 100644 --- a/requirements-frozen.txt +++ b/requirements-frozen.txt @@ -121,7 +121,7 @@ sentry-arroyo==2.16.5 sentry-kafka-schemas==0.1.65 sentry-ophio==0.2.6 sentry-redis-tools==0.1.7 -sentry-relay==0.8.55 +sentry-relay==0.8.56 sentry-sdk==1.44.0 sentry-usage-accountant==0.0.10 simplejson==3.17.6 diff --git a/src/sentry/options/defaults.py b/src/sentry/options/defaults.py index 2baf6ac70889b..4ab49ebad75c2 100644 --- a/src/sentry/options/defaults.py +++ b/src/sentry/options/defaults.py @@ -994,6 +994,15 @@ register( "relay.cardinality-limiter.error-sample-rate", default=0.01, flags=FLAG_AUTOMATOR_MODIFIABLE ) +# List of additional cardinality limits and selectors. +# +# ``` +# { +# "rollout_rate": 0.001, +# "limit": { .. Cardinality Limit .. } +# } +# ``` +register("relay.cardinality-limiter.limits", default=[], flags=FLAG_AUTOMATOR_MODIFIABLE) # Controls the encoding used in Relay for encoding distributions and sets # when writing to Kafka. diff --git a/src/sentry/relay/config/__init__.py b/src/sentry/relay/config/__init__.py index a9add44bb383c..80f3b671f406d 100644 --- a/src/sentry/relay/config/__init__.py +++ b/src/sentry/relay/config/__init__.py @@ -248,6 +248,11 @@ class CardinalityLimit(TypedDict): namespace: str | None +class CardinalityLimitOption(TypedDict): + rollout_rate: NotRequired[float] + limit: CardinalityLimit + + def get_metrics_config(timeout: TimeChecker, project: Project) -> Mapping[str, Any] | None: metrics_config = {} @@ -280,6 +285,18 @@ def get_metrics_config(timeout: TimeChecker, project: Project) -> Mapping[str, A if id in passive_limits: limit["passive"] = True cardinality_limits.append(limit) + + clos: list[CardinalityLimitOption] = options.get("relay.cardinality-limiter.limits") + for clo in clos: + rollout_rate = clo.get("rollout_rate", 1.0) + if (project.organization.id % 100000) / 100000 >= rollout_rate: + continue + + try: + cardinality_limits.append(clo["limit"]) + except KeyError: + pass + metrics_config["cardinalityLimits"] = cardinality_limits if features.has("organizations:metrics-blocking", project.organization): @@ -828,9 +845,6 @@ def _get_project_config( if _should_extract_abnormal_mechanism(project) else EXTRACT_METRICS_VERSION ), - "drop": features.has( - "organizations:release-health-drop-sessions", project.organization - ), } performance_score_profiles = [ diff --git a/tests/sentry/api/endpoints/test_relay_projectconfigs_v2.py b/tests/sentry/api/endpoints/test_relay_projectconfigs_v2.py index fb18da34da379..b3f1c2a63250e 100644 --- a/tests/sentry/api/endpoints/test_relay_projectconfigs_v2.py +++ b/tests/sentry/api/endpoints/test_relay_projectconfigs_v2.py @@ -357,7 +357,7 @@ def test_session_metrics_extraction(call_endpoint, task_runner, drop_sessions): for config in result["configs"].values(): config = config["config"] - assert config["sessionMetrics"] == {"version": 1, "drop": drop_sessions} + assert config["sessionMetrics"] == {"version": 1} @django_db_all @@ -378,5 +378,4 @@ def test_session_metrics_abnormal_mechanism_tag_extraction( config = config["config"] assert config["sessionMetrics"] == { "version": 2 if abnormal_mechanism_rollout else 1, - "drop": False, } diff --git a/tests/sentry/relay/snapshots/test_config/test_project_config_cardinality_limits/False/REGION.pysnap b/tests/sentry/relay/snapshots/test_config/test_project_config_cardinality_limits/False/REGION.pysnap index 04710413fdabd..81fc2a8e37a88 100644 --- a/tests/sentry/relay/snapshots/test_config/test_project_config_cardinality_limits/False/REGION.pysnap +++ b/tests/sentry/relay/snapshots/test_config/test_project_config_cardinality_limits/False/REGION.pysnap @@ -37,3 +37,10 @@ cardinalityLimits: window: granularitySeconds: 600 windowSeconds: 3600 +- id: test2 + limit: 80 + report: true + scope: name + window: + granularitySeconds: 800 + windowSeconds: 8000 diff --git a/tests/sentry/relay/snapshots/test_config/test_project_config_cardinality_limits/True/REGION.pysnap b/tests/sentry/relay/snapshots/test_config/test_project_config_cardinality_limits/True/REGION.pysnap index 7b94575c690a5..cf4b741c10a8b 100644 --- a/tests/sentry/relay/snapshots/test_config/test_project_config_cardinality_limits/True/REGION.pysnap +++ b/tests/sentry/relay/snapshots/test_config/test_project_config_cardinality_limits/True/REGION.pysnap @@ -42,3 +42,10 @@ cardinalityLimits: window: granularitySeconds: 600 windowSeconds: 3600 +- id: test2 + limit: 80 + report: true + scope: name + window: + granularitySeconds: 800 + windowSeconds: 8000 diff --git a/tests/sentry/relay/test_config.py b/tests/sentry/relay/test_config.py index b63f32fae9244..79a3af15954c6 100644 --- a/tests/sentry/relay/test_config.py +++ b/tests/sentry/relay/test_config.py @@ -497,7 +497,6 @@ def test_project_config_with_organizations_metrics_extraction( session_metrics = get_path(cfg, "config", "sessionMetrics") if has_metrics_extraction: assert session_metrics == { - "drop": False, "version": 2 if abnormal_mechanism_rollout else 1, } else: @@ -957,6 +956,28 @@ def test_project_config_cardinality_limits(default_project, insta_snapshot, pass ] } + options["relay.cardinality-limiter.limits"] = [ + { + "rollout_rate": 0, + "limit": { + "id": "test1", + "window": {"windowSeconds": 7000, "granularitySeconds": 700}, + "limit": 70, + "scope": "name", + }, + }, + { + "rollout_rate": 1, + "limit": { + "id": "test2", + "window": {"windowSeconds": 8000, "granularitySeconds": 800}, + "limit": 80, + "scope": "name", + "report": True, + }, + }, + ] + features = Feature({"organizations:relay-cardinality-limiter": True}) with override_options(options), features: