Skip to content

Commit 388a867

Browse files
committed
feat(stackable-telemetry): Add a settings builder and implement it for console logging
1 parent 191d8df commit 388a867

File tree

3 files changed

+220
-8
lines changed

3 files changed

+220
-8
lines changed

crates/stackable-telemetry/src/tracing/mod.rs

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@ use opentelemetry_sdk::{
1414
trace, Resource,
1515
};
1616
use opentelemetry_semantic_conventions::resource;
17+
use settings::ConsoleLogSettings;
1718
use snafu::{ResultExt as _, Snafu};
1819
use tracing::{level_filters::LevelFilter, subscriber::SetGlobalDefaultError};
1920
use tracing_subscriber::{filter::Directive, layer::SubscriberExt, EnvFilter, Layer, Registry};
2021

22+
pub mod settings;
23+
2124
type Result<T, E = Error> = std::result::Result<T, E>;
2225

2326
#[derive(Debug, Snafu)]
@@ -358,15 +361,14 @@ impl TracingBuilder<builder_state::Config> {
358361
/// variable.
359362
pub fn with_console_output(
360363
self,
361-
env_var: &'static str,
362-
default_level_filter: LevelFilter,
364+
settings: ConsoleLogSettings,
363365
) -> TracingBuilder<builder_state::Config> {
364366
TracingBuilder {
365367
service_name: self.service_name,
366368
console_log_config: SubscriberConfig {
367-
enabled: true,
368-
env_var,
369-
default_level_filter,
369+
enabled: settings.common_settings.enabled,
370+
env_var: settings.common_settings.environment_variable,
371+
default_level_filter: settings.common_settings.default_level,
370372
},
371373
otlp_log_config: self.otlp_log_config,
372374
otlp_trace_config: self.otlp_trace_config,
@@ -447,6 +449,8 @@ fn env_filter_builder(env_var: &str, default_directive: impl Into<Directive>) ->
447449

448450
#[cfg(test)]
449451
mod test {
452+
use settings::{Build as _, Settings};
453+
450454
use super::*;
451455

452456
#[test]
@@ -460,8 +464,20 @@ mod test {
460464
fn builder_with_console_output() {
461465
let trace_guard = Tracing::builder()
462466
.service_name("test")
463-
.with_console_output("ABC_A", LevelFilter::TRACE)
464-
.with_console_output("ABC_B", LevelFilter::DEBUG)
467+
.with_console_output(
468+
Settings::builder()
469+
.env_var("ABC_A")
470+
.default_level(LevelFilter::TRACE)
471+
.enabled(true)
472+
.build(),
473+
)
474+
.with_console_output(
475+
Settings::builder()
476+
.env_var("ABC_B")
477+
.default_level(LevelFilter::DEBUG)
478+
.enabled(true)
479+
.build(),
480+
)
465481
.build();
466482

467483
assert_eq!(
@@ -480,7 +496,13 @@ mod test {
480496
fn builder_with_all() {
481497
let trace_guard = Tracing::builder()
482498
.service_name("test")
483-
.with_console_output("ABC_CONSOLE", LevelFilter::INFO)
499+
.with_console_output(
500+
Settings::builder()
501+
.env_var("ABC_CONSOLE")
502+
.default_level(LevelFilter::INFO)
503+
.enabled(true)
504+
.build(),
505+
)
484506
.with_otlp_log_exporter("ABC_OTLP_LOG", LevelFilter::DEBUG)
485507
.with_otlp_trace_exporter("ABC_OTLP_TRACE", LevelFilter::TRACE)
486508
.build();
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
use super::{Build, Settings, SettingsBuilder};
2+
3+
#[derive(Debug, Default, PartialEq)]
4+
pub struct ConsoleLogSettings {
5+
pub common_settings: Settings,
6+
pub log_format: Format,
7+
}
8+
9+
#[derive(Debug, Default, PartialEq)]
10+
pub enum Format {
11+
#[default]
12+
Plain,
13+
// Json { pretty: bool },
14+
// LogFmt,
15+
}
16+
17+
pub struct ConsoleLogSettingsBuilder {
18+
pub(crate) common_settings: Settings,
19+
pub(crate) log_format: Format,
20+
}
21+
22+
impl ConsoleLogSettingsBuilder {
23+
pub fn log_format(mut self, format: Format) -> Self {
24+
self.log_format = format;
25+
self
26+
}
27+
28+
pub fn build(self) -> ConsoleLogSettings {
29+
self.into()
30+
}
31+
}
32+
33+
impl From<ConsoleLogSettingsBuilder> for ConsoleLogSettings {
34+
fn from(value: ConsoleLogSettingsBuilder) -> Self {
35+
Self {
36+
common_settings: value.common_settings,
37+
log_format: value.log_format,
38+
}
39+
}
40+
}
41+
42+
impl From<SettingsBuilder> for ConsoleLogSettingsBuilder {
43+
fn from(value: SettingsBuilder) -> Self {
44+
Self {
45+
common_settings: value.into(),
46+
log_format: Format::default(),
47+
}
48+
}
49+
}
50+
51+
impl Build<ConsoleLogSettings> for SettingsBuilder {
52+
fn build(self) -> ConsoleLogSettings {
53+
ConsoleLogSettings {
54+
common_settings: self.into(),
55+
..Default::default()
56+
}
57+
}
58+
}
59+
60+
#[cfg(test)]
61+
mod test {
62+
use tracing::level_filters::LevelFilter;
63+
64+
use super::*;
65+
66+
#[test]
67+
fn builds_settings() {
68+
let expected = ConsoleLogSettings {
69+
common_settings: Settings {
70+
environment_variable: "hello",
71+
enabled: true,
72+
default_level: LevelFilter::DEBUG,
73+
},
74+
log_format: Format::Plain,
75+
};
76+
let result = Settings::builder()
77+
.enabled(true)
78+
.env_var("hello")
79+
.default_level(LevelFilter::DEBUG)
80+
.console_log_settings_builder()
81+
.log_format(Format::Plain)
82+
// color
83+
.build();
84+
85+
assert_eq!(expected, result);
86+
}
87+
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
use tracing::level_filters::LevelFilter;
2+
3+
pub mod console_log;
4+
pub use console_log::*;
5+
6+
#[derive(Debug, PartialEq)]
7+
pub struct Settings {
8+
pub environment_variable: &'static str,
9+
10+
pub enabled: bool,
11+
12+
pub default_level: LevelFilter,
13+
}
14+
15+
impl Settings {
16+
pub fn builder() -> SettingsBuilder {
17+
SettingsBuilder::default()
18+
}
19+
}
20+
21+
impl Default for Settings {
22+
fn default() -> Self {
23+
SettingsBuilder::default().into()
24+
}
25+
}
26+
27+
pub struct SettingsBuilder {
28+
environment_variable: &'static str,
29+
enabled: bool,
30+
default_level: LevelFilter,
31+
}
32+
33+
pub trait Build<T> {
34+
fn build(self) -> T;
35+
}
36+
37+
impl Build<Settings> for SettingsBuilder {
38+
fn build(self) -> Settings {
39+
self.into()
40+
}
41+
}
42+
43+
impl SettingsBuilder {
44+
pub fn env_var(mut self, name: &'static str) -> Self {
45+
self.environment_variable = name;
46+
self
47+
}
48+
49+
pub fn enabled(mut self, enabled: bool) -> Self {
50+
self.enabled = enabled;
51+
self
52+
}
53+
54+
pub fn default_level(mut self, level: impl Into<LevelFilter>) -> Self {
55+
self.default_level = level.into();
56+
self
57+
}
58+
59+
pub fn console_log_settings_builder(self) -> ConsoleLogSettingsBuilder {
60+
self.into()
61+
}
62+
}
63+
64+
impl Default for SettingsBuilder {
65+
fn default() -> Self {
66+
Self {
67+
environment_variable: "RUST_LOG",
68+
enabled: false,
69+
default_level: LevelFilter::OFF,
70+
}
71+
}
72+
}
73+
74+
impl From<SettingsBuilder> for Settings {
75+
fn from(value: SettingsBuilder) -> Self {
76+
Self {
77+
environment_variable: value.environment_variable,
78+
enabled: value.enabled,
79+
default_level: value.default_level,
80+
}
81+
}
82+
}
83+
84+
#[cfg(test)]
85+
mod test {
86+
use super::*;
87+
88+
#[test]
89+
fn builds_settings() {
90+
let expected = Settings {
91+
environment_variable: "hello",
92+
enabled: true,
93+
default_level: LevelFilter::DEBUG,
94+
};
95+
let result = Settings::builder()
96+
.enabled(true)
97+
.env_var("hello")
98+
.default_level(LevelFilter::DEBUG)
99+
.build();
100+
101+
assert_eq!(expected, result);
102+
}
103+
}

0 commit comments

Comments
 (0)