use tracing::Level;
use tracing_subscriber::fmt;
use tracing_subscriber::prelude::*;
use tracing_subscriber::EnvFilter;
#[derive(Debug, Clone)]
pub struct TelemetryConfig {
pub default_level: Level,
pub include_span_events: bool,
pub include_file_line: bool,
pub include_target: bool,
pub ansi_colors: bool,
pub compact: bool,
pub filter_directive: Option<String>,
}
impl Default for TelemetryConfig {
fn default() -> Self {
Self {
default_level: Level::INFO,
include_span_events: false,
include_file_line: false,
include_target: true,
ansi_colors: true,
compact: true,
filter_directive: None,
}
}
}
impl TelemetryConfig {
pub fn development() -> Self {
Self {
default_level: Level::DEBUG,
include_span_events: true,
include_file_line: true,
include_target: true,
ansi_colors: true,
compact: false,
filter_directive: None,
}
}
pub fn production() -> Self {
Self {
default_level: Level::WARN,
include_span_events: false,
include_file_line: false,
include_target: false,
ansi_colors: false,
compact: true,
filter_directive: None,
}
}
}
pub struct TelemetryGuard {
#[allow(dead_code)]
_private: (),
}
pub fn init_telemetry(config: &TelemetryConfig) -> anyhow::Result<TelemetryGuard> {
let filter = if let Some(ref directive) = config.filter_directive {
EnvFilter::try_new(directive)?
} else {
EnvFilter::from_default_env()
.add_directive(config.default_level.into())
.add_directive(format!("gitgrip={}", config.default_level).parse()?)
};
let fmt_layer = fmt::layer()
.with_ansi(config.ansi_colors)
.with_target(config.include_target)
.with_file(config.include_file_line)
.with_line_number(config.include_file_line);
let fmt_layer = if config.compact {
fmt_layer.compact().boxed()
} else {
fmt_layer.boxed()
};
let subscriber = tracing_subscriber::registry().with(filter).with(fmt_layer);
tracing::subscriber::set_global_default(subscriber)?;
Ok(TelemetryGuard { _private: () })
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_config_default() {
let config = TelemetryConfig::default();
assert_eq!(config.default_level, Level::INFO);
assert!(config.compact);
}
#[test]
fn test_config_development() {
let config = TelemetryConfig::development();
assert_eq!(config.default_level, Level::DEBUG);
assert!(config.include_span_events);
}
#[test]
fn test_config_production() {
let config = TelemetryConfig::production();
assert_eq!(config.default_level, Level::WARN);
assert!(!config.include_span_events);
}
}