From 05f69420e843d60bc9f6fed4db78c7312c6673b8 Mon Sep 17 00:00:00 2001 From: Valery Brobbey Date: Mon, 27 Oct 2025 10:44:25 -0700 Subject: [PATCH 1/3] feat(billing): add trace metric retention settings to project config --- src/sentry/quotas/base.py | 6 +++++- tests/sentry/api/endpoints/test_relay_projectconfigs.py | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/sentry/quotas/base.py b/src/sentry/quotas/base.py index 452e0862b7c17c..98eecf5ce7d29e 100644 --- a/src/sentry/quotas/base.py +++ b/src/sentry/quotas/base.py @@ -71,7 +71,11 @@ def to_object(self) -> Mapping[str, Any]: # This mirrors the Retentions struct in relay # https://github.com/getsentry/relay/blob/641e7f20cd/relay-dynamic-config/src/project.rs#L34-L45 -RETENTIONS_CONFIG_MAPPING = {DataCategory.SPAN: "span", DataCategory.LOG_BYTE: "log"} +RETENTIONS_CONFIG_MAPPING = { + DataCategory.SPAN: "span", + DataCategory.LOG_BYTE: "log", + DataCategory.TRACE_METRIC: "trace_metric", +} def build_metric_abuse_quotas() -> list[AbuseQuota]: diff --git a/tests/sentry/api/endpoints/test_relay_projectconfigs.py b/tests/sentry/api/endpoints/test_relay_projectconfigs.py index 29c3eee4b723ad..a06d1728b65761 100644 --- a/tests/sentry/api/endpoints/test_relay_projectconfigs.py +++ b/tests/sentry/api/endpoints/test_relay_projectconfigs.py @@ -175,6 +175,7 @@ def test_parse_retentions(call_endpoint, default_project): DataCategory.REPLAY: RetentionSettings(standard=11, downsampled=21), DataCategory.SPAN: RetentionSettings(standard=12, downsampled=22), DataCategory.LOG_BYTE: RetentionSettings(standard=13, downsampled=23), + DataCategory.TRACE_METRIC: RetentionSettings(standard=14, downsampled=24), } quotas_mock.get_event_retention = lambda x: 45 quotas_mock.get_downsampled_event_retention = lambda x: 90 @@ -189,6 +190,7 @@ def test_parse_retentions(call_endpoint, default_project): assert safe.get_path(cfg, "config", "retentions") == { "span": {"standard": 12, "downsampled": 22}, "log": {"standard": 13, "downsampled": 23}, + "trace_metric": {"standard": 14, "downsampled": 24}, } From 80a378a1ec26f19694980d1589134805dc23089a Mon Sep 17 00:00:00 2001 From: Valery Brobbey Date: Mon, 27 Oct 2025 12:21:32 -0700 Subject: [PATCH 2/3] make trace_metric exempt from assert_no_snakecase_key --- tests/sentry/api/endpoints/test_relay_projectconfigs.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/sentry/api/endpoints/test_relay_projectconfigs.py b/tests/sentry/api/endpoints/test_relay_projectconfigs.py index a06d1728b65761..631b0c05946baa 100644 --- a/tests/sentry/api/endpoints/test_relay_projectconfigs.py +++ b/tests/sentry/api/endpoints/test_relay_projectconfigs.py @@ -35,7 +35,9 @@ def _get_all_keys(config): def assert_no_snakecase_key(config): - assert not {x for x in _get_all_keys(config) if "-" in x or "_" in x} + exempt_keys = {"trace_metric"} + snakecase_keys = {x for x in _get_all_keys(config) if "-" in x or "_" in x} + assert not snakecase_keys - exempt_keys @pytest.fixture From c712a242e1527e8965097afe938ec35402b0015d Mon Sep 17 00:00:00 2001 From: Valery Brobbey Date: Tue, 28 Oct 2025 08:09:53 -0700 Subject: [PATCH 3/3] use camel case --- src/sentry/quotas/base.py | 2 +- tests/sentry/api/endpoints/test_relay_projectconfigs.py | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/sentry/quotas/base.py b/src/sentry/quotas/base.py index 98eecf5ce7d29e..76c32627d133b6 100644 --- a/src/sentry/quotas/base.py +++ b/src/sentry/quotas/base.py @@ -74,7 +74,7 @@ def to_object(self) -> Mapping[str, Any]: RETENTIONS_CONFIG_MAPPING = { DataCategory.SPAN: "span", DataCategory.LOG_BYTE: "log", - DataCategory.TRACE_METRIC: "trace_metric", + DataCategory.TRACE_METRIC: "traceMetric", } diff --git a/tests/sentry/api/endpoints/test_relay_projectconfigs.py b/tests/sentry/api/endpoints/test_relay_projectconfigs.py index 631b0c05946baa..e2f6b671d71a25 100644 --- a/tests/sentry/api/endpoints/test_relay_projectconfigs.py +++ b/tests/sentry/api/endpoints/test_relay_projectconfigs.py @@ -35,9 +35,7 @@ def _get_all_keys(config): def assert_no_snakecase_key(config): - exempt_keys = {"trace_metric"} - snakecase_keys = {x for x in _get_all_keys(config) if "-" in x or "_" in x} - assert not snakecase_keys - exempt_keys + assert not {x for x in _get_all_keys(config) if "-" in x or "_" in x} @pytest.fixture @@ -192,7 +190,7 @@ def test_parse_retentions(call_endpoint, default_project): assert safe.get_path(cfg, "config", "retentions") == { "span": {"standard": 12, "downsampled": 22}, "log": {"standard": 13, "downsampled": 23}, - "trace_metric": {"standard": 14, "downsampled": 24}, + "traceMetric": {"standard": 14, "downsampled": 24}, }