pub mod spans;
use tracing_subscriber::EnvFilter;
use tracing_subscriber::fmt::format::FmtSpan;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Format {
#[default]
Pretty,
Json,
}
#[derive(Debug, Clone)]
pub struct TelemetryConfig {
pub default_filter: String,
pub format: Format,
pub log_span_events: bool,
pub to_stderr: bool,
}
impl Default for TelemetryConfig {
fn default() -> Self {
Self {
default_filter: "info".to_owned(),
format: Format::default(),
log_span_events: false,
to_stderr: false,
}
}
}
impl TelemetryConfig {
pub fn for_stdout_protocol() -> Self {
Self {
to_stderr: true,
..Self::default()
}
}
}
pub fn init(config: TelemetryConfig) -> bool {
let filter = EnvFilter::try_from_default_env()
.unwrap_or_else(|_| EnvFilter::new(&config.default_filter));
let span_events = if config.log_span_events {
FmtSpan::NEW | FmtSpan::CLOSE
} else {
FmtSpan::NONE
};
macro_rules! install {
($builder:expr) => {
match config.format {
Format::Pretty => $builder.try_init().is_ok(),
Format::Json => $builder.json().try_init().is_ok(),
}
};
}
let builder = tracing_subscriber::fmt()
.with_env_filter(filter)
.with_span_events(span_events)
.with_target(true);
if config.to_stderr {
install!(builder.with_writer(std::io::stderr))
} else {
install!(builder)
}
}