Skip to content

Commit 08600fd

Browse files
committed
ref(relay): Remove cardinality limiter config from project configs
1 parent dca7d73 commit 08600fd

File tree

4 files changed

+0
-321
lines changed

4 files changed

+0
-321
lines changed

src/sentry/relay/config/__init__.py

Lines changed: 0 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646
from sentry.relay.datascrubbing import get_datascrubbing_settings, get_pii_config
4747
from sentry.relay.types.generic_filters import GenericFilter
4848
from sentry.relay.utils import to_camel_case_name
49-
from sentry.sentry_metrics.use_case_id_registry import CARDINALITY_LIMIT_USE_CASES
5049
from sentry.utils import metrics
5150
from sentry.utils.http import get_origins
5251
from sentry.utils.options import sample_modulo
@@ -238,83 +237,6 @@ class CardinalityLimitOption(TypedDict):
238237
projects: NotRequired[list[int]]
239238

240239

241-
def get_metrics_config(timeout: TimeChecker, project: Project) -> Mapping[str, Any] | None:
242-
metrics_config = {}
243-
244-
if cardinality_limits := get_cardinality_limits(timeout, project):
245-
metrics_config["cardinalityLimits"] = cardinality_limits
246-
247-
return metrics_config or None
248-
249-
250-
def get_cardinality_limits(timeout: TimeChecker, project: Project) -> list[CardinalityLimit] | None:
251-
if options.get("relay.cardinality-limiter.mode") == "disabled":
252-
return None
253-
254-
passive_limits = options.get("relay.cardinality-limiter.passive-limits-by-org").get(
255-
str(project.organization.id), []
256-
)
257-
258-
existing_ids: set[str] = set()
259-
cardinality_limits: list[CardinalityLimit] = []
260-
for namespace in CARDINALITY_LIMIT_USE_CASES:
261-
timeout.check()
262-
option = options.get(f"sentry-metrics.cardinality-limiter.limits.{namespace.value}.per-org")
263-
if not option or not len(option) == 1:
264-
# Multiple quotas are not supported
265-
continue
266-
267-
quota = option[0]
268-
id = namespace.value
269-
270-
limit: CardinalityLimit = {
271-
"id": id,
272-
"window": {
273-
"windowSeconds": quota["window_seconds"],
274-
"granularitySeconds": quota["granularity_seconds"],
275-
},
276-
"limit": quota["limit"],
277-
"scope": "organization",
278-
"namespace": namespace.value,
279-
}
280-
if id in passive_limits:
281-
limit["passive"] = True
282-
cardinality_limits.append(limit)
283-
existing_ids.add(id)
284-
285-
project_limit_options: list[CardinalityLimitOption] = project.get_option(
286-
"relay.cardinality-limiter.limits", []
287-
)
288-
organization_limit_options: list[CardinalityLimitOption] = project.organization.get_option(
289-
"relay.cardinality-limiter.limits", []
290-
)
291-
option_limit_options: list[CardinalityLimitOption] = options.get(
292-
"relay.cardinality-limiter.limits"
293-
)
294-
295-
for clo in project_limit_options + organization_limit_options + option_limit_options:
296-
rollout_rate = clo.get("rollout_rate", 1.0)
297-
if (project.organization.id % 100000) / 100000 >= rollout_rate:
298-
continue
299-
300-
projects = clo.get("projects")
301-
if projects is not None and project.id not in projects:
302-
# projects list is defined but the current project is not in the list
303-
continue
304-
305-
try:
306-
limit = clo["limit"]
307-
if clo["limit"]["id"] in existing_ids:
308-
# skip if a limit with the same id already exists
309-
continue
310-
cardinality_limits.append(limit)
311-
existing_ids.add(clo["limit"]["id"])
312-
except KeyError:
313-
pass
314-
315-
return cardinality_limits
316-
317-
318240
def get_project_config(
319241
project: Project, project_keys: Iterable[ProjectKey] | None = None
320242
) -> ProjectConfig:
@@ -1046,8 +968,6 @@ def _get_project_config(
1046968

1047969
config["breakdownsV2"] = project.get_option("sentry:breakdowns")
1048970

1049-
add_experimental_config(config, "metrics", get_metrics_config, project)
1050-
1051971
if _should_extract_transaction_metrics(project):
1052972
add_experimental_config(
1053973
config,

tests/sentry/api/endpoints/test_relay_globalconfig_v3.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,10 @@ def inner(version, global_):
3535
@override_options(
3636
{
3737
# Set options to Relay's non-default values to avoid Relay skipping deserialization
38-
"relay.cardinality-limiter.error-sample-rate": 1.0,
3938
"profiling.profile_metrics.unsampled_profiles.enabled": True,
4039
"profiling.profile_metrics.unsampled_profiles.platforms": ["fake-platform"],
4140
"profiling.profile_metrics.unsampled_profiles.sample_rate": 1.0,
4241
"relay.span-usage-metric": True,
43-
"relay.cardinality-limiter.mode": "passive",
4442
"relay.sessions-eap.rollout-rate": 1.0,
4543
"relay.objectstore-attachments.sample-rate": 1.0,
4644
"relay.kafka.span-v2.sample-rate": 1.0,

tests/sentry/core/endpoints/test_project_details.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -795,21 +795,6 @@ def test_options(self) -> None:
795795
assert project.get_option("filters:react-hydration-errors", "1")
796796
assert project.get_option("filters:chunk-load-error", "1")
797797

798-
self.project.update_option(
799-
"relay.cardinality-limiter.limits",
800-
[
801-
{
802-
"limit": {
803-
"id": "project-override-custom",
804-
"window": {"windowSeconds": 3600, "granularitySeconds": 600},
805-
"limit": 1000,
806-
"namespace": "custom",
807-
"scope": "name",
808-
}
809-
}
810-
],
811-
)
812-
813798
def test_preprod_snapshot_pr_comments_option(self) -> None:
814799
self.get_success_response(
815800
self.org_slug, self.proj_slug, preprodSnapshotPrCommentsEnabled=False

tests/sentry/relay/test_config.py

Lines changed: 0 additions & 224 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import time
22
from datetime import datetime, timedelta, timezone
3-
from typing import Any
43
from unittest import mock
54
from unittest.mock import ANY, MagicMock, patch
65

@@ -1353,229 +1352,6 @@ def test_mobile_performance_calculate_score(default_project) -> None:
13531352
}
13541353

13551354

1356-
@django_db_all
1357-
@cell_silo_test
1358-
@pytest.mark.parametrize("passive", [False, True])
1359-
def test_project_config_cardinality_limits(
1360-
default_project: Project, insta_snapshot: InstaSnapshotter, passive: bool
1361-
) -> None:
1362-
options: dict[Any, Any] = {
1363-
"relay.cardinality-limiter.mode": "enabled",
1364-
"sentry-metrics.cardinality-limiter.limits.transactions.per-org": [
1365-
{"window_seconds": 1000, "granularity_seconds": 100, "limit": 10}
1366-
],
1367-
"sentry-metrics.cardinality-limiter.limits.sessions.per-org": [
1368-
{"window_seconds": 2000, "granularity_seconds": 200, "limit": 20}
1369-
],
1370-
"sentry-metrics.cardinality-limiter.limits.spans.per-org": [
1371-
{"window_seconds": 3000, "granularity_seconds": 300, "limit": 30}
1372-
],
1373-
"sentry-metrics.cardinality-limiter.limits.custom.per-org": [
1374-
{"window_seconds": 4000, "granularity_seconds": 400, "limit": 40}
1375-
],
1376-
"sentry-metrics.cardinality-limiter.limits.generic-metrics.per-org": [
1377-
{"window_seconds": 5000, "granularity_seconds": 500, "limit": 50}
1378-
],
1379-
"sentry-metrics.cardinality-limiter.limits.profiles.per-org": [
1380-
{"window_seconds": 3600, "granularity_seconds": 600, "limit": 60}
1381-
],
1382-
}
1383-
1384-
if passive:
1385-
options["relay.cardinality-limiter.passive-limits-by-org"] = {
1386-
str(default_project.organization.id): [
1387-
"sessions",
1388-
"transactions",
1389-
"spans",
1390-
"profiles",
1391-
]
1392-
}
1393-
1394-
options["relay.cardinality-limiter.limits"] = [
1395-
{
1396-
"rollout_rate": 0,
1397-
"limit": {
1398-
"id": "test1",
1399-
"window": {"windowSeconds": 7000, "granularitySeconds": 700},
1400-
"limit": 70,
1401-
"scope": "name",
1402-
},
1403-
},
1404-
{
1405-
"rollout_rate": 1,
1406-
"limit": {
1407-
"id": "test2",
1408-
"window": {"windowSeconds": 8000, "granularitySeconds": 800},
1409-
"limit": 80,
1410-
"scope": "name",
1411-
"report": True,
1412-
},
1413-
},
1414-
]
1415-
1416-
default_project.update_option(
1417-
"relay.cardinality-limiter.limits",
1418-
[
1419-
{
1420-
"limit": {
1421-
"id": "test3",
1422-
"window": {"windowSeconds": 9000, "granularitySeconds": 900},
1423-
"limit": 90,
1424-
"scope": "name",
1425-
}
1426-
}
1427-
],
1428-
)
1429-
1430-
default_project.organization.update_option(
1431-
"relay.cardinality-limiter.limits",
1432-
[
1433-
{
1434-
"limit": {
1435-
"id": "test4",
1436-
"window": {"windowSeconds": 10000, "granularitySeconds": 1000},
1437-
"limit": 100,
1438-
"scope": "name",
1439-
}
1440-
}
1441-
],
1442-
)
1443-
1444-
with override_options(options):
1445-
project_cfg = get_project_config(default_project)
1446-
1447-
cfg = project_cfg.to_dict()
1448-
_validate_project_config(cfg["config"])
1449-
1450-
insta_snapshot(cfg["config"]["metrics"])
1451-
1452-
1453-
@django_db_all
1454-
@cell_silo_test
1455-
def test_project_config_cardinality_limits_project_options_override_other_options(
1456-
default_project,
1457-
) -> None:
1458-
options: dict[Any, Any] = {
1459-
"relay.cardinality-limiter.mode": "enabled",
1460-
"sentry-metrics.cardinality-limiter.limits.transactions.per-org": None,
1461-
"sentry-metrics.cardinality-limiter.limits.sessions.per-org": None,
1462-
"sentry-metrics.cardinality-limiter.limits.spans.per-org": None,
1463-
"sentry-metrics.cardinality-limiter.limits.custom.per-org": None,
1464-
"sentry-metrics.cardinality-limiter.limits.generic-metrics.per-org": None,
1465-
"sentry-metrics.cardinality-limiter.limits.profiles.per-org": None,
1466-
}
1467-
1468-
options["relay.cardinality-limiter.limits"] = [
1469-
{
1470-
"limit": {
1471-
"id": "test1",
1472-
"window": {"windowSeconds": 1000, "granularitySeconds": 100},
1473-
"limit": 10,
1474-
"scope": "name",
1475-
},
1476-
},
1477-
]
1478-
1479-
default_project.organization.update_option(
1480-
"relay.cardinality-limiter.limits",
1481-
[
1482-
{
1483-
"limit": {
1484-
"id": "test1",
1485-
"window": {"windowSeconds": 2000, "granularitySeconds": 200},
1486-
"limit": 20,
1487-
"scope": "name",
1488-
}
1489-
}
1490-
],
1491-
)
1492-
1493-
default_project.update_option(
1494-
"relay.cardinality-limiter.limits",
1495-
[
1496-
{
1497-
"limit": {
1498-
"id": "test1",
1499-
"window": {"windowSeconds": 3000, "granularitySeconds": 300},
1500-
"limit": 30,
1501-
"scope": "project",
1502-
}
1503-
}
1504-
],
1505-
)
1506-
1507-
with override_options(options):
1508-
project_cfg = get_project_config(default_project)
1509-
1510-
cfg = project_cfg.to_dict()
1511-
_validate_project_config(cfg["config"])
1512-
1513-
assert cfg["config"]["metrics"]["cardinalityLimits"] == [
1514-
{
1515-
"id": "test1",
1516-
"window": {"windowSeconds": 3000, "granularitySeconds": 300},
1517-
"limit": 30,
1518-
"scope": "project",
1519-
}
1520-
]
1521-
1522-
1523-
@django_db_all
1524-
@cell_silo_test
1525-
def test_project_config_cardinality_limits_organization_options_override_options(
1526-
default_project,
1527-
) -> None:
1528-
options: dict[Any, Any] = {
1529-
"relay.cardinality-limiter.mode": "enabled",
1530-
"sentry-metrics.cardinality-limiter.limits.transactions.per-org": None,
1531-
"sentry-metrics.cardinality-limiter.limits.sessions.per-org": None,
1532-
"sentry-metrics.cardinality-limiter.limits.spans.per-org": None,
1533-
"sentry-metrics.cardinality-limiter.limits.custom.per-org": None,
1534-
"sentry-metrics.cardinality-limiter.limits.generic-metrics.per-org": None,
1535-
"sentry-metrics.cardinality-limiter.limits.profiles.per-org": None,
1536-
}
1537-
1538-
options["relay.cardinality-limiter.limits"] = [
1539-
{
1540-
"limit": {
1541-
"id": "test1",
1542-
"window": {"windowSeconds": 1000, "granularitySeconds": 100},
1543-
"limit": 10,
1544-
"scope": "name",
1545-
},
1546-
},
1547-
]
1548-
1549-
default_project.organization.update_option(
1550-
"relay.cardinality-limiter.limits",
1551-
[
1552-
{
1553-
"limit": {
1554-
"id": "test1",
1555-
"window": {"windowSeconds": 2000, "granularitySeconds": 200},
1556-
"limit": 20,
1557-
"scope": "project",
1558-
}
1559-
}
1560-
],
1561-
)
1562-
1563-
with override_options(options):
1564-
project_cfg = get_project_config(default_project)
1565-
1566-
cfg = project_cfg.to_dict()
1567-
_validate_project_config(cfg["config"])
1568-
1569-
assert cfg["config"]["metrics"]["cardinalityLimits"] == [
1570-
{
1571-
"id": "test1",
1572-
"window": {"windowSeconds": 2000, "granularitySeconds": 200},
1573-
"limit": 20,
1574-
"scope": "project",
1575-
}
1576-
]
1577-
1578-
15791355
@django_db_all
15801356
@cell_silo_test
15811357
def test_project_config_with_generic_filters(default_project) -> None:

0 commit comments

Comments
 (0)