@@ -213,6 +213,8 @@ mod tests {
213213 use vector_lib:: { event:: Value , lookup:: OwnedTargetPath } ;
214214 use vrl:: value:: kind:: Collection ;
215215
216+ use serial_test:: serial;
217+
216218 use super :: * ;
217219 use crate :: {
218220 event:: Event ,
@@ -234,6 +236,7 @@ mod tests {
234236 // cases because `consume_early_buffer` (called within the
235237 // `start_source` helper) panics when called more than once.
236238 #[ tokio:: test]
239+ #[ serial]
237240 async fn receives_logs ( ) {
238241 trace:: init ( false , false , "debug" , 10 ) ;
239242 trace:: reset_early_buffer ( ) ;
@@ -341,6 +344,43 @@ mod tests {
341344 rx
342345 }
343346
347+ // NOTE: This test requires #[serial] because it directly interacts with global tracing state.
348+ // This is a pre-existing limitation around tracing initialization in tests.
349+ #[ tokio:: test]
350+ #[ serial]
351+ async fn repeated_logs_are_not_rate_limited ( ) {
352+ trace:: init ( false , false , "info" , 10 ) ;
353+ trace:: reset_early_buffer ( ) ;
354+
355+ let rx = start_source ( ) . await ;
356+
357+ // Generate 20 identical log messages with the same component_id
358+ for _ in 0 ..20 {
359+ info ! ( component_id = "test" , "Repeated test message." ) ;
360+ }
361+
362+ sleep ( Duration :: from_millis ( 50 ) ) . await ;
363+ let events = collect_ready ( rx) . await ;
364+
365+ // Filter to only our test messages
366+ let test_events: Vec < _ > = events
367+ . iter ( )
368+ . filter ( |e| {
369+ e. as_log ( )
370+ . get ( "message" )
371+ . map ( |m| m. to_string_lossy ( ) == "Repeated test message." )
372+ . unwrap_or ( false )
373+ } )
374+ . collect ( ) ;
375+
376+ // We should receive all 20 messages, no rate limiting.
377+ assert_eq ! (
378+ test_events. len( ) ,
379+ 20 ,
380+ "internal_logs source should capture all repeated messages without rate limiting"
381+ ) ;
382+ }
383+
344384 #[ test]
345385 fn output_schema_definition_vector_namespace ( ) {
346386 let config = InternalLogsConfig :: default ( ) ;
0 commit comments