Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ repository = "https://github.com/init4tech/bin-base"
# Tracing
tracing = "0.1.40"
tracing-core = "0.1.33"
tracing-subscriber = { version = "0.3.18", features = ["env-filter", "registry"] }
tracing-subscriber = { version = "0.3.18", features = ["env-filter", "json", "registry"] }

# OTLP
opentelemetry_sdk = "0.28.0"
Expand All @@ -41,4 +41,4 @@ tokio = { version = "1.43.0", features = ["macros"] }

[features]
default = ["alloy"]
alloy = ["dep:alloy"]
alloy = ["dep:alloy"]
9 changes: 9 additions & 0 deletions src/utils/from_env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,15 @@ impl<const N: usize> FromEnvVar for alloy::primitives::FixedBytes<N> {
}
}

impl FromEnvVar for bool {
type Error = std::str::ParseBoolError;

fn from_env_var(env_var: &str) -> Result<Self, FromEnvErr<Self::Error>> {
let s: String = std::env::var(env_var).map_err(|e| FromEnvErr::env_err(env_var, e))?;
Ok(!s.is_empty())
}
}

#[cfg(test)]
mod test {
use std::time::Duration;
Expand Down
47 changes: 38 additions & 9 deletions src/utils/tracing.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,33 @@
use crate::utils::otlp::{OtelConfig, OtelGuard};
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, Layer};
use crate::utils::{
from_env::FromEnvVar,
otlp::{OtelConfig, OtelGuard},
};
use tracing_subscriber::{filter::EnvFilter, layer::SubscriberExt, util::SubscriberInitExt, Layer};

const TRACING_LOG_JSON: &str = "TRACING_LOG_JSON";

/// Install a format layer based on the `TRACING_LOG_JSON` environment
/// variable, and then install the registr
///
macro_rules! install_fmt {
(json @ $registry:ident, $filter:ident) => {{
let fmt = tracing_subscriber::fmt::layer().json().with_filter($filter);
$registry.with(fmt).init();
}};
(log @ $registry:ident, $filter:ident) => {{
let fmt = tracing_subscriber::fmt::layer().with_filter($filter);
$registry.with(fmt).init();
}};
($registry:ident) => {{
let json = bool::from_env_var(TRACING_LOG_JSON).unwrap_or(false);
let filter = EnvFilter::from_default_env();
if json {
install_fmt!(json @ $registry, filter);
} else {
install_fmt!(log @ $registry, filter);
}
}};
}

/// Init tracing, returning an optional guard for the OTEL provider.
///
Expand All @@ -8,25 +36,26 @@ use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, Layer};
/// environment variables are set, it will initialize the OTEL provider
/// with the specified configuration, as well as the `fmt` layer.
///
/// See [`OtelConfig`] documentation for env var information.
/// ## Env Reads
///
/// - `TRACING_LOG_JSON` - If set, will enable JSON logging.
/// - As [`OtelConfig`] documentation for env var information.
///
/// ## Panics
///
/// This function will panic if a global subscriber has already been set.
///
/// [`OtelConfig`]: crate::utils::otlp::OtelConfig
pub fn init_tracing() -> Option<OtelGuard> {
let registry = tracing_subscriber::registry().with(
tracing_subscriber::fmt::layer()
.with_filter(tracing_subscriber::filter::EnvFilter::from_default_env()),
);
let registry = tracing_subscriber::registry();

if let Some(cfg) = OtelConfig::load() {
let guard = cfg.provider();
registry.with(guard.layer()).init();
let registry = registry.with(guard.layer());
install_fmt!(registry);
Some(guard)
} else {
registry.init();
install_fmt!(registry);
None
}
}
Loading