@@ -9,7 +9,7 @@ use opentelemetry_sdk::{logs as sdklogs, Resource};
99use std:: fs:: File ;
1010use std:: io:: Read ;
1111
12- fn init_logs ( ) -> Result < sdklogs:: LoggerProvider > {
12+ fn init_logs ( is_simple : bool ) -> Result < sdklogs:: LoggerProvider > {
1313 let exporter_builder = LogExporter :: builder ( ) ;
1414 #[ cfg( feature = "tonic-client" ) ]
1515 let exporter_builder = exporter_builder. with_tonic ( ) ;
@@ -23,14 +23,22 @@ fn init_logs() -> Result<sdklogs::LoggerProvider> {
2323
2424 let exporter = exporter_builder. build ( ) ?;
2525
26- Ok ( LoggerProvider :: builder ( )
27- . with_batch_exporter ( exporter)
26+ let mut logger_provider_builder = LoggerProvider :: builder ( ) ;
27+ if is_simple {
28+ logger_provider_builder = logger_provider_builder. with_simple_exporter ( exporter)
29+ } else {
30+ logger_provider_builder = logger_provider_builder. with_batch_exporter ( exporter)
31+ } ;
32+
33+ let logger_provider = logger_provider_builder
2834 . with_resource (
2935 Resource :: builder_empty ( )
3036 . with_service_name ( "logs-integration-test" )
3137 . build ( ) ,
3238 )
33- . build ( ) )
39+ . build ( ) ;
40+
41+ Ok ( logger_provider)
3442}
3543
3644#[ cfg( test) ]
@@ -99,7 +107,7 @@ mod logtests {
99107 use crate :: { assert_logs_results, init_logs} ;
100108 test_utils:: start_collector_container ( ) . await ?;
101109
102- let logger_provider = init_logs ( ) . unwrap ( ) ;
110+ let logger_provider = init_logs ( false ) . unwrap ( ) ;
103111 let layer = OpenTelemetryTracingBridge :: new ( & logger_provider) ;
104112 let subscriber = tracing_subscriber:: registry ( ) . with ( layer) ;
105113 // generate a random uuid and store it to expected guid
@@ -115,6 +123,49 @@ mod logtests {
115123 Ok ( ( ) )
116124 }
117125
126+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 4 ) ]
127+ #[ cfg( any( feature = "tonic-client" ) ) ]
128+ pub async fn logs_simple_tokio_multi_thread ( ) -> Result < ( ) > {
129+ logs_simple_tokio_helper ( ) . await
130+ }
131+
132+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
133+ #[ cfg( any( feature = "tonic-client" ) ) ]
134+ pub async fn logs_simple_tokio_multi_with_one_worker ( ) -> Result < ( ) > {
135+ logs_simple_tokio_helper ( ) . await
136+ }
137+
138+ // Ignored, to be investigated
139+ #[ ignore]
140+ #[ tokio:: test( flavor = "current_thread" ) ]
141+ #[ cfg( any( feature = "tonic-client" ) ) ]
142+ pub async fn logs_simple_tokio_current ( ) -> Result < ( ) > {
143+ logs_simple_tokio_helper ( ) . await
144+ }
145+
146+ async fn logs_simple_tokio_helper ( ) -> Result < ( ) > {
147+ use crate :: { assert_logs_results, init_logs} ;
148+ test_utils:: start_collector_container ( ) . await ?;
149+
150+ let logger_provider = init_logs ( true ) . unwrap ( ) ;
151+ let layer = OpenTelemetryTracingBridge :: new ( & logger_provider) ;
152+ let subscriber = tracing_subscriber:: registry ( ) . with ( layer) ;
153+ info ! ( "Tracing initialized" ) ;
154+ // generate a random uuid and store it to expected guid
155+ let expected_uuid = Uuid :: new_v4 ( ) . to_string ( ) ;
156+ {
157+ let _guard = tracing:: subscriber:: set_default ( subscriber) ;
158+ info ! ( "Tracing subscriber initialized" ) ;
159+ info ! ( target: "my-target" , uuid = expected_uuid, "hello from {}. My price is {}." , "banana" , 2.99 ) ;
160+ info ! ( "Log emitted" ) ;
161+ }
162+
163+ let _ = logger_provider. shutdown ( ) ;
164+ tokio:: time:: sleep ( Duration :: from_secs ( 5 ) ) . await ;
165+ assert_logs_results ( test_utils:: LOGS_FILE , expected_uuid. as_str ( ) ) ?;
166+ Ok ( ( ) )
167+ }
168+
118169 #[ test]
119170 #[ cfg( any( feature = "tonic-client" , feature = "reqwest-blocking-client" ) ) ]
120171 pub fn logs_batch_non_tokio_main ( ) -> Result < ( ) > {
@@ -130,7 +181,38 @@ mod logtests {
130181 let logger_provider = rt. block_on ( async {
131182 // While we're here setup our collector container too, as this needs tokio to run
132183 test_utils:: start_collector_container ( ) . await ?;
133- init_logs ( )
184+ init_logs ( false )
185+ } ) ?;
186+ let layer = layer:: OpenTelemetryTracingBridge :: new ( & logger_provider) ;
187+ let subscriber = tracing_subscriber:: registry ( ) . with ( layer) ;
188+ // generate a random uuid and store it to expected guid
189+ let expected_uuid = Uuid :: new_v4 ( ) . to_string ( ) ;
190+ {
191+ let _guard = tracing:: subscriber:: set_default ( subscriber) ;
192+ info ! ( target: "my-target" , uuid = expected_uuid, "hello from {}. My price is {}." , "banana" , 2.99 ) ;
193+ }
194+
195+ let _ = logger_provider. shutdown ( ) ;
196+ std:: thread:: sleep ( Duration :: from_secs ( 5 ) ) ;
197+ assert_logs_results ( test_utils:: LOGS_FILE , expected_uuid. as_str ( ) ) ?;
198+ Ok ( ( ) )
199+ }
200+
201+ #[ test]
202+ #[ cfg( any( feature = "tonic-client" , feature = "reqwest-blocking-client" ) ) ]
203+ pub fn logs_simple_non_tokio_main ( ) -> Result < ( ) > {
204+ logs_simple_non_tokio_helper ( )
205+ }
206+
207+ fn logs_simple_non_tokio_helper ( ) -> Result < ( ) > {
208+ // Initialize the logger provider inside a tokio runtime
209+ // as this allows tonic client to capture the runtime,
210+ // but actual export occurs from the main non-tokio thread.
211+ let rt = tokio:: runtime:: Runtime :: new ( ) ?;
212+ let logger_provider = rt. block_on ( async {
213+ // While we're here setup our collector container too, as this needs tokio to run
214+ test_utils:: start_collector_container ( ) . await ?;
215+ init_logs ( true )
134216 } ) ?;
135217 let layer = layer:: OpenTelemetryTracingBridge :: new ( & logger_provider) ;
136218 let subscriber = tracing_subscriber:: registry ( ) . with ( layer) ;
0 commit comments