From 8db23d68dd44fedb9e20f28db2bd6c8e0d1257cc Mon Sep 17 00:00:00 2001 From: Colton Allen Date: Fri, 17 Jan 2025 14:50:48 -0600 Subject: [PATCH 1/4] Use different enforcement category for replay video --- relay-server/src/utils/rate_limits.rs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/relay-server/src/utils/rate_limits.rs b/relay-server/src/utils/rate_limits.rs index c2d1ac9854..05c0a5878d 100644 --- a/relay-server/src/utils/rate_limits.rs +++ b/relay-server/src/utils/rate_limits.rs @@ -161,6 +161,9 @@ pub struct EnvelopeSummary { /// The number of replays. pub replay_quantity: usize, + /// The number of replay videos. + pub replay_video_quantity: usize, + /// The number of monitor check-ins. pub monitor_quantity: usize, @@ -236,7 +239,7 @@ impl EnvelopeSummary { DataCategory::Session => &mut self.session_quantity, DataCategory::Profile => &mut self.profile_quantity, DataCategory::Replay => &mut self.replay_quantity, - DataCategory::ReplayVideo => &mut self.replay_quantity, + DataCategory::ReplayVideo => &mut self.replay_video_quantity, DataCategory::Monitor => &mut self.monitor_quantity, DataCategory::Span => &mut self.span_quantity, DataCategory::ProfileChunk => &mut self.profile_chunk_quantity, @@ -342,6 +345,8 @@ pub struct Enforcement { pub profiles_indexed: CategoryLimit, /// The combined replay item rate limit. pub replays: CategoryLimit, + /// The combined replay video item rate limit. + pub replay_videos: CategoryLimit, /// The combined check-in item rate limit. pub check_ins: CategoryLimit, /// The combined spans rate limit. @@ -384,6 +389,7 @@ impl Enforcement { profiles, profiles_indexed, replays, + replay_videos, check_ins, spans, spans_indexed, @@ -399,6 +405,7 @@ impl Enforcement { profiles, profiles_indexed, replays, + replay_videos, check_ins, spans, spans_indexed, @@ -485,7 +492,7 @@ impl Enforcement { ItemType::Session => !self.sessions.is_active(), ItemType::Profile => !self.profiles_indexed.is_active(), ItemType::ReplayEvent => !self.replays.is_active(), - ItemType::ReplayVideo => !self.replays.is_active(), + ItemType::ReplayVideo => !self.replay_videos.is_active(), ItemType::ReplayRecording => !self.replays.is_active(), ItemType::CheckIn => !self.check_ins.is_active(), ItemType::Span | ItemType::OtelSpan | ItemType::OtelTracesData => { @@ -757,6 +764,21 @@ where rate_limits.merge(replay_limits); } + // Handle replay video. + // Remove: 2025-04-06 + if summary.replay_video_quantity > 0 { + let item_scoping = scoping.item(DataCategory::ReplayVideo); + let replay_limits = self + .check + .apply(item_scoping, summary.replay_video_quantity)?; + enforcement.replays = CategoryLimit::new( + DataCategory::ReplayVideo, + summary.replay_video_quantity, + replay_limits.longest(), + ); + rate_limits.merge(replay_limits); + } + // Handle monitor checkins. if summary.monitor_quantity > 0 { let item_scoping = scoping.item(DataCategory::Monitor); From d5f609a808c938d5a52cb838ddaf15b736212a58 Mon Sep 17 00:00:00 2001 From: Colton Allen Date: Mon, 20 Jan 2025 22:10:18 -0600 Subject: [PATCH 2/4] Update coverage --- relay-server/src/envelope.rs | 3 ++- relay-server/src/utils/rate_limits.rs | 24 +++++++++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/relay-server/src/envelope.rs b/relay-server/src/envelope.rs index e29444199c..8a099628a6 100644 --- a/relay-server/src/envelope.rs +++ b/relay-server/src/envelope.rs @@ -700,9 +700,10 @@ impl Item { ItemType::UserReport => smallvec![], ItemType::UserReportV2 => smallvec![(DataCategory::UserReportV2, 1)], ItemType::Profile => smallvec![(DataCategory::Profile, 1)], - ItemType::ReplayEvent | ItemType::ReplayRecording | ItemType::ReplayVideo => { + ItemType::ReplayEvent | ItemType::ReplayRecording => { smallvec![(DataCategory::Replay, 1)] } + ItemType::ReplayVideo => smallvec![(DataCategory::ReplayVideo, 1)], ItemType::ClientReport => smallvec![], ItemType::CheckIn => smallvec![(DataCategory::Monitor, 1)], ItemType::Span | ItemType::OtelSpan => smallvec![(DataCategory::Span, 1)], diff --git a/relay-server/src/utils/rate_limits.rs b/relay-server/src/utils/rate_limits.rs index 05c0a5878d..6fb2f164cc 100644 --- a/relay-server/src/utils/rate_limits.rs +++ b/relay-server/src/utils/rate_limits.rs @@ -1292,16 +1292,34 @@ mod tests { /// Limit replays. #[test] fn test_enforce_limit_replays() { - let mut envelope = envelope![ReplayEvent, ReplayRecording, ReplayVideo]; + let mut envelope = envelope![ReplayEvent, ReplayRecording]; let mut mock = MockLimiter::default().deny(DataCategory::Replay); let (enforcement, limits) = enforce_and_apply(&mut mock, &mut envelope, None); assert!(limits.is_limited()); assert_eq!(envelope.envelope().len(), 0); - mock.assert_call(DataCategory::Replay, 3); + mock.assert_call(DataCategory::Replay, 2); - assert_eq!(get_outcomes(enforcement), vec![(DataCategory::Replay, 3),]); + assert_eq!(get_outcomes(enforcement), vec![(DataCategory::Replay, 2),]); + } + + /// Limit replays. + #[test] + fn test_enforce_limit_replay_video() { + let mut envelope = envelope![ReplayVideo]; + + let mut mock = MockLimiter::default().deny(DataCategory::ReplayVideo); + let (enforcement, limits) = enforce_and_apply(&mut mock, &mut envelope, None); + + assert!(limits.is_limited()); + assert_eq!(envelope.envelope().len(), 0); + mock.assert_call(DataCategory::ReplayVideo, 1); + + assert_eq!( + get_outcomes(enforcement), + vec![(DataCategory::ReplayVideo, 1),] + ); } /// Limit monitor checkins. From d61cfb69177090e6c6eefc9249fe0ae21e4d7db5 Mon Sep 17 00:00:00 2001 From: Joris Bayer Date: Tue, 21 Jan 2025 15:50:19 +0100 Subject: [PATCH 3/4] fix: Assign video limit to video enforcement --- relay-server/src/utils/rate_limits.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/relay-server/src/utils/rate_limits.rs b/relay-server/src/utils/rate_limits.rs index 6fb2f164cc..7eb91c1ca8 100644 --- a/relay-server/src/utils/rate_limits.rs +++ b/relay-server/src/utils/rate_limits.rs @@ -771,7 +771,7 @@ where let replay_limits = self .check .apply(item_scoping, summary.replay_video_quantity)?; - enforcement.replays = CategoryLimit::new( + enforcement.replay_videos = CategoryLimit::new( DataCategory::ReplayVideo, summary.replay_video_quantity, replay_limits.longest(), From 9e15a67bb20f8707aaf937de2c97698f8004038f Mon Sep 17 00:00:00 2001 From: Colton Allen Date: Tue, 21 Jan 2025 09:45:59 -0600 Subject: [PATCH 4/4] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d94a89837..57da2f4cf1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## 25.1.0 +**Features**: + +- Use a separate rate-limit enforcement category for replay-video envelope items. ([#4459](https://github.com/getsentry/relay/pull/4459)) + **Internal** - Updates performance score calculation on spans and events to also store cdf values as measurements. ([#4438](https://github.com/getsentry/relay/pull/4438))