stackable_telemetry/tracing/settings/
mod.rs

1//! Subscriber settings.
2
3use std::path::Path;
4
5use tracing::level_filters::LevelFilter;
6
7pub mod console_log;
8pub use console_log::*;
9
10pub mod file_log;
11pub use file_log::*;
12
13pub mod otlp_log;
14pub use otlp_log::*;
15
16pub mod otlp_trace;
17pub use otlp_trace::*;
18
19/// Indicate whether a type is enabled or disabled.
20pub trait SettingsToggle {
21    /// Whether the settings are enabled or not.
22    fn is_enabled(&self) -> bool;
23
24    /// The opposite of [SettingsToggle::is_enabled] as a helper.
25    fn is_disabled(&self) -> bool {
26        !self.is_enabled()
27    }
28}
29
30/// General settings that apply to any subscriber.
31#[derive(Debug, PartialEq)]
32pub struct Settings {
33    /// The environment variable used to set the [`LevelFilter`].
34    ///
35    /// When the environment variable is set, it will override what is set by
36    /// [`Self::default_level`].
37    pub environment_variable: &'static str,
38
39    /// The [`LevelFilter`] to fallback to if [`Self::environment_variable`] has
40    /// not been set.
41    pub default_level: LevelFilter,
42}
43
44impl Settings {
45    /// Builder methods to override defaults.
46    pub fn builder() -> SettingsBuilder {
47        SettingsBuilder::default()
48    }
49}
50
51impl Default for Settings {
52    fn default() -> Self {
53        SettingsBuilder::default().build()
54    }
55}
56
57/// For building [`Settings`].
58pub struct SettingsBuilder {
59    environment_variable: &'static str,
60    default_level: LevelFilter,
61}
62
63impl SettingsBuilder {
64    /// Set the environment variable used for overriding the [`Settings::default_level`].
65    ///
66    /// Defaults to `RUST_LOG`.
67    // TODO (@NickLarsenNZ): set a constant for the default environment variable.
68    pub fn with_environment_variable(mut self, name: &'static str) -> Self {
69        self.environment_variable = name;
70        self
71    }
72
73    /// Set the default [`LevelFilter`].
74    ///
75    /// Defaults to [`LevelFilter::OFF`].
76    // TODO (@NickLarsenNZ): set a constant for the default level.
77    pub fn with_default_level(mut self, level: impl Into<LevelFilter>) -> Self {
78        self.default_level = level.into();
79        self
80    }
81
82    /// Set specific [`ConsoleLogSettings`].
83    pub fn console_log_settings_builder(self) -> ConsoleLogSettingsBuilder {
84        self.into()
85    }
86
87    /// Set specific [`FileLogSettings`].
88    pub fn file_log_settings_builder(
89        self,
90        path: impl AsRef<Path>,
91        filename_suffix: impl Into<String>,
92    ) -> FileLogSettingsBuilder {
93        FileLogSettingsBuilder {
94            common_settings: self.build(),
95            file_log_dir: path.as_ref().to_path_buf(),
96            rotation_period: Rotation::NEVER,
97            filename_suffix: filename_suffix.into(),
98            max_log_files: None,
99        }
100    }
101
102    /// Set specific [`OtlpLogSettings`].
103    pub fn otlp_log_settings_builder(self) -> OtlpLogSettingsBuilder {
104        self.into()
105    }
106
107    /// Set specific [`OtlpTraceSettings`].
108    pub fn otlp_trace_settings_builder(self) -> OtlpTraceSettingsBuilder {
109        self.into()
110    }
111
112    /// Consumes self and constructs valid [`Settings`].
113    pub fn build(self) -> Settings {
114        Settings {
115            environment_variable: self.environment_variable,
116            default_level: self.default_level,
117        }
118    }
119}
120
121impl Default for SettingsBuilder {
122    fn default() -> Self {
123        Self {
124            environment_variable: "RUST_LOG",
125            default_level: LevelFilter::OFF,
126        }
127    }
128}
129
130#[cfg(test)]
131mod test {
132    use super::*;
133
134    #[test]
135    fn builds_settings() {
136        let expected = Settings {
137            environment_variable: "hello",
138            default_level: LevelFilter::DEBUG,
139        };
140        let result = Settings::builder()
141            .with_environment_variable("hello")
142            .with_default_level(LevelFilter::DEBUG)
143            .build();
144
145        assert_eq!(expected, result);
146    }
147}