Skip to content

Commit 2539d4c

Browse files
committed
feat: allow to provide log's "directives" via init_subscribers_and_loglevel
- so log's level filter could be defined by parameter (without need to override `RUST_LOG` env variable on caller side - remove use of `std::env::set_var` (in the lib, and maybe on caller side) that becomes `unsafe` since rust 1.85
1 parent d433165 commit 2539d4c

File tree

2 files changed

+47
-18
lines changed

2 files changed

+47
-18
lines changed

init-tracing-opentelemetry/src/error.rs

+4
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,8 @@ pub enum Error {
88

99
#[error(transparent)]
1010
TraceError(#[from] opentelemetry::trace::TraceError),
11+
12+
#[cfg(feature = "tracing_subscriber_ext")]
13+
#[error(transparent)]
14+
FilterParseError(#[from] tracing_subscriber::filter::ParseError),
1115
}

init-tracing-opentelemetry/src/tracing_subscriber_ext.rs

+43-18
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use opentelemetry::trace::{TraceError, TracerProvider};
22
use opentelemetry_sdk::trace::{SdkTracerProvider, Tracer};
3-
use tracing::{info, Subscriber};
3+
use tracing::{info, level_filters::LevelFilter, Subscriber};
44
use tracing_opentelemetry::OpenTelemetryLayer;
55
use tracing_subscriber::{filter::EnvFilter, layer::SubscriberExt, registry::LookupSpan, Layer};
66

@@ -43,21 +43,41 @@ where
4343
}
4444

4545
#[must_use]
46-
pub fn build_loglevel_filter_layer() -> tracing_subscriber::filter::EnvFilter {
47-
// filter what is output on log (fmt)
48-
// std::env::set_var("RUST_LOG", "warn,otel::tracing=info,otel=debug");
49-
std::env::set_var(
50-
"RUST_LOG",
51-
format!(
52-
// `otel::tracing` should be a level info to emit opentelemetry trace & span
53-
// `otel::setup` set to debug to log detected resources, configuration read
54-
"{},otel::tracing=trace",
55-
std::env::var("RUST_LOG")
56-
.or_else(|_| std::env::var("OTEL_LOG_LEVEL"))
57-
.unwrap_or_else(|_| "info".to_string())
58-
),
59-
);
60-
EnvFilter::from_default_env()
46+
#[deprecated = "replaced by the configurable build_level_filter_layer(\"\")"]
47+
pub fn build_loglevel_filter_layer() -> EnvFilter {
48+
build_level_filter_layer("").unwrap_or_default()
49+
}
50+
51+
/// Read the configuration from (first non empty used, priority top to bottom):
52+
///
53+
/// - from parameter `directives`
54+
/// - from environment variable `RUST_LOG`
55+
/// - from environment variable `OTEL_LOG_LEVEL`
56+
/// - default to `Level::INFO`
57+
///
58+
/// And add directive to:
59+
///
60+
/// - `otel::tracing` should be a level info to emit opentelemetry trace & span
61+
///
62+
/// You can customize parameter "directives", by adding:
63+
///
64+
/// - `otel::setup=debug` set to debug to log detected resources, configuration read (optional)
65+
///
66+
/// see [Directives syntax](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives)
67+
pub fn build_level_filter_layer(log_directives: &str) -> Result<EnvFilter, Error> {
68+
let dirs = if log_directives.is_empty() {
69+
std::env::var("RUST_LOG")
70+
.or_else(|_| std::env::var("OTEL_LOG_LEVEL"))
71+
.unwrap_or_else(|_| "info".to_string())
72+
} else {
73+
log_directives.to_string()
74+
};
75+
let directive_to_allow_otel_trace = "otel::tracing=trace".parse()?;
76+
77+
Ok(EnvFilter::builder()
78+
.with_default_directive(LevelFilter::INFO.into())
79+
.parse_lossy(dirs)
80+
.add_directive(directive_to_allow_otel_trace))
6181
}
6282

6383
pub fn build_otel_layer<S>() -> Result<(OpenTelemetryLayer<S, Tracer>, TracingGuard), TraceError>
@@ -105,9 +125,14 @@ impl Drop for TracingGuard {
105125
}
106126

107127
pub fn init_subscribers() -> Result<TracingGuard, Error> {
128+
init_subscribers_and_loglevel("")
129+
}
130+
131+
/// see [`build_level_filter_layer`] for the syntax of `log_directives`
132+
pub fn init_subscribers_and_loglevel(log_directives: &str) -> Result<TracingGuard, Error> {
108133
//setup a temporary subscriber to log output during setup
109134
let subscriber = tracing_subscriber::registry()
110-
.with(build_loglevel_filter_layer())
135+
.with(build_level_filter_layer(log_directives)?)
111136
.with(build_logger_text());
112137
let _guard = tracing::subscriber::set_default(subscriber);
113138
info!("init logging & tracing");
@@ -116,7 +141,7 @@ pub fn init_subscribers() -> Result<TracingGuard, Error> {
116141

117142
let subscriber = tracing_subscriber::registry()
118143
.with(layer)
119-
.with(build_loglevel_filter_layer())
144+
.with(build_level_filter_layer(log_directives)?)
120145
.with(build_logger_text());
121146
tracing::subscriber::set_global_default(subscriber)?;
122147
Ok(guard)

0 commit comments

Comments
 (0)