@@ -17,7 +17,7 @@ use opentelemetry_sdk::{
17
17
use opentelemetry_semantic_conventions:: resource;
18
18
use snafu:: { ResultExt as _, Snafu } ;
19
19
use tracing:: { level_filters:: LevelFilter , subscriber:: SetGlobalDefaultError } ;
20
- use tracing_subscriber:: { layer:: SubscriberExt , EnvFilter , Layer , Registry } ;
20
+ use tracing_subscriber:: { filter :: Directive , layer:: SubscriberExt , EnvFilter , Layer , Registry } ;
21
21
22
22
type Result < T , E = Error > = std:: result:: Result < T , E > ;
23
23
@@ -48,9 +48,9 @@ pub enum Error {
48
48
/// async fn main() -> Result<(), Error> {
49
49
/// let _tracing_guard = Tracing::builder()
50
50
/// .service_name("test")
51
- /// .with_console_output(LevelFilter::INFO)
52
- /// .with_otlp_log_exporter(LevelFilter::DEBUG)
53
- /// .with_otlp_trace_exporter(LevelFilter::TRACE)
51
+ /// .with_console_output("TEST_CONSOLE", LevelFilter::INFO)
52
+ /// .with_otlp_log_exporter("TEST_OTLP_LOG", LevelFilter::DEBUG)
53
+ /// .with_otlp_trace_exporter("TEST_OTLP_TRACE", LevelFilter::TRACE)
54
54
/// .build()
55
55
/// .init()?;
56
56
///
@@ -138,20 +138,22 @@ impl Tracing {
138
138
let mut layers: Vec < Box < dyn Layer < Registry > + Sync + Send > > = Vec :: new ( ) ;
139
139
140
140
if self . console_log_config . enabled {
141
- let env_filter_layer = EnvFilter :: builder ( )
142
- . with_default_directive ( self . console_log_config . level_filter . into ( ) ) // TODO (@NickLarsenNZ): support Directives
143
- . from_env_lossy ( ) ;
141
+ let env_filter_layer = env_filter_builder (
142
+ self . console_log_config . env_var ,
143
+ self . console_log_config . default_level_filter ,
144
+ ) ;
144
145
let console_output_layer =
145
146
tracing_subscriber:: fmt:: layer ( ) . with_filter ( env_filter_layer) ;
146
147
layers. push ( console_output_layer. boxed ( ) ) ;
147
148
}
148
149
149
150
if self . otlp_log_config . enabled {
150
- let env_filter_layer = EnvFilter :: builder ( )
151
- . with_default_directive ( self . otlp_log_config . level_filter . into ( ) ) // TODO (@NickLarsenNZ): support Directives
152
- . from_env_lossy ( )
153
- // TODO (@NickLarsenNZ): Remove this directive once https://github.com/open-telemetry/opentelemetry-rust/issues/761 is resolved
154
- . add_directive ( "h2=off" . parse ( ) . expect ( "invalid directive" ) ) ;
151
+ let env_filter_layer = env_filter_builder (
152
+ self . otlp_log_config . env_var ,
153
+ self . otlp_log_config . default_level_filter ,
154
+ )
155
+ // TODO (@NickLarsenNZ): Remove this directive once https://github.com/open-telemetry/opentelemetry-rust/issues/761 is resolved
156
+ . add_directive ( "h2=off" . parse ( ) . expect ( "invalid directive" ) ) ;
155
157
156
158
let log_exporter = opentelemetry_otlp:: new_exporter ( ) . tonic ( ) ;
157
159
let otel_log =
@@ -173,11 +175,12 @@ impl Tracing {
173
175
}
174
176
175
177
if self . otlp_trace_config . enabled {
176
- let env_filter_layer = EnvFilter :: builder ( )
177
- . with_default_directive ( self . otlp_trace_config . level_filter . into ( ) ) // TODO (@NickLarsenNZ): support Directives
178
- . from_env_lossy ( )
179
- // TODO (@NickLarsenNZ): Remove this directive once https://github.com/open-telemetry/opentelemetry-rust/issues/761 is resolved
180
- . add_directive ( "h2=off" . parse ( ) . expect ( "invalid directive" ) ) ;
178
+ let env_filter_layer = env_filter_builder (
179
+ self . otlp_trace_config . env_var ,
180
+ self . otlp_trace_config . default_level_filter ,
181
+ )
182
+ // TODO (@NickLarsenNZ): Remove this directive once https://github.com/open-telemetry/opentelemetry-rust/issues/761 is resolved
183
+ . add_directive ( "h2=off" . parse ( ) . expect ( "invalid directive" ) ) ;
181
184
182
185
let trace_exporter = opentelemetry_otlp:: new_exporter ( ) . tonic ( ) ;
183
186
let otel_tracer = opentelemetry_otlp:: new_pipeline ( )
@@ -186,7 +189,7 @@ impl Tracing {
186
189
. with_trace_config (
187
190
trace:: config ( )
188
191
. with_sampler ( Sampler :: AlwaysOn ) // TODO (@NickLarsenNZ): Make this configurable. See also Sampler::ParentBased
189
- . with_id_generator ( RandomIdGenerator :: default ( ) ) // TODO (@NickLarsenNZ): Is there a more appropriate ID generator?
192
+ . with_id_generator ( RandomIdGenerator :: default ( ) )
190
193
. with_resource ( Resource :: new ( vec ! [ KeyValue :: new(
191
194
resource:: SERVICE_NAME ,
192
195
self . service_name,
@@ -308,14 +311,16 @@ pub struct TracingBuilder<S: BuilderState> {
308
311
#[ derive( Clone , Debug , PartialEq ) ]
309
312
struct SubscriberConfig {
310
313
enabled : bool ,
311
- level_filter : LevelFilter ,
314
+ env_var : & ' static str ,
315
+ default_level_filter : LevelFilter ,
312
316
}
313
317
314
318
impl Default for SubscriberConfig {
315
319
fn default ( ) -> Self {
316
320
Self {
317
321
enabled : false ,
318
- level_filter : LevelFilter :: OFF ,
322
+ env_var : EnvFilter :: DEFAULT_ENV ,
323
+ default_level_filter : LevelFilter :: OFF ,
319
324
}
320
325
}
321
326
}
@@ -333,58 +338,68 @@ impl TracingBuilder<builder_state::PreServiceName> {
333
338
}
334
339
335
340
impl TracingBuilder < builder_state:: Config > {
336
- /// Enable the console output tracing subscriber, and filter the log level.
341
+ /// Enable the console output tracing subscriber and set the default
342
+ /// [`LevelFilter`] which is overridable through the given environment
343
+ /// variable.
337
344
pub fn with_console_output (
338
345
self ,
339
- level_filter : LevelFilter ,
346
+ env_var : & ' static str ,
347
+ default_level_filter : LevelFilter ,
340
348
) -> TracingBuilder < builder_state:: Config > {
341
349
TracingBuilder {
342
350
service_name : self . service_name ,
343
351
console_log_config : SubscriberConfig {
344
352
enabled : true ,
345
- level_filter,
353
+ env_var,
354
+ default_level_filter,
346
355
} ,
347
356
otlp_log_config : self . otlp_log_config ,
348
357
otlp_trace_config : self . otlp_trace_config ,
349
358
_marker : self . _marker ,
350
359
}
351
360
}
352
361
353
- /// Enable the OTLP logging subscriber, and filter the log level.
362
+ /// Enable the OTLP logging subscriber and set the default [`LevelFilter`]
363
+ /// which is overridable through the given environment variable.
354
364
///
355
365
/// You can configure the OTLP log exports through the variables defined
356
366
/// in the opentelemetry crates. See [`Tracing`].
357
367
pub fn with_otlp_log_exporter (
358
368
self ,
359
- level_filter : LevelFilter ,
369
+ env_var : & ' static str ,
370
+ default_level_filter : LevelFilter ,
360
371
) -> TracingBuilder < builder_state:: Config > {
361
372
TracingBuilder {
362
373
service_name : self . service_name ,
363
374
console_log_config : self . console_log_config ,
364
375
otlp_log_config : SubscriberConfig {
365
376
enabled : true ,
366
- level_filter,
377
+ env_var,
378
+ default_level_filter,
367
379
} ,
368
380
otlp_trace_config : self . otlp_trace_config ,
369
381
_marker : self . _marker ,
370
382
}
371
383
}
372
384
373
- /// Enable the OTLP tracing subscriber, and filter the log level.
385
+ /// Enable the OTLP tracing subscriber and set the default [`LevelFilter`]
386
+ /// which is overridable through the given environment variable.
374
387
///
375
388
/// You can configure the OTLP trace exports through the variables defined
376
389
/// in the opentelemetry crates. See [`Tracing`].
377
390
pub fn with_otlp_trace_exporter (
378
391
self ,
379
- level_filter : LevelFilter ,
392
+ env_var : & ' static str ,
393
+ default_level_filter : LevelFilter ,
380
394
) -> TracingBuilder < builder_state:: Config > {
381
395
TracingBuilder {
382
396
service_name : self . service_name ,
383
397
console_log_config : self . console_log_config ,
384
398
otlp_log_config : self . otlp_log_config ,
385
399
otlp_trace_config : SubscriberConfig {
386
400
enabled : true ,
387
- level_filter,
401
+ env_var,
402
+ default_level_filter,
388
403
} ,
389
404
_marker : self . _marker ,
390
405
}
@@ -406,6 +421,14 @@ impl TracingBuilder<builder_state::Config> {
406
421
}
407
422
}
408
423
424
+ /// Create an [`EnvFilter`] configured with the given environment variable and default [`Directive`].
425
+ fn env_filter_builder ( env_var : & str , default_directive : impl Into < Directive > ) -> EnvFilter {
426
+ EnvFilter :: builder ( )
427
+ . with_env_var ( env_var)
428
+ . with_default_directive ( default_directive. into ( ) )
429
+ . from_env_lossy ( )
430
+ }
431
+
409
432
#[ cfg( test) ]
410
433
mod test {
411
434
use super :: * ;
@@ -421,15 +444,16 @@ mod test {
421
444
fn builder_with_console_output ( ) {
422
445
let trace_guard = Tracing :: builder ( )
423
446
. service_name ( "test" )
424
- . with_console_output ( LevelFilter :: TRACE )
425
- . with_console_output ( LevelFilter :: DEBUG )
447
+ . with_console_output ( "ABC_A" , LevelFilter :: TRACE )
448
+ . with_console_output ( "ABC_B" , LevelFilter :: DEBUG )
426
449
. build ( ) ;
427
450
428
451
assert_eq ! (
429
452
trace_guard. console_log_config,
430
453
SubscriberConfig {
431
454
enabled: true ,
432
- level_filter: LevelFilter :: DEBUG
455
+ env_var: "ABC_B" ,
456
+ default_level_filter: LevelFilter :: DEBUG
433
457
}
434
458
) ;
435
459
assert ! ( !trace_guard. otlp_log_config. enabled) ;
@@ -440,30 +464,33 @@ mod test {
440
464
fn builder_with_all ( ) {
441
465
let trace_guard = Tracing :: builder ( )
442
466
. service_name ( "test" )
443
- . with_console_output ( LevelFilter :: INFO )
444
- . with_otlp_log_exporter ( LevelFilter :: DEBUG )
445
- . with_otlp_trace_exporter ( LevelFilter :: TRACE )
467
+ . with_console_output ( "ABC_CONSOLE" , LevelFilter :: INFO )
468
+ . with_otlp_log_exporter ( "ABC_OTLP_LOG" , LevelFilter :: DEBUG )
469
+ . with_otlp_trace_exporter ( "ABC_OTLP_TRACE" , LevelFilter :: TRACE )
446
470
. build ( ) ;
447
471
448
472
assert_eq ! (
449
473
trace_guard. console_log_config,
450
474
SubscriberConfig {
451
475
enabled: true ,
452
- level_filter: LevelFilter :: INFO
476
+ env_var: "ABC_CONSOLE" ,
477
+ default_level_filter: LevelFilter :: INFO
453
478
}
454
479
) ;
455
480
assert_eq ! (
456
481
trace_guard. otlp_log_config,
457
482
SubscriberConfig {
458
483
enabled: true ,
459
- level_filter: LevelFilter :: DEBUG
484
+ env_var: "ABC_OTLP_LOG" ,
485
+ default_level_filter: LevelFilter :: DEBUG
460
486
}
461
487
) ;
462
488
assert_eq ! (
463
489
trace_guard. otlp_trace_config,
464
490
SubscriberConfig {
465
491
enabled: true ,
466
- level_filter: LevelFilter :: TRACE
492
+ env_var: "ABC_OTLP_TRACE" ,
493
+ default_level_filter: LevelFilter :: TRACE
467
494
}
468
495
) ;
469
496
}
0 commit comments