1
1
//! This module contains functionality to initialise tracing Subscribers for
2
- //! console output, and OpenTelemetry OTLP export for traces and logs.
2
+ //! console output, file output, and OpenTelemetry OTLP export for traces and logs.
3
3
//!
4
4
//! It is intended to be used by the Stackable Data Platform operators and
5
5
//! webhooks, but it should be generic enough to be used in any application.
@@ -16,6 +16,7 @@ use opentelemetry_sdk::{
16
16
use opentelemetry_semantic_conventions:: resource;
17
17
use snafu:: { ResultExt as _, Snafu } ;
18
18
use tracing:: subscriber:: SetGlobalDefaultError ;
19
+ use tracing_appender:: rolling:: { InitError , RollingFileAppender , Rotation } ;
19
20
use tracing_subscriber:: { filter:: Directive , layer:: SubscriberExt , EnvFilter , Layer , Registry } ;
20
21
21
22
use settings:: * ;
@@ -38,6 +39,9 @@ pub enum Error {
38
39
39
40
#[ snafu( display( "unable to set the global default subscriber" ) ) ]
40
41
SetGlobalDefaultSubscriber { source : SetGlobalDefaultError } ,
42
+
43
+ #[ snafu( display( "failed to initialize rolling file appender" ) ) ]
44
+ InitRollingFileAppender { source : InitError } ,
41
45
}
42
46
43
47
/// Easily initialize a set of pre-configured [`Subscriber`][1] layers.
@@ -214,6 +218,7 @@ pub enum Error {
214
218
pub struct Tracing {
215
219
service_name : & ' static str ,
216
220
console_log_settings : ConsoleLogSettings ,
221
+ file_log_settings : FileLogSettings ,
217
222
otlp_log_settings : OtlpLogSettings ,
218
223
otlp_trace_settings : OtlpTraceSettings ,
219
224
logger_provider : Option < LoggerProvider > ,
@@ -246,6 +251,29 @@ impl Tracing {
246
251
layers. push ( console_output_layer. boxed ( ) ) ;
247
252
}
248
253
254
+ if self . file_log_settings . enabled {
255
+ let env_filter_layer = env_filter_builder (
256
+ self . file_log_settings . common_settings . environment_variable ,
257
+ self . file_log_settings . default_level ,
258
+ ) ;
259
+
260
+ let file_appender = RollingFileAppender :: builder ( )
261
+ . rotation ( Rotation :: HOURLY )
262
+ . filename_prefix ( self . service_name . to_string ( ) )
263
+ . filename_suffix ( "tracing-rs.json" )
264
+ . max_log_files ( 6 )
265
+ . build ( & self . file_log_settings . file_log_dir )
266
+ . context ( InitRollingFileAppenderSnafu ) ?;
267
+
268
+ layers. push (
269
+ tracing_subscriber:: fmt:: layer ( )
270
+ . json ( )
271
+ . with_writer ( file_appender)
272
+ . with_filter ( env_filter_layer)
273
+ . boxed ( ) ,
274
+ ) ;
275
+ }
276
+
249
277
if self . otlp_log_settings . enabled {
250
278
let env_filter_layer = env_filter_builder (
251
279
self . otlp_log_settings . environment_variable ,
@@ -385,12 +413,6 @@ mod builder_state {
385
413
#[ derive( Default ) ]
386
414
pub struct PreServiceName ;
387
415
388
- /// The state before the [`EnvFilter`][1] environment variable name is set.
389
- ///
390
- /// [1]: tracing_subscriber::filter::EnvFilter
391
- #[ derive( Default ) ]
392
- pub struct PreEnvVar ;
393
-
394
416
/// The state that allows you to configure the supported [`Subscriber`][1]
395
417
/// [`Layer`][2].
396
418
///
@@ -414,6 +436,7 @@ pub struct TracingBuilder<S: BuilderState> {
414
436
console_log_settings : ConsoleLogSettings ,
415
437
otlp_log_settings : OtlpLogSettings ,
416
438
otlp_trace_settings : OtlpTraceSettings ,
439
+ file_log_settings : FileLogSettings ,
417
440
418
441
/// Allow the generic to be used (needed for impls).
419
442
_marker : std:: marker:: PhantomData < S > ,
@@ -446,6 +469,26 @@ impl TracingBuilder<builder_state::Config> {
446
469
console_log_settings : console_log_settings. into ( ) ,
447
470
otlp_log_settings : self . otlp_log_settings ,
448
471
otlp_trace_settings : self . otlp_trace_settings ,
472
+ file_log_settings : self . file_log_settings ,
473
+ _marker : self . _marker ,
474
+ }
475
+ }
476
+
477
+ /// Enable the file output tracing subscriber and set the default
478
+ /// [`LevelFilter`][1] which is overridable through the given environment
479
+ /// variable.
480
+ ///
481
+ /// [1]: tracing_subscriber::filter::LevelFilter
482
+ pub fn with_file_output (
483
+ self ,
484
+ file_log_settings : impl Into < FileLogSettings > ,
485
+ ) -> TracingBuilder < builder_state:: Config > {
486
+ TracingBuilder {
487
+ service_name : self . service_name ,
488
+ console_log_settings : self . console_log_settings ,
489
+ file_log_settings : file_log_settings. into ( ) ,
490
+ otlp_log_settings : self . otlp_log_settings ,
491
+ otlp_trace_settings : self . otlp_trace_settings ,
449
492
_marker : self . _marker ,
450
493
}
451
494
}
@@ -466,6 +509,7 @@ impl TracingBuilder<builder_state::Config> {
466
509
console_log_settings : self . console_log_settings ,
467
510
otlp_log_settings : otlp_log_settings. into ( ) ,
468
511
otlp_trace_settings : self . otlp_trace_settings ,
512
+ file_log_settings : self . file_log_settings ,
469
513
_marker : self . _marker ,
470
514
}
471
515
}
@@ -486,6 +530,7 @@ impl TracingBuilder<builder_state::Config> {
486
530
console_log_settings : self . console_log_settings ,
487
531
otlp_log_settings : self . otlp_log_settings ,
488
532
otlp_trace_settings : otlp_trace_settings. into ( ) ,
533
+ file_log_settings : self . file_log_settings ,
489
534
_marker : self . _marker ,
490
535
}
491
536
}
@@ -502,6 +547,7 @@ impl TracingBuilder<builder_state::Config> {
502
547
console_log_settings : self . console_log_settings ,
503
548
otlp_log_settings : self . otlp_log_settings ,
504
549
otlp_trace_settings : self . otlp_trace_settings ,
550
+ file_log_settings : self . file_log_settings ,
505
551
logger_provider : None ,
506
552
}
507
553
}
@@ -517,6 +563,8 @@ fn env_filter_builder(env_var: &str, default_directive: impl Into<Directive>) ->
517
563
518
564
#[ cfg( test) ]
519
565
mod test {
566
+ use std:: path:: PathBuf ;
567
+
520
568
use rstest:: rstest;
521
569
use settings:: Settings ;
522
570
use tracing:: level_filters:: LevelFilter ;
@@ -618,6 +666,14 @@ mod test {
618
666
. enabled ( true )
619
667
. build ( ) ,
620
668
)
669
+ . with_file_output (
670
+ Settings :: builder ( )
671
+ . with_environment_variable ( "ABC_FILE" )
672
+ . with_default_level ( LevelFilter :: INFO )
673
+ . enabled ( true )
674
+ . file_log_settings_builder ( PathBuf :: from ( "/abc_file_dir" ) )
675
+ . build ( ) ,
676
+ )
621
677
. with_otlp_log_exporter (
622
678
Settings :: builder ( )
623
679
. with_environment_variable ( "ABC_OTLP_LOG" )
@@ -645,6 +701,17 @@ mod test {
645
701
log_format: Default :: default ( )
646
702
}
647
703
) ;
704
+ assert_eq ! (
705
+ trace_guard. file_log_settings,
706
+ FileLogSettings {
707
+ common_settings: Settings {
708
+ enabled: true ,
709
+ environment_variable: "ABC_FILE" ,
710
+ default_level: LevelFilter :: INFO
711
+ } ,
712
+ file_log_dir: PathBuf :: from( "/abc_file_dir" )
713
+ }
714
+ ) ;
648
715
assert_eq ! (
649
716
trace_guard. otlp_log_settings,
650
717
OtlpLogSettings {
0 commit comments