@@ -9,7 +9,7 @@ use opentelemetry_sdk::{logs as sdklogs, Resource};
9
9
use std:: fs:: File ;
10
10
use std:: io:: Read ;
11
11
12
- fn init_logs ( ) -> Result < sdklogs:: LoggerProvider > {
12
+ fn init_logs ( is_simple : bool ) -> Result < sdklogs:: LoggerProvider > {
13
13
let exporter_builder = LogExporter :: builder ( ) ;
14
14
#[ cfg( feature = "tonic-client" ) ]
15
15
let exporter_builder = exporter_builder. with_tonic ( ) ;
@@ -23,14 +23,22 @@ fn init_logs() -> Result<sdklogs::LoggerProvider> {
23
23
24
24
let exporter = exporter_builder. build ( ) ?;
25
25
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
28
34
. with_resource (
29
35
Resource :: builder_empty ( )
30
36
. with_service_name ( "logs-integration-test" )
31
37
. build ( ) ,
32
38
)
33
- . build ( ) )
39
+ . build ( ) ;
40
+
41
+ Ok ( logger_provider)
34
42
}
35
43
36
44
#[ cfg( test) ]
@@ -99,7 +107,7 @@ mod logtests {
99
107
use crate :: { assert_logs_results, init_logs} ;
100
108
test_utils:: start_collector_container ( ) . await ?;
101
109
102
- let logger_provider = init_logs ( ) . unwrap ( ) ;
110
+ let logger_provider = init_logs ( false ) . unwrap ( ) ;
103
111
let layer = OpenTelemetryTracingBridge :: new ( & logger_provider) ;
104
112
let subscriber = tracing_subscriber:: registry ( ) . with ( layer) ;
105
113
// generate a random uuid and store it to expected guid
@@ -115,6 +123,49 @@ mod logtests {
115
123
Ok ( ( ) )
116
124
}
117
125
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
+
118
169
#[ test]
119
170
#[ cfg( any( feature = "tonic-client" , feature = "reqwest-blocking-client" ) ) ]
120
171
pub fn logs_batch_non_tokio_main ( ) -> Result < ( ) > {
@@ -130,7 +181,38 @@ mod logtests {
130
181
let logger_provider = rt. block_on ( async {
131
182
// While we're here setup our collector container too, as this needs tokio to run
132
183
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 )
134
216
} ) ?;
135
217
let layer = layer:: OpenTelemetryTracingBridge :: new ( & logger_provider) ;
136
218
let subscriber = tracing_subscriber:: registry ( ) . with ( layer) ;
0 commit comments