diff --git a/crates/stackable-telemetry/CHANGELOG.md b/crates/stackable-telemetry/CHANGELOG.md index a58913d43..a7935073a 100644 --- a/crates/stackable-telemetry/CHANGELOG.md +++ b/crates/stackable-telemetry/CHANGELOG.md @@ -8,16 +8,23 @@ All notable changes to this project will be documented in this file. ### Added +- Allow `Option<_>` to be used to enable/disable a subscriber ([#951]). - Introduce common `Settings` and subscriber specific settings ([#901]). - Add support for logging to files ([#933]). ### Changed -- BREAKING: Renamed `TracingBuilder` methods with long names, and prefix with `with_` ([#901]). +- BREAKING: Change subscriber settings into an enum to indicate if the subscriber is enabled/disabled ([#951]). +- BREAKING: Rename `TracingBuilder` methods with long names, and prefix with `with_` ([#901]). - BREAKING: Use the new subscriber settings in the `TracingBuilder` ([#901]). +### Removed + +- BREAKING: Remove `Deref` impls for subscriber settings and removed the `enabled` fields and `enabled()` methods ([#951]). + [#901]: https://github.com/stackabletech/operator-rs/pull/901 [#933]: https://github.com/stackabletech/operator-rs/pull/933 +[#951]: https://github.com/stackabletech/operator-rs/pull/951 ## [0.2.0] - 2024-07-10 diff --git a/crates/stackable-telemetry/src/tracing/mod.rs b/crates/stackable-telemetry/src/tracing/mod.rs index a4ca1c8a0..cf00503b7 100644 --- a/crates/stackable-telemetry/src/tracing/mod.rs +++ b/crates/stackable-telemetry/src/tracing/mod.rs @@ -134,6 +134,7 @@ pub enum Error { /// # use tracing_subscriber::filter::LevelFilter; /// #[tokio::main] /// async fn main() -> Result<(), Error> { +/// // Control the otlp_log subscriber at runtime /// let otlp_log_flag = false; /// /// let _tracing_guard = Tracing::builder() @@ -142,21 +143,25 @@ pub enum Error { /// Settings::builder() /// .with_environment_variable("TEST_CONSOLE") /// .with_default_level(LevelFilter::INFO) -/// .enabled(true) /// .build() /// ) -/// .with_otlp_log_exporter( +/// .with_file_output( +/// Settings::builder() +/// .with_environment_variable("TEST_FILE_LOG") +/// .with_default_level(LevelFilter::INFO) +/// .file_log_settings_builder("/tmp/logs") +/// .build() +/// ) +/// .with_otlp_log_exporter(otlp_log_flag.then(|| { /// Settings::builder() /// .with_environment_variable("TEST_OTLP_LOG") /// .with_default_level(LevelFilter::DEBUG) -/// .enabled(otlp_log_flag) /// .build() -/// ) +/// })) /// .with_otlp_trace_exporter( /// Settings::builder() /// .with_environment_variable("TEST_OTLP_TRACE") /// .with_default_level(LevelFilter::TRACE) -/// .enabled(true) /// .build() /// ) /// .build() @@ -253,22 +258,28 @@ impl Tracing { pub fn init(mut self) -> Result { let mut layers: Vec + Sync + Send>> = Vec::new(); - if self.console_log_settings.enabled { + if let ConsoleLogSettings::Enabled { + common_settings, + log_format: _, + } = &self.console_log_settings + { let env_filter_layer = env_filter_builder( - self.console_log_settings - .common_settings - .environment_variable, - self.console_log_settings.default_level, + common_settings.environment_variable, + common_settings.default_level, ); let console_output_layer = tracing_subscriber::fmt::layer().with_filter(env_filter_layer); layers.push(console_output_layer.boxed()); } - if self.file_log_settings.enabled { + if let FileLogSettings::Enabled { + common_settings, + file_log_dir, + } = &self.file_log_settings + { let env_filter_layer = env_filter_builder( - self.file_log_settings.common_settings.environment_variable, - self.file_log_settings.default_level, + common_settings.environment_variable, + common_settings.default_level, ); let file_appender = RollingFileAppender::builder() @@ -276,7 +287,7 @@ impl Tracing { .filename_prefix(self.service_name.to_string()) .filename_suffix("tracing-rs.json") .max_log_files(6) - .build(&self.file_log_settings.file_log_dir) + .build(file_log_dir) .context(InitRollingFileAppenderSnafu)?; layers.push( @@ -288,10 +299,10 @@ impl Tracing { ); } - if self.otlp_log_settings.enabled { + if let OtlpLogSettings::Enabled { common_settings } = &self.otlp_log_settings { let env_filter_layer = env_filter_builder( - self.otlp_log_settings.environment_variable, - self.otlp_log_settings.default_level, + common_settings.environment_variable, + common_settings.default_level, ) // TODO (@NickLarsenNZ): Remove this directive once https://github.com/open-telemetry/opentelemetry-rust/issues/761 is resolved .add_directive("h2=off".parse().expect("invalid directive")); @@ -316,12 +327,11 @@ impl Tracing { self.logger_provider = Some(otel_log); } - if self.otlp_trace_settings.enabled { + if let OtlpTraceSettings::Enabled { common_settings } = &self.otlp_trace_settings { let env_filter_layer = env_filter_builder( - self.otlp_trace_settings - .common_settings - .environment_variable, - self.otlp_trace_settings.default_level, + // todo, deref? + common_settings.environment_variable, + common_settings.default_level, ) // TODO (@NickLarsenNZ): Remove this directive once https://github.com/open-telemetry/opentelemetry-rust/issues/761 is resolved .add_directive("h2=off".parse().expect("invalid directive")); @@ -369,12 +379,12 @@ impl Tracing { impl Drop for Tracing { fn drop(&mut self) { tracing::debug!( - opentelemetry.tracing.enabled = self.otlp_trace_settings.enabled, - opentelemetry.logger.enabled = self.otlp_log_settings.enabled, + opentelemetry.tracing.enabled = self.otlp_trace_settings.is_enabled(), + opentelemetry.logger.enabled = self.otlp_log_settings.is_enabled(), "shutting down opentelemetry OTLP providers" ); - if self.otlp_trace_settings.enabled { + if self.otlp_trace_settings.is_enabled() { // NOTE (@NickLarsenNZ): This might eventually be replaced with something like SdkMeterProvider::shutdown(&self) // as has been done with the LoggerProvider (further below) // see: https://github.com/open-telemetry/opentelemetry-rust/pull/1412/files#r1409608679 @@ -448,9 +458,9 @@ impl BuilderState for builder_state::Config {} pub struct TracingBuilder { service_name: Option<&'static str>, console_log_settings: ConsoleLogSettings, + file_log_settings: FileLogSettings, otlp_log_settings: OtlpLogSettings, otlp_trace_settings: OtlpTraceSettings, - file_log_settings: FileLogSettings, /// Allow the generic to be used (needed for impls). _marker: std::marker::PhantomData, @@ -600,31 +610,30 @@ mod test { Settings::builder() .with_environment_variable("ABC_A") .with_default_level(LevelFilter::TRACE) - .enabled(true) .build(), ) .with_console_output( Settings::builder() .with_environment_variable("ABC_B") .with_default_level(LevelFilter::DEBUG) - .enabled(true) .build(), ) .build(); assert_eq!( trace_guard.console_log_settings, - ConsoleLogSettings { + ConsoleLogSettings::Enabled { common_settings: Settings { - enabled: true, environment_variable: "ABC_B", default_level: LevelFilter::DEBUG }, log_format: Default::default() } ); - assert!(!trace_guard.otlp_log_settings.enabled); - assert!(!trace_guard.otlp_trace_settings.enabled); + + assert!(trace_guard.file_log_settings.is_disabled()); + assert!(trace_guard.otlp_log_settings.is_disabled()); + assert!(trace_guard.otlp_trace_settings.is_disabled()); } #[test] @@ -636,11 +645,10 @@ mod test { assert_eq!( trace_guard.console_log_settings, - ConsoleLogSettings { + ConsoleLogSettings::Enabled { common_settings: Settings { environment_variable: "ABC_A", default_level: LevelFilter::TRACE, - enabled: true }, log_format: Default::default() } @@ -656,17 +664,18 @@ mod test { .with_console_output(("ABC_A", LevelFilter::TRACE, enabled)) .build(); - assert_eq!( - trace_guard.console_log_settings, - ConsoleLogSettings { + let expected = match enabled { + true => ConsoleLogSettings::Enabled { common_settings: Settings { environment_variable: "ABC_A", default_level: LevelFilter::TRACE, - enabled }, - log_format: Default::default() - } - ) + log_format: Default::default(), + }, + false => ConsoleLogSettings::Disabled, + }; + + assert_eq!(trace_guard.console_log_settings, expected) } #[test] @@ -677,14 +686,12 @@ mod test { Settings::builder() .with_environment_variable("ABC_CONSOLE") .with_default_level(LevelFilter::INFO) - .enabled(true) .build(), ) .with_file_output( Settings::builder() .with_environment_variable("ABC_FILE") .with_default_level(LevelFilter::INFO) - .enabled(true) .file_log_settings_builder(PathBuf::from("/abc_file_dir")) .build(), ) @@ -692,23 +699,20 @@ mod test { Settings::builder() .with_environment_variable("ABC_OTLP_LOG") .with_default_level(LevelFilter::DEBUG) - .enabled(true) .build(), ) .with_otlp_trace_exporter( Settings::builder() .with_environment_variable("ABC_OTLP_TRACE") .with_default_level(LevelFilter::TRACE) - .enabled(true) .build(), ) .build(); assert_eq!( trace_guard.console_log_settings, - ConsoleLogSettings { + ConsoleLogSettings::Enabled { common_settings: Settings { - enabled: true, environment_variable: "ABC_CONSOLE", default_level: LevelFilter::INFO }, @@ -717,9 +721,8 @@ mod test { ); assert_eq!( trace_guard.file_log_settings, - FileLogSettings { + FileLogSettings::Enabled { common_settings: Settings { - enabled: true, environment_variable: "ABC_FILE", default_level: LevelFilter::INFO }, @@ -728,9 +731,8 @@ mod test { ); assert_eq!( trace_guard.otlp_log_settings, - OtlpLogSettings { + OtlpLogSettings::Enabled { common_settings: Settings { - enabled: true, environment_variable: "ABC_OTLP_LOG", default_level: LevelFilter::DEBUG }, @@ -738,13 +740,50 @@ mod test { ); assert_eq!( trace_guard.otlp_trace_settings, - OtlpTraceSettings { + OtlpTraceSettings::Enabled { common_settings: Settings { - enabled: true, environment_variable: "ABC_OTLP_TRACE", default_level: LevelFilter::TRACE } } ); } + + #[test] + fn builder_with_options() { + let enable_console_output = true; + let enable_filelog_output = true; + let enable_otlp_trace = true; + let enable_otlp_log = false; + + let tracing_builder = Tracing::builder() + .service_name("test") + .with_console_output(enable_console_output.then(|| { + Settings::builder() + .with_environment_variable("ABC_CONSOLE") + .build() + })) + .with_file_output(enable_filelog_output.then(|| { + Settings::builder() + .with_environment_variable("ABC_FILELOG") + .file_log_settings_builder("/dev/null") + .build() + })) + .with_otlp_trace_exporter(enable_otlp_trace.then(|| { + Settings::builder() + .with_environment_variable("ABC_OTLP_TRACE") + .build() + })) + .with_otlp_log_exporter(enable_otlp_log.then(|| { + Settings::builder() + .with_environment_variable("ABC_OTLP_LOG") + .build() + })) + .build(); + + assert!(tracing_builder.console_log_settings.is_enabled()); + assert!(tracing_builder.file_log_settings.is_enabled()); + assert!(tracing_builder.otlp_trace_settings.is_enabled()); + assert!(tracing_builder.otlp_log_settings.is_disabled()); + } } diff --git a/crates/stackable-telemetry/src/tracing/settings/console_log.rs b/crates/stackable-telemetry/src/tracing/settings/console_log.rs index 71515d77e..469eaea7c 100644 --- a/crates/stackable-telemetry/src/tracing/settings/console_log.rs +++ b/crates/stackable-telemetry/src/tracing/settings/console_log.rs @@ -1,27 +1,24 @@ //! Console Log Subscriber Settings. -use std::ops::Deref; - use tracing::level_filters::LevelFilter; -use super::{Settings, SettingsBuilder}; +use super::{Settings, SettingsBuilder, SettingsToggle}; /// Configure specific settings for the console log subscriber. #[derive(Debug, Default, PartialEq)] -pub struct ConsoleLogSettings { - /// Common subscriber settings that apply to the console log subscriber. - pub common_settings: Settings, - - /// Console subscriber log event output format. - pub log_format: Format, -} +pub enum ConsoleLogSettings { + /// Console subscriber disabled. + #[default] + Disabled, -impl Deref for ConsoleLogSettings { - type Target = Settings; + /// Console subscriber enabled. + Enabled { + /// Common subscriber settings that apply to the Console Log Subscriber. + common_settings: Settings, - fn deref(&self) -> &Self::Target { - &self.common_settings - } + /// Console Subscriber log event output format. + log_format: Format, + }, } /// Console subscriber log event output formats. @@ -41,6 +38,15 @@ pub enum Format { // LogFmt, } +impl SettingsToggle for ConsoleLogSettings { + fn is_enabled(&self) -> bool { + match self { + ConsoleLogSettings::Disabled => false, + ConsoleLogSettings::Enabled { .. } => true, + } + } +} + /// For building [`ConsoleLogSettings`]. /// ///
@@ -60,7 +66,7 @@ impl ConsoleLogSettingsBuilder { /// Consumes `self` and builds [`ConsoleLogSettings`]. pub fn build(self) -> ConsoleLogSettings { - ConsoleLogSettings { + ConsoleLogSettings::Enabled { common_settings: self.common_settings, log_format: self.log_format, } @@ -80,35 +86,48 @@ impl From for ConsoleLogSettingsBuilder { impl From for ConsoleLogSettings { fn from(common_settings: Settings) -> Self { - ConsoleLogSettings { + ConsoleLogSettings::Enabled { common_settings, - ..Default::default() + log_format: Default::default(), + } + } +} + +impl From> for ConsoleLogSettings +where + T: Into, +{ + fn from(settings: Option) -> Self { + match settings { + Some(settings) => settings.into(), + None => ConsoleLogSettings::default(), } } } impl From<(&'static str, LevelFilter)> for ConsoleLogSettings { fn from(value: (&'static str, LevelFilter)) -> Self { - Self { + Self::Enabled { common_settings: Settings { environment_variable: value.0, default_level: value.1, - enabled: true, }, - ..Default::default() + log_format: Default::default(), } } } impl From<(&'static str, LevelFilter, bool)> for ConsoleLogSettings { fn from(value: (&'static str, LevelFilter, bool)) -> Self { - Self { - common_settings: Settings { - environment_variable: value.0, - default_level: value.1, - enabled: value.2, + match value.2 { + true => Self::Enabled { + common_settings: Settings { + environment_variable: value.0, + default_level: value.1, + }, + log_format: Default::default(), }, - ..Default::default() + false => Self::Disabled, } } } @@ -121,18 +140,16 @@ mod test { #[test] fn builds_settings() { - let expected = ConsoleLogSettings { + let expected = ConsoleLogSettings::Enabled { common_settings: Settings { environment_variable: "hello", default_level: LevelFilter::DEBUG, - enabled: true, }, log_format: Format::Plain, }; let result = Settings::builder() .with_environment_variable("hello") .with_default_level(LevelFilter::DEBUG) - .enabled(true) .console_log_settings_builder() .with_log_format(Format::Plain) // color diff --git a/crates/stackable-telemetry/src/tracing/settings/file_log.rs b/crates/stackable-telemetry/src/tracing/settings/file_log.rs index 73ccbda04..53c326c4e 100644 --- a/crates/stackable-telemetry/src/tracing/settings/file_log.rs +++ b/crates/stackable-telemetry/src/tracing/settings/file_log.rs @@ -1,24 +1,32 @@ //! File Log Subscriber Settings. -use std::{ops::Deref, path::PathBuf}; +use std::path::PathBuf; -use super::Settings; +use super::{Settings, SettingsToggle}; /// Configure specific settings for the File Log subscriber. #[derive(Debug, Default, PartialEq)] -pub struct FileLogSettings { - /// Common subscriber settings that apply to the File Log Subscriber. - pub common_settings: Settings, +pub enum FileLogSettings { + /// File Log subscriber disabled. + #[default] + Disabled, - /// Path to directory for log files. - pub file_log_dir: PathBuf, -} + /// File Log subscriber enabled. + Enabled { + /// Common subscriber settings that apply to the File Log Subscriber. + common_settings: Settings, -impl Deref for FileLogSettings { - type Target = Settings; + /// Path to directory for log files. + file_log_dir: PathBuf, + }, +} - fn deref(&self) -> &Self::Target { - &self.common_settings +impl SettingsToggle for FileLogSettings { + fn is_enabled(&self) -> bool { + match self { + FileLogSettings::Disabled => false, + FileLogSettings::Enabled { .. } => true, + } } } @@ -35,13 +43,25 @@ pub struct FileLogSettingsBuilder { impl FileLogSettingsBuilder { /// Consumes self and returns a valid [`FileLogSettings`] instance. pub fn build(self) -> FileLogSettings { - FileLogSettings { + FileLogSettings::Enabled { common_settings: self.common_settings, file_log_dir: self.file_log_dir, } } } +impl From> for FileLogSettings +where + T: Into, +{ + fn from(settings: Option) -> Self { + match settings { + Some(settings) => settings.into(), + None => FileLogSettings::default(), + } + } +} + #[cfg(test)] mod test { use tracing::level_filters::LevelFilter; @@ -50,18 +70,16 @@ mod test { #[test] fn builds_settings() { - let expected = FileLogSettings { + let expected = FileLogSettings::Enabled { common_settings: Settings { environment_variable: "hello", default_level: LevelFilter::DEBUG, - enabled: true, }, file_log_dir: PathBuf::from("/logs"), }; let result = Settings::builder() .with_environment_variable("hello") .with_default_level(LevelFilter::DEBUG) - .enabled(true) .file_log_settings_builder(PathBuf::from("/logs")) .build(); diff --git a/crates/stackable-telemetry/src/tracing/settings/mod.rs b/crates/stackable-telemetry/src/tracing/settings/mod.rs index bb5a1d4ae..cee7a9328 100644 --- a/crates/stackable-telemetry/src/tracing/settings/mod.rs +++ b/crates/stackable-telemetry/src/tracing/settings/mod.rs @@ -16,6 +16,17 @@ pub use otlp_log::*; pub mod otlp_trace; pub use otlp_trace::*; +/// Indicate whether a type is enabled or disabled. +pub trait SettingsToggle { + /// Whether the settings are enabled or not. + fn is_enabled(&self) -> bool; + + /// The opposite of [SettingsToggle::is_enabled] as a helper. + fn is_disabled(&self) -> bool { + !self.is_enabled() + } +} + /// General settings that apply to any subscriber. #[derive(Debug, PartialEq)] pub struct Settings { @@ -28,12 +39,6 @@ pub struct Settings { /// The [`LevelFilter`] to fallback to if [`Self::environment_variable`] has /// not been set. pub default_level: LevelFilter, - - /// Whether or not the subscriber is enabled. - /// - /// When set to `true`, the [`tracing::Subscriber`] will be added to the - /// [`tracing_subscriber::Layer`] list. - pub enabled: bool, } impl Settings { @@ -52,7 +57,6 @@ impl Default for Settings { /// For building [`Settings`]. pub struct SettingsBuilder { environment_variable: &'static str, - enabled: bool, default_level: LevelFilter, } @@ -75,20 +79,6 @@ impl SettingsBuilder { self } - /// Enable or disable the [`tracing::Subscriber`]. - /// - /// Defaults to `false`. - // TODO (@NickLarsenNZ): Currently this has to be called to enable the - // subscriber. Eventually it should become optional, and default to on (if - // settings are supplied). Therefore, the fields in TracingBuilder to hold - // the subscriber settings should become Option so that the subscriber is - // disabled when not configured, is enabled when configured, while still - // controllable through this function. Then this can be renamed to `with_enabled` - pub fn enabled(mut self, enabled: bool) -> Self { - self.enabled = enabled; - self - } - /// Set specific [`ConsoleLogSettings`]. pub fn console_log_settings_builder(self) -> ConsoleLogSettingsBuilder { self.into() @@ -120,7 +110,6 @@ impl SettingsBuilder { Settings { environment_variable: self.environment_variable, default_level: self.default_level, - enabled: self.enabled, } } } @@ -130,7 +119,6 @@ impl Default for SettingsBuilder { Self { environment_variable: "RUST_LOG", default_level: LevelFilter::OFF, - enabled: false, } } } @@ -144,12 +132,10 @@ mod test { let expected = Settings { environment_variable: "hello", default_level: LevelFilter::DEBUG, - enabled: true, }; let result = Settings::builder() .with_environment_variable("hello") .with_default_level(LevelFilter::DEBUG) - .enabled(true) .build(); assert_eq!(expected, result); diff --git a/crates/stackable-telemetry/src/tracing/settings/otlp_log.rs b/crates/stackable-telemetry/src/tracing/settings/otlp_log.rs index 2823d774a..c9394c513 100644 --- a/crates/stackable-telemetry/src/tracing/settings/otlp_log.rs +++ b/crates/stackable-telemetry/src/tracing/settings/otlp_log.rs @@ -1,23 +1,29 @@ //! OTLP Log Subscriber Settings. -use std::ops::Deref; - use tracing::level_filters::LevelFilter; -use super::{Settings, SettingsBuilder}; +use super::{Settings, SettingsBuilder, SettingsToggle}; /// Configure specific settings for the OpenTelemetry log subscriber. #[derive(Debug, Default, PartialEq)] -pub struct OtlpLogSettings { - /// Common subscriber settings that apply to the OpenTelemetry log subscriber. - pub common_settings: Settings, +pub enum OtlpLogSettings { + /// OpenTelemetry log subscriber disabled. + #[default] + Disabled, + + /// OpenTelemetry log subscriber enabled. + Enabled { + /// Common subscriber settings that apply to the OpenTelemetry log subscriber. + common_settings: Settings, + }, } -impl Deref for OtlpLogSettings { - type Target = Settings; - - fn deref(&self) -> &Self::Target { - &self.common_settings +impl SettingsToggle for OtlpLogSettings { + fn is_enabled(&self) -> bool { + match self { + OtlpLogSettings::Disabled => false, + OtlpLogSettings::Enabled { .. } => true, + } } } @@ -35,7 +41,7 @@ pub struct OtlpLogSettingsBuilder { impl OtlpLogSettingsBuilder { /// Consumes `self` and builds [`OtlpLogSettings`]. pub fn build(self) -> OtlpLogSettings { - OtlpLogSettings { + OtlpLogSettings::Enabled { common_settings: self.common_settings, } } @@ -53,17 +59,28 @@ impl From for OtlpLogSettingsBuilder { impl From for OtlpLogSettings { fn from(common_settings: Settings) -> Self { - Self { common_settings } + Self::Enabled { common_settings } + } +} + +impl From> for OtlpLogSettings +where + T: Into, +{ + fn from(settings: Option) -> Self { + match settings { + Some(settings) => settings.into(), + None => OtlpLogSettings::default(), + } } } impl From<(&'static str, LevelFilter)> for OtlpLogSettings { fn from(value: (&'static str, LevelFilter)) -> Self { - Self { + Self::Enabled { common_settings: Settings { environment_variable: value.0, default_level: value.1, - enabled: true, }, } } @@ -71,12 +88,14 @@ impl From<(&'static str, LevelFilter)> for OtlpLogSettings { impl From<(&'static str, LevelFilter, bool)> for OtlpLogSettings { fn from(value: (&'static str, LevelFilter, bool)) -> Self { - Self { - common_settings: Settings { - environment_variable: value.0, - default_level: value.1, - enabled: value.2, + match value.2 { + true => Self::Enabled { + common_settings: Settings { + environment_variable: value.0, + default_level: value.1, + }, }, + false => Self::Disabled, } } } @@ -89,17 +108,15 @@ mod test { #[test] fn builds_settings() { - let expected = OtlpLogSettings { + let expected = OtlpLogSettings::Enabled { common_settings: Settings { environment_variable: "hello", default_level: LevelFilter::DEBUG, - enabled: true, }, }; let result = Settings::builder() .with_environment_variable("hello") .with_default_level(LevelFilter::DEBUG) - .enabled(true) .otlp_log_settings_builder() .build(); diff --git a/crates/stackable-telemetry/src/tracing/settings/otlp_trace.rs b/crates/stackable-telemetry/src/tracing/settings/otlp_trace.rs index 45cf00db5..93dab8aff 100644 --- a/crates/stackable-telemetry/src/tracing/settings/otlp_trace.rs +++ b/crates/stackable-telemetry/src/tracing/settings/otlp_trace.rs @@ -1,23 +1,29 @@ //! OTLP Trace Subscriber Settings. -use std::ops::Deref; - use tracing::level_filters::LevelFilter; -use super::{Settings, SettingsBuilder}; +use super::{Settings, SettingsBuilder, SettingsToggle}; /// Configure specific settings for the OpenTelemetry trace subscriber. #[derive(Debug, Default, PartialEq)] -pub struct OtlpTraceSettings { - /// Common subscriber settings that apply to the OpenTelemetry trace subscriber. - pub common_settings: Settings, +pub enum OtlpTraceSettings { + /// OpenTelemetry trace subscriber disabled. + #[default] + Disabled, + + /// OpenTelemetry trace subscriber enabled. + Enabled { + /// Common subscriber settings that apply to the OpenTelemetry trace subscriber. + common_settings: Settings, + }, } -impl Deref for OtlpTraceSettings { - type Target = Settings; - - fn deref(&self) -> &Self::Target { - &self.common_settings +impl SettingsToggle for OtlpTraceSettings { + fn is_enabled(&self) -> bool { + match self { + OtlpTraceSettings::Disabled => false, + OtlpTraceSettings::Enabled { .. } => true, + } } } @@ -35,7 +41,7 @@ pub struct OtlpTraceSettingsBuilder { impl OtlpTraceSettingsBuilder { /// Consumes `self` and builds [`OtlpTraceSettings`]. pub fn build(self) -> OtlpTraceSettings { - OtlpTraceSettings { + OtlpTraceSettings::Enabled { common_settings: self.common_settings, } } @@ -53,17 +59,28 @@ impl From for OtlpTraceSettingsBuilder { impl From for OtlpTraceSettings { fn from(common_settings: Settings) -> Self { - Self { common_settings } + Self::Enabled { common_settings } + } +} + +impl From> for OtlpTraceSettings +where + T: Into, +{ + fn from(settings: Option) -> Self { + match settings { + Some(settings) => settings.into(), + None => OtlpTraceSettings::default(), + } } } impl From<(&'static str, LevelFilter)> for OtlpTraceSettings { fn from(value: (&'static str, LevelFilter)) -> Self { - Self { + Self::Enabled { common_settings: Settings { environment_variable: value.0, default_level: value.1, - enabled: true, }, } } @@ -71,12 +88,14 @@ impl From<(&'static str, LevelFilter)> for OtlpTraceSettings { impl From<(&'static str, LevelFilter, bool)> for OtlpTraceSettings { fn from(value: (&'static str, LevelFilter, bool)) -> Self { - Self { - common_settings: Settings { - environment_variable: value.0, - default_level: value.1, - enabled: value.2, + match value.2 { + true => Self::Enabled { + common_settings: Settings { + environment_variable: value.0, + default_level: value.1, + }, }, + false => Self::Disabled, } } } @@ -89,17 +108,15 @@ mod test { #[test] fn builds_settings() { - let expected = OtlpTraceSettings { + let expected = OtlpTraceSettings::Enabled { common_settings: Settings { environment_variable: "hello", default_level: LevelFilter::DEBUG, - enabled: true, }, }; let result = Settings::builder() .with_environment_variable("hello") .with_default_level(LevelFilter::DEBUG) - .enabled(true) .otlp_trace_settings_builder() .build();