From b4534983992600a4ec09a8ab72c981dfd120b5dc Mon Sep 17 00:00:00 2001 From: David Herberth Date: Tue, 12 May 2026 11:14:10 +0200 Subject: [PATCH 1/8] ref(ds): Remove reservoir sampling rule --- src/sentry/dynamic_sampling/rules/utils.py | 2 +- static/gsAdmin/views/dynamicSamplingPanel.spec.tsx | 4 ++-- static/gsAdmin/views/dynamicSamplingPanel.tsx | 8 +------- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/sentry/dynamic_sampling/rules/utils.py b/src/sentry/dynamic_sampling/rules/utils.py index 8329911463ae..cebbbefacbf4 100644 --- a/src/sentry/dynamic_sampling/rules/utils.py +++ b/src/sentry/dynamic_sampling/rules/utils.py @@ -79,7 +79,7 @@ class RuleType(Enum): REVERSE_RESERVED_IDS = {value: key for key, value in RESERVED_IDS.items()} -SamplingValueType = Literal["sampleRate", "factor", "reservoir", "minimumSampleRate"] +SamplingValueType = Literal["sampleRate", "factor", "minimumSampleRate"] # (RaduW) Maybe we can split in two types, one for reservoir and one for sampleRate and factor diff --git a/static/gsAdmin/views/dynamicSamplingPanel.spec.tsx b/static/gsAdmin/views/dynamicSamplingPanel.spec.tsx index e850f1d7469f..604965013cd7 100644 --- a/static/gsAdmin/views/dynamicSamplingPanel.spec.tsx +++ b/static/gsAdmin/views/dynamicSamplingPanel.spec.tsx @@ -146,7 +146,7 @@ describe('Dynamic Sampling Panel', () => { const rule1 = { samplingValue: { - type: 'reservoir', + type: 'minimumSampleRate', limit: 100, }, type: 'transaction', @@ -163,7 +163,7 @@ describe('Dynamic Sampling Panel', () => { const rule2 = { samplingValue: { - type: 'reservoir', + type: 'minimumSampleRate', limit: 300, }, type: 'transaction', diff --git a/static/gsAdmin/views/dynamicSamplingPanel.tsx b/static/gsAdmin/views/dynamicSamplingPanel.tsx index 221f7419e70e..d5d9e657bd83 100644 --- a/static/gsAdmin/views/dynamicSamplingPanel.tsx +++ b/static/gsAdmin/views/dynamicSamplingPanel.tsx @@ -50,7 +50,7 @@ type RuleV2 = { }; id: number; samplingValue: { - type: 'factor' | 'sampleRate' | 'reservoir'; + type: 'factor' | 'sampleRate'; value: number; limit?: number; }; @@ -335,9 +335,6 @@ function DynamicSamplingRulesTable({ ) { return `${round(samplingValue.value * 100)}%`; } - if (samplingValue.type === 'reservoir') { - return '100%'; - } return `* ${round(samplingValue.value)}`; }; @@ -348,9 +345,6 @@ function DynamicSamplingRulesTable({ if (rule.samplingValue.type === 'sampleRate') { return round(rule.samplingValue.value - baseSampleRate); } - if (rule.samplingValue.type === 'reservoir') { - return 1; - } return round(rule.samplingValue.value - 1); }; From f4ead1d623a574cf92157ae0406c1a0e1da80743 Mon Sep 17 00:00:00 2001 From: David Herberth Date: Tue, 12 May 2026 11:16:27 +0200 Subject: [PATCH 2/8] add missing types --- static/gsAdmin/views/dynamicSamplingPanel.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/static/gsAdmin/views/dynamicSamplingPanel.tsx b/static/gsAdmin/views/dynamicSamplingPanel.tsx index d5d9e657bd83..a14b25e134bd 100644 --- a/static/gsAdmin/views/dynamicSamplingPanel.tsx +++ b/static/gsAdmin/views/dynamicSamplingPanel.tsx @@ -50,11 +50,11 @@ type RuleV2 = { }; id: number; samplingValue: { - type: 'factor' | 'sampleRate'; + type: 'factor' | 'sampleRate' | 'minimumSampleRate'; value: number; limit?: number; }; - type: 'trace' | 'transaction'; + type: 'trace' | 'transaction' | 'project'; timeRange?: { end: string; start: string; From 066c8b415152072c00c912f249dd24a627921205 Mon Sep 17 00:00:00 2001 From: David Herberth Date: Tue, 12 May 2026 11:22:41 +0200 Subject: [PATCH 3/8] bug bot findings --- src/sentry/dynamic_sampling/rules/utils.py | 3 --- static/gsAdmin/views/dynamicSamplingPanel.spec.tsx | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/sentry/dynamic_sampling/rules/utils.py b/src/sentry/dynamic_sampling/rules/utils.py index cebbbefacbf4..415e66851f18 100644 --- a/src/sentry/dynamic_sampling/rules/utils.py +++ b/src/sentry/dynamic_sampling/rules/utils.py @@ -82,9 +82,6 @@ class RuleType(Enum): SamplingValueType = Literal["sampleRate", "factor", "minimumSampleRate"] -# (RaduW) Maybe we can split in two types, one for reservoir and one for sampleRate and factor -# Wanted to do this but couldn't think of three good names for the types (SamplingValue, ReservoirSamplingValue and ? -# some type name for the old SamplingValue type) class SamplingValue(TypedDict): type: SamplingValueType value: NotRequired[float] diff --git a/static/gsAdmin/views/dynamicSamplingPanel.spec.tsx b/static/gsAdmin/views/dynamicSamplingPanel.spec.tsx index 604965013cd7..6bf0d64887a3 100644 --- a/static/gsAdmin/views/dynamicSamplingPanel.spec.tsx +++ b/static/gsAdmin/views/dynamicSamplingPanel.spec.tsx @@ -147,7 +147,7 @@ describe('Dynamic Sampling Panel', () => { const rule1 = { samplingValue: { type: 'minimumSampleRate', - limit: 100, + value: 1, }, type: 'transaction', id: 3005, @@ -164,7 +164,7 @@ describe('Dynamic Sampling Panel', () => { const rule2 = { samplingValue: { type: 'minimumSampleRate', - limit: 300, + value: 0.5, }, type: 'transaction', id: 3001, From 603f403b0e152691e3a622636ff8a62fdd064d6f Mon Sep 17 00:00:00 2001 From: David Herberth Date: Tue, 12 May 2026 11:47:54 +0200 Subject: [PATCH 4/8] fix tests --- static/gsAdmin/views/dynamicSamplingPanel.spec.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/static/gsAdmin/views/dynamicSamplingPanel.spec.tsx b/static/gsAdmin/views/dynamicSamplingPanel.spec.tsx index 6bf0d64887a3..a56f91e3aeb8 100644 --- a/static/gsAdmin/views/dynamicSamplingPanel.spec.tsx +++ b/static/gsAdmin/views/dynamicSamplingPanel.spec.tsx @@ -290,8 +290,9 @@ describe('Dynamic Sampling Panel', () => { expect(timeRanges[0]).toHaveTextContent('Start:Jun 19, 2024 9:03 AM'); expect(timeRanges[0]).toHaveTextContent('End:Jun 21, 2024 9:03 AM'); - // Check that the limit is displayed if available - const limits = screen.queryAllByTestId('limit'); - expect(limits[0]).toHaveTextContent('Limit:100'); + // Check that minimum sample rate values are displayed. + expect(screen.getAllByText('Minimum Sample Rate')).toHaveLength(2); + expect(screen.getByText('50%')).toBeInTheDocument(); + expect(screen.getAllByText('100%')).toHaveLength(3); }); }); From 731ce9d6aa3409f8b588601154134996c92f90b0 Mon Sep 17 00:00:00 2001 From: David Herberth Date: Tue, 12 May 2026 11:59:46 +0200 Subject: [PATCH 5/8] another drive by fix --- static/gsAdmin/views/dynamicSamplingPanel.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/static/gsAdmin/views/dynamicSamplingPanel.tsx b/static/gsAdmin/views/dynamicSamplingPanel.tsx index a14b25e134bd..c45d9876e7af 100644 --- a/static/gsAdmin/views/dynamicSamplingPanel.tsx +++ b/static/gsAdmin/views/dynamicSamplingPanel.tsx @@ -342,7 +342,10 @@ function DynamicSamplingRulesTable({ if (getRuleType(rule) === RuleType.BOOST_LOW_VOLUME_PROJECTS) { return 0; } - if (rule.samplingValue.type === 'sampleRate') { + if ( + rule.samplingValue.type === 'sampleRate' || + rule.samplingValue.type === 'minimumSampleRate' + ) { return round(rule.samplingValue.value - baseSampleRate); } return round(rule.samplingValue.value - 1); From 9f63dad4472b6d8d3c35b7b232b2f80734891404 Mon Sep 17 00:00:00 2001 From: David Herberth Date: Tue, 12 May 2026 13:02:36 +0200 Subject: [PATCH 6/8] unused limit field --- src/sentry/dynamic_sampling/rules/utils.py | 1 - static/gsAdmin/views/dynamicSamplingPanel.tsx | 1 - 2 files changed, 2 deletions(-) diff --git a/src/sentry/dynamic_sampling/rules/utils.py b/src/sentry/dynamic_sampling/rules/utils.py index 415e66851f18..57132f1911f7 100644 --- a/src/sentry/dynamic_sampling/rules/utils.py +++ b/src/sentry/dynamic_sampling/rules/utils.py @@ -85,7 +85,6 @@ class RuleType(Enum): class SamplingValue(TypedDict): type: SamplingValueType value: NotRequired[float] - limit: NotRequired[int] class TimeRange(TypedDict): diff --git a/static/gsAdmin/views/dynamicSamplingPanel.tsx b/static/gsAdmin/views/dynamicSamplingPanel.tsx index c45d9876e7af..83e6a349773d 100644 --- a/static/gsAdmin/views/dynamicSamplingPanel.tsx +++ b/static/gsAdmin/views/dynamicSamplingPanel.tsx @@ -52,7 +52,6 @@ type RuleV2 = { samplingValue: { type: 'factor' | 'sampleRate' | 'minimumSampleRate'; value: number; - limit?: number; }; type: 'trace' | 'transaction' | 'project'; timeRange?: { From d47adcb2600dcd65be5d9ba235833a8dc4b9ab41 Mon Sep 17 00:00:00 2001 From: David Herberth Date: Tue, 12 May 2026 17:08:38 +0200 Subject: [PATCH 7/8] limit is gone --- static/gsAdmin/views/dynamicSamplingPanel.tsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/static/gsAdmin/views/dynamicSamplingPanel.tsx b/static/gsAdmin/views/dynamicSamplingPanel.tsx index 83e6a349773d..433071045ea8 100644 --- a/static/gsAdmin/views/dynamicSamplingPanel.tsx +++ b/static/gsAdmin/views/dynamicSamplingPanel.tsx @@ -376,12 +376,6 @@ function DynamicSamplingRulesTable({ {row.type} - {defined(row.samplingValue.limit) && ( - - Limit: - {row.samplingValue.limit} - - )} {defined(row.timeRange) && (
From 62f0198a269c90f74d67ce2659b61f88b20f5ec6 Mon Sep 17 00:00:00 2001 From: David Herberth Date: Tue, 12 May 2026 17:35:03 +0200 Subject: [PATCH 8/8] typing hint --- src/sentry/dynamic_sampling/rules/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sentry/dynamic_sampling/rules/utils.py b/src/sentry/dynamic_sampling/rules/utils.py index 57132f1911f7..9b660bc3452e 100644 --- a/src/sentry/dynamic_sampling/rules/utils.py +++ b/src/sentry/dynamic_sampling/rules/utils.py @@ -84,7 +84,7 @@ class RuleType(Enum): class SamplingValue(TypedDict): type: SamplingValueType - value: NotRequired[float] + value: float class TimeRange(TypedDict):