@@ -67,7 +67,9 @@ pub trait LogProcessor: Send + Sync + Debug {
67
67
fn event_enabled ( & self , level : Severity , target : & str , name : & str ) -> bool ;
68
68
69
69
/// Set the resource for the log processor.
70
- fn set_resource ( & self , _resource : & Resource ) { }
70
+ fn set_resource ( & self , _resource : & Resource ) -> LogResult < ( ) > {
71
+ Ok ( ( ) )
72
+ }
71
73
}
72
74
73
75
/// A [LogProcessor] that passes logs to the configured `LogExporter`, as soon
@@ -125,9 +127,13 @@ impl LogProcessor for SimpleLogProcessor {
125
127
}
126
128
}
127
129
128
- fn set_resource ( & self , resource : & Resource ) {
130
+ fn set_resource ( & self , resource : & Resource ) -> LogResult < ( ) > {
129
131
if let Ok ( mut exporter) = self . exporter . lock ( ) {
130
- exporter. set_resource ( resource) ;
132
+ exporter. set_resource ( resource)
133
+ } else {
134
+ Err ( LogError :: Other (
135
+ "simple logprocessor mutex poison during set_resource" . into ( ) ,
136
+ ) )
131
137
}
132
138
}
133
139
@@ -189,11 +195,16 @@ impl<R: RuntimeChannel> LogProcessor for BatchLogProcessor<R> {
189
195
. and_then ( std:: convert:: identity)
190
196
}
191
197
192
- fn set_resource ( & self , resource : & Resource ) {
198
+ fn set_resource ( & self , resource : & Resource ) -> LogResult < ( ) > {
199
+ let ( res_sender, res_receiver) = oneshot:: channel ( ) ;
193
200
let resource = Arc :: new ( resource. clone ( ) ) ;
194
- let _ = self
195
- . message_sender
196
- . try_send ( BatchMessage :: SetResource ( resource) ) ;
201
+ self . message_sender
202
+ . try_send ( BatchMessage :: SetResource ( resource, res_sender) )
203
+ . map_err ( |err| LogError :: Other ( err. into ( ) ) ) ?;
204
+
205
+ futures_executor:: block_on ( res_receiver)
206
+ . map_err ( |err| LogError :: Other ( err. into ( ) ) )
207
+ . and_then ( std:: convert:: identity)
197
208
}
198
209
}
199
210
@@ -275,8 +286,14 @@ impl<R: RuntimeChannel> BatchLogProcessor<R> {
275
286
}
276
287
277
288
// propagate the resource
278
- BatchMessage :: SetResource ( resource) => {
279
- exporter. set_resource ( & resource) ;
289
+ BatchMessage :: SetResource ( resource, res_sender) => {
290
+ let result = exporter. set_resource ( & resource) ;
291
+ if let Err ( result) = res_sender. send ( result) {
292
+ global:: handle_error ( LogError :: from ( format ! (
293
+ "failed to send set resource result: {:?}" ,
294
+ result
295
+ ) ) ) ;
296
+ }
280
297
}
281
298
}
282
299
}
@@ -500,7 +517,7 @@ enum BatchMessage {
500
517
/// Shut down the worker thread, push all logs in buffer to the backend.
501
518
Shutdown ( oneshot:: Sender < ExportResult > ) ,
502
519
/// Set the resource for the exporter.
503
- SetResource ( Arc < Resource > ) ,
520
+ SetResource ( Arc < Resource > , oneshot :: Sender < LogResult < ( ) > > ) ,
504
521
}
505
522
506
523
#[ cfg( all( test, feature = "testing" , feature = "logs" ) ) ]
@@ -527,7 +544,7 @@ mod tests {
527
544
use opentelemetry:: logs:: AnyValue ;
528
545
#[ cfg( feature = "logs_level_enabled" ) ]
529
546
use opentelemetry:: logs:: Severity ;
530
- use opentelemetry:: logs:: { Logger , LoggerProvider as _} ;
547
+ use opentelemetry:: logs:: { LogError , Logger , LoggerProvider as _} ;
531
548
use opentelemetry:: Key ;
532
549
use opentelemetry:: { logs:: LogResult , KeyValue } ;
533
550
use std:: borrow:: Cow ;
@@ -547,13 +564,14 @@ mod tests {
547
564
548
565
fn shutdown ( & mut self ) { }
549
566
550
- fn set_resource ( & mut self , resource : & Resource ) {
551
- self . resource
552
- . lock ( )
553
- . map ( |mut res_opt| {
567
+ fn set_resource ( & mut self , resource : & Resource ) -> LogResult < ( ) > {
568
+ match self . resource . lock ( ) {
569
+ Ok ( mut res_opt) => {
554
570
res_opt. replace ( resource. clone ( ) ) ;
555
- } )
556
- . expect ( "mock log exporter shouldn't error when setting resource" ) ;
571
+ Ok ( ( ) )
572
+ }
573
+ Err ( _) => Err ( LogError :: Other ( "mock log exporter mutex poison" . into ( ) ) ) ,
574
+ }
557
575
}
558
576
}
559
577
0 commit comments