use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer};
use tracing_subscriber::filter::LevelFilter;
use tracing_subscriber::prelude::*;
#[derive(clap::ValueEnum, Clone, Default, Debug)]
pub enum Logger {
#[default]
Full,
Pretty,
Json,
}
impl std::fmt::Display for Logger {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let logger = match self {
Logger::Full => "full",
Logger::Pretty => "pretty",
Logger::Json => "json",
};
write!(f, "{}", logger)
}
}
#[derive(clap::Args, Clone, Debug, Default)]
pub struct Instrumentation {
#[clap(
long,
default_value_t = Default::default(),
)]
pub(crate) logger: Logger,
#[clap(long)]
pub loki: bool,
#[clap(long, default_value = "http://127.0.0.1:3100")]
pub loki_endpoint: String,
}
impl Instrumentation {
pub async fn setup(&self) {
let stdout = tracing_subscriber::fmt::layer();
let env_filter = tracing_subscriber::EnvFilter::builder()
.with_default_directive(LevelFilter::INFO.into())
.from_env_lossy();
let registry = tracing_subscriber::registry().with(env_filter);
let mut layers = Vec::new();
match self.logger {
Logger::Full => layers.push(stdout.boxed()),
Logger::Pretty => layers.push(stdout.pretty().boxed()),
Logger::Json => {
let name = format!(
"{}@{}-{}",
env!("CARGO_PKG_NAME"),
env!("CARGO_PKG_VERSION"),
env!("VERGEN_GIT_DESCRIBE")
);
let bunyan_layer = BunyanFormattingLayer::new(name, std::io::stdout);
layers.push(JsonStorageLayer.boxed());
layers.push(bunyan_layer.boxed());
},
}
if self.loki {
let hostname = hostname::get().unwrap();
let (loki_layer, task) = tracing_loki::builder()
.label("appname", env!("CARGO_PKG_NAME"))
.unwrap()
.label("version", env!("CARGO_PKG_VERSION"))
.unwrap()
.label("hostname", hostname.to_str().unwrap_or_default())
.unwrap()
.extra_field("git-info", env!("VERGEN_GIT_DESCRIBE"))
.unwrap()
.extra_field("pid", format!("{}", std::process::id()))
.unwrap()
.build_url(reqwest::Url::parse(&self.loki_endpoint).unwrap())
.unwrap();
tokio::spawn(task);
layers.push(loki_layer.boxed());
}
registry.with(layers).init();
}
}