@@ -8,13 +8,15 @@ use logs::*;
88use trace:: * ;
99
1010use std:: net:: SocketAddr ;
11+ use std:: time:: { Duration , Instant } ;
1112
1213use futures:: StreamExt ;
1314use opentelemetry:: trace:: TracerProvider ;
1415use opentelemetry_otlp:: WithExportConfig ;
1516use opentelemetry_proto:: tonic:: collector:: logs:: v1:: logs_service_server:: LogsServiceServer ;
1617use opentelemetry_proto:: tonic:: collector:: trace:: v1:: trace_service_server:: TraceServiceServer ;
17- use std:: sync:: mpsc;
18+ use tokio:: sync:: mpsc;
19+ use tokio:: sync:: mpsc:: Receiver ;
1820use tokio_stream:: wrappers:: TcpListenerStream ;
1921use tracing:: debug;
2022
@@ -37,8 +39,8 @@ impl FakeCollectorServer {
3739 s
3840 } ) ;
3941
40- let ( req_tx, req_rx) = mpsc:: sync_channel :: < ExportedSpan > ( 1024 ) ;
41- let ( log_tx, log_rx) = mpsc:: sync_channel :: < ExportedLog > ( 1024 ) ;
42+ let ( req_tx, req_rx) = mpsc:: channel :: < ExportedSpan > ( 64 ) ;
43+ let ( log_tx, log_rx) = mpsc:: channel :: < ExportedLog > ( 64 ) ;
4244 let trace_service = TraceServiceServer :: new ( FakeTraceService :: new ( req_tx) ) ;
4345 let logs_service = LogsServiceServer :: new ( FakeLogsService :: new ( log_tx) ) ;
4446 let handle = tokio:: task:: spawn ( async move {
@@ -67,19 +69,31 @@ impl FakeCollectorServer {
6769 format ! ( "http://{}" , self . address( ) ) //Devskim: ignore DS137138)
6870 }
6971
70- pub fn exported_spans ( & self ) -> Vec < ExportedSpan > {
71- std:: iter:: from_fn ( || self . req_rx . try_recv ( ) . ok ( ) ) . collect :: < Vec < _ > > ( )
72+ pub async fn exported_spans (
73+ & mut self ,
74+ at_least : usize ,
75+ timeout : Duration ,
76+ ) -> Vec < ExportedSpan > {
77+ recv_many ( & mut self . req_rx , at_least, timeout) . await
7278 }
7379
74- pub fn exported_logs ( & self ) -> Vec < ExportedLog > {
75- std :: iter :: from_fn ( || self . log_rx . try_recv ( ) . ok ( ) ) . collect :: < Vec < _ > > ( )
80+ pub async fn exported_logs ( & mut self , at_least : usize , timeout : Duration ) -> Vec < ExportedLog > {
81+ recv_many ( & mut self . log_rx , at_least , timeout ) . await
7682 }
7783
7884 pub fn abort ( self ) {
7985 self . handle . abort ( )
8086 }
8187}
8288
89+ async fn recv_many < T > ( rx : & mut Receiver < T > , at_least : usize , timeout : Duration ) -> Vec < T > {
90+ let deadline = Instant :: now ( ) ;
91+ while rx. len ( ) < at_least && deadline. elapsed ( ) < timeout {
92+ tokio:: time:: sleep ( timeout / 5 ) . await ;
93+ }
94+ std:: iter:: from_fn ( || rx. try_recv ( ) . ok ( ) ) . collect :: < Vec < _ > > ( )
95+ }
96+
8397pub async fn setup_tracer ( fake_server : & FakeCollectorServer ) -> opentelemetry_sdk:: trace:: Tracer {
8498 // if the environment variable is set (in test or in caller), `with_endpoint` value is ignored
8599 std:: env:: remove_var ( "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT" ) ;
@@ -119,7 +133,7 @@ mod tests {
119133
120134 #[ tokio:: test( flavor = "multi_thread" ) ]
121135 async fn test_fake_tracer_and_collector ( ) {
122- let fake_collector = FakeCollectorServer :: start ( )
136+ let mut fake_collector = FakeCollectorServer :: start ( )
123137 . await
124138 . expect ( "fake collector setup and started" ) ;
125139 let tracer = setup_tracer ( & fake_collector) . await ;
@@ -133,7 +147,9 @@ mod tests {
133147 span. end ( ) ;
134148 shutdown_tracer_provider ( ) ;
135149
136- let otel_spans = fake_collector. exported_spans ( ) ;
150+ let otel_spans = fake_collector
151+ . exported_spans ( 1 , Duration :: from_millis ( 2000 ) )
152+ . await ;
137153 //insta::assert_debug_snapshot!(otel_spans);
138154 insta:: assert_yaml_snapshot!( otel_spans, {
139155 "[].start_time_unix_nano" => "[timestamp]" ,
@@ -160,7 +176,7 @@ mod tests {
160176
161177 #[ tokio:: test( flavor = "multi_thread" ) ]
162178 async fn test_fake_logger_and_collector ( ) {
163- let fake_collector = FakeCollectorServer :: start ( )
179+ let mut fake_collector = FakeCollectorServer :: start ( )
164180 . await
165181 . expect ( "fake collector setup and started" ) ;
166182
@@ -172,7 +188,10 @@ mod tests {
172188 record. set_severity_text ( "info" . into ( ) ) ;
173189 logger. emit ( record) ;
174190
175- let otel_logs = fake_collector. exported_logs ( ) ;
191+ let otel_logs = fake_collector
192+ . exported_logs ( 1 , Duration :: from_millis ( 500 ) )
193+ . await ;
194+
176195 insta:: assert_yaml_snapshot!( otel_logs, {
177196 "[].trace_id" => insta:: dynamic_redaction( |value, _path| {
178197 assert2:: let_assert!( Some ( trace_id) = value. as_str( ) ) ;
0 commit comments