Skip to content

Commit 98bac73

Browse files
committed
feat(stackable-telemetry): Add a settings builder and implement it for console logging
1 parent 6fbe323 commit 98bac73

File tree

3 files changed

+207
-8
lines changed

3 files changed

+207
-8
lines changed

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

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,16 @@ 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

26+
#[allow(missing_docs)]
2327
#[derive(Debug, Snafu)]
2428
pub enum Error {
2529
#[snafu(display("unable to install opentelemetry trace exporter"))]
@@ -358,15 +362,14 @@ impl TracingBuilder<builder_state::Config> {
358362
/// variable.
359363
pub fn with_console_output(
360364
self,
361-
env_var: &'static str,
362-
default_level_filter: LevelFilter,
365+
settings: ConsoleLogSettings,
363366
) -> TracingBuilder<builder_state::Config> {
364367
TracingBuilder {
365368
service_name: self.service_name,
366369
console_log_config: SubscriberConfig {
367-
enabled: true,
368-
env_var,
369-
default_level_filter,
370+
enabled: settings.common_settings.enabled,
371+
env_var: settings.common_settings.environment_variable,
372+
default_level_filter: settings.common_settings.default_level,
370373
},
371374
otlp_log_config: self.otlp_log_config,
372375
otlp_trace_config: self.otlp_trace_config,
@@ -447,6 +450,8 @@ fn env_filter_builder(env_var: &str, default_directive: impl Into<Directive>) ->
447450

448451
#[cfg(test)]
449452
mod test {
453+
use settings::{Build as _, Settings};
454+
450455
use super::*;
451456

452457
#[test]
@@ -460,8 +465,20 @@ mod test {
460465
fn builder_with_console_output() {
461466
let trace_guard = Tracing::builder()
462467
.service_name("test")
463-
.with_console_output("ABC_A", LevelFilter::TRACE)
464-
.with_console_output("ABC_B", LevelFilter::DEBUG)
468+
.with_console_output(
469+
Settings::builder()
470+
.env_var("ABC_A")
471+
.default_level(LevelFilter::TRACE)
472+
.enabled(true)
473+
.build(),
474+
)
475+
.with_console_output(
476+
Settings::builder()
477+
.env_var("ABC_B")
478+
.default_level(LevelFilter::DEBUG)
479+
.enabled(true)
480+
.build(),
481+
)
465482
.build();
466483

467484
assert_eq!(
@@ -480,7 +497,13 @@ mod test {
480497
fn builder_with_all() {
481498
let trace_guard = Tracing::builder()
482499
.service_name("test")
483-
.with_console_output("ABC_CONSOLE", LevelFilter::INFO)
500+
.with_console_output(
501+
Settings::builder()
502+
.env_var("ABC_CONSOLE")
503+
.default_level(LevelFilter::INFO)
504+
.enabled(true)
505+
.build(),
506+
)
484507
.with_otlp_log_exporter("ABC_OTLP_LOG", LevelFilter::DEBUG)
485508
.with_otlp_trace_exporter("ABC_OTLP_TRACE", LevelFilter::TRACE)
486509
.build();
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
use super::{Format, Settings};
2+
3+
#[derive(Debug, Default, PartialEq)]
4+
pub struct ConsoleLogSettings {
5+
pub common_settings: Settings,
6+
pub log_format: Format,
7+
}
8+
9+
pub struct ConsoleLogSettingsBuilder {
10+
pub(crate) common_settings: Settings,
11+
pub(crate) log_format: Format,
12+
}
13+
14+
impl ConsoleLogSettingsBuilder {
15+
pub fn log_format(mut self, format: Format) -> Self {
16+
self.log_format = format;
17+
self
18+
}
19+
20+
pub fn build(self) -> ConsoleLogSettings {
21+
self.into()
22+
}
23+
}
24+
25+
impl From<ConsoleLogSettingsBuilder> for ConsoleLogSettings {
26+
fn from(value: ConsoleLogSettingsBuilder) -> Self {
27+
Self {
28+
common_settings: value.common_settings,
29+
log_format: value.log_format,
30+
}
31+
}
32+
}
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
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 Build<ConsoleLogSettings> for SettingsBuilder {
44+
fn build(self) -> ConsoleLogSettings {
45+
ConsoleLogSettings {
46+
common_settings: self.into(),
47+
..Default::default()
48+
}
49+
}
50+
}
51+
52+
impl SettingsBuilder {
53+
pub fn env_var(mut self, name: &'static str) -> Self {
54+
self.environment_variable = name;
55+
self
56+
}
57+
58+
pub fn enabled(mut self, enabled: bool) -> Self {
59+
self.enabled = enabled;
60+
self
61+
}
62+
63+
pub fn default_level(mut self, level: impl Into<LevelFilter>) -> Self {
64+
self.default_level = level.into();
65+
self
66+
}
67+
68+
// consider making generic build functions for each type of settings
69+
// pub fn build(self) -> Settings {
70+
// self.into()
71+
// }
72+
73+
pub fn console_builder(self) -> ConsoleLogSettingsBuilder {
74+
self.into()
75+
}
76+
77+
// pub fn xxx_builder(self) -> XxxSettingsBuilder {
78+
// self.into()
79+
// }
80+
}
81+
82+
impl Default for SettingsBuilder {
83+
fn default() -> Self {
84+
Self {
85+
environment_variable: "RUST_LOG",
86+
enabled: false,
87+
default_level: LevelFilter::OFF,
88+
}
89+
}
90+
}
91+
92+
impl From<SettingsBuilder> for Settings {
93+
fn from(value: SettingsBuilder) -> Self {
94+
Self {
95+
environment_variable: value.environment_variable,
96+
enabled: value.enabled,
97+
default_level: value.default_level,
98+
}
99+
}
100+
}
101+
102+
impl From<SettingsBuilder> for ConsoleLogSettingsBuilder {
103+
fn from(value: SettingsBuilder) -> Self {
104+
Self {
105+
common_settings: value.into(),
106+
log_format: Format::default(),
107+
}
108+
}
109+
}
110+
111+
#[derive(Debug, Default, PartialEq)]
112+
pub enum Format {
113+
#[default]
114+
Plain,
115+
// Json { pretty: bool },
116+
// LogFmt,
117+
}
118+
119+
#[cfg(test)]
120+
mod test {
121+
use super::*;
122+
123+
#[test]
124+
fn builds_console_settings() {
125+
let expected = ConsoleLogSettings {
126+
common_settings: Settings {
127+
environment_variable: "hello",
128+
enabled: true,
129+
default_level: LevelFilter::DEBUG,
130+
},
131+
log_format: Format::Plain,
132+
};
133+
let result: ConsoleLogSettings = Settings::builder()
134+
.enabled(true)
135+
.env_var("hello")
136+
.default_level(LevelFilter::DEBUG)
137+
.console_builder()
138+
.log_format(Format::Plain)
139+
// color
140+
.build();
141+
142+
assert_eq!(expected, result);
143+
}
144+
}

0 commit comments

Comments
 (0)