2
0
Fork 0
mirror of https://git.asonix.dog/asonix/pict-rs synced 2024-11-01 01:59:58 +00:00
pict-rs/src/init_tracing.rs

107 lines
3.4 KiB
Rust
Raw Normal View History

2022-03-28 04:27:07 +00:00
use crate::config::{LogFormat, OpenTelemetry, Tracing};
2024-04-15 20:16:10 +00:00
use color_eyre::config::Theme;
use console_subscriber::ConsoleLayer;
use opentelemetry::{trace::TracerProvider, KeyValue};
2021-10-21 00:28:40 +00:00
use opentelemetry_otlp::WithExportConfig;
2023-11-10 21:19:54 +00:00
use opentelemetry_sdk::{propagation::TraceContextPropagator, Resource};
2021-10-21 00:28:40 +00:00
use tracing::subscriber::set_global_default;
use tracing_error::ErrorLayer;
use tracing_log::LogTracer;
2023-12-11 20:58:53 +00:00
use tracing_subscriber::{
fmt::format::FmtSpan, layer::SubscriberExt, registry::LookupSpan, Layer, Registry,
};
2021-10-21 00:28:40 +00:00
2022-03-29 01:47:46 +00:00
pub(super) fn init_tracing(tracing: &Tracing) -> color_eyre::Result<()> {
2024-04-15 20:16:10 +00:00
let eyre_theme = if tracing.logging.no_ansi {
Theme::new()
} else {
Theme::dark()
};
color_eyre::config::HookBuilder::new()
.theme(eyre_theme)
.install()?;
2022-03-29 01:47:46 +00:00
2021-10-21 00:28:40 +00:00
LogTracer::init()?;
opentelemetry::global::set_text_map_propagator(TraceContextPropagator::new());
2023-12-11 20:58:53 +00:00
let fmt_span = if tracing.logging.log_spans {
FmtSpan::NEW | FmtSpan::CLOSE
} else {
FmtSpan::NONE
};
2024-04-15 20:16:10 +00:00
let format_layer = tracing_subscriber::fmt::layer()
.with_span_events(fmt_span)
.with_ansi(!tracing.logging.no_ansi);
2021-12-17 02:46:46 +00:00
2022-03-28 04:27:07 +00:00
match tracing.logging.format {
LogFormat::Compact => with_format(format_layer.compact(), tracing),
LogFormat::Json => with_format(format_layer.json(), tracing),
LogFormat::Normal => with_format(format_layer, tracing),
LogFormat::Pretty => with_format(format_layer.pretty(), tracing),
}
}
2022-03-29 01:47:46 +00:00
fn with_format<F>(format_layer: F, tracing: &Tracing) -> color_eyre::Result<()>
2022-03-28 04:27:07 +00:00
where
F: Layer<Registry> + Send + Sync,
{
let format_layer = format_layer.with_filter(tracing.logging.targets.targets.clone());
2021-10-21 00:28:40 +00:00
let subscriber = Registry::default()
.with(format_layer)
.with(ErrorLayer::default());
2022-03-28 04:27:07 +00:00
if let Some(address) = tracing.console.address {
let console_layer = ConsoleLayer::builder()
2022-03-28 04:27:07 +00:00
.event_buffer_capacity(tracing.console.buffer_capacity)
.server_addr(address)
.spawn();
let subscriber = subscriber.with(console_layer);
with_subscriber(subscriber, &tracing.opentelemetry)?;
tracing::info!("Starting console on {address}");
Ok(())
} else {
2022-03-28 04:27:07 +00:00
with_subscriber(subscriber, &tracing.opentelemetry)
}
}
2022-02-01 16:10:52 +00:00
2022-03-29 01:47:46 +00:00
fn with_subscriber<S>(subscriber: S, otel: &OpenTelemetry) -> color_eyre::Result<()>
where
S: SubscriberExt + Send + Sync,
for<'a> S: LookupSpan<'a>,
{
2022-03-28 04:27:07 +00:00
if let Some(url) = otel.url.as_ref() {
let tracer = opentelemetry_otlp::new_pipeline()
.tracing()
.with_trace_config(opentelemetry_sdk::trace::Config::default().with_resource(
Resource::new(vec![KeyValue::new(
"service.name",
otel.service_name.clone(),
)]),
))
2022-03-28 04:27:07 +00:00
.with_exporter(
opentelemetry_otlp::new_exporter()
.tonic()
.with_endpoint(url.as_str()),
)
2023-11-10 21:19:54 +00:00
.install_batch(opentelemetry_sdk::runtime::Tokio)?;
2021-10-21 00:28:40 +00:00
2021-12-17 02:46:46 +00:00
let otel_layer = tracing_opentelemetry::layer()
.with_tracer(tracer.tracer("pict-rs-tracer"))
2022-03-28 04:27:07 +00:00
.with_filter(otel.targets.as_ref().targets.clone());
2021-10-21 00:28:40 +00:00
let subscriber = subscriber.with(otel_layer);
set_global_default(subscriber)?;
} else {
set_global_default(subscriber)?;
}
Ok(())
}