observability: allow combining multiple tracing layers

Previously, jaeger, tracing_flame and stderr output were mutually
exclusive. There's no good reason for this.
This commit is contained in:
Lambda 2024-05-23 18:53:54 +00:00 committed by Charles Hall
parent 263edcc8a1
commit 7a154f7416
No known key found for this signature in database
GPG key ID: 7B8E0645816E07CF

View file

@ -6,7 +6,7 @@ use std::{fs::File, io::BufWriter};
use opentelemetry::KeyValue; use opentelemetry::KeyValue;
use opentelemetry_sdk::Resource; use opentelemetry_sdk::Resource;
use tracing_flame::{FlameLayer, FlushGuard}; use tracing_flame::{FlameLayer, FlushGuard};
use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry}; use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Layer, Registry};
use crate::{config::Config, error, utils::error::Result}; use crate::{config::Config, error, utils::error::Result};
@ -25,47 +25,59 @@ impl Drop for Guard {
/// Initialize observability /// Initialize observability
pub(crate) fn init(config: &Config) -> Result<Guard, error::Observability> { pub(crate) fn init(config: &Config) -> Result<Guard, error::Observability> {
let mut flame_guard = None; let config_filter_layer = || EnvFilter::try_new(&config.log);
if config.allow_jaeger {
opentelemetry::global::set_text_map_propagator( let jaeger_layer = config
opentelemetry_jaeger_propagator::Propagator::new(), .allow_jaeger
); .then(|| {
let tracer = opentelemetry_otlp::new_pipeline() opentelemetry::global::set_text_map_propagator(
.tracing() opentelemetry_jaeger_propagator::Propagator::new(),
.with_trace_config( );
opentelemetry_sdk::trace::config().with_resource( let tracer = opentelemetry_otlp::new_pipeline()
Resource::new(vec![KeyValue::new( .tracing()
"service.name", .with_trace_config(
env!("CARGO_PKG_NAME"), opentelemetry_sdk::trace::config().with_resource(
)]), Resource::new(vec![KeyValue::new(
), "service.name",
env!("CARGO_PKG_NAME"),
)]),
),
)
.with_exporter(opentelemetry_otlp::new_exporter().tonic())
.install_batch(opentelemetry_sdk::runtime::Tokio)?;
let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);
Ok::<_, error::Observability>(
telemetry.with_filter(config_filter_layer()?),
) )
.with_exporter(opentelemetry_otlp::new_exporter().tonic()) })
.install_batch(opentelemetry_sdk::runtime::Tokio)?; .transpose()?;
let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);
let filter_layer = EnvFilter::try_new(&config.log)?; let (flame_layer, flame_guard) = config
.tracing_flame
.then(|| {
let (flame_layer, guard) =
FlameLayer::with_file("./tracing.folded")?;
let flame_layer = flame_layer.with_empty_samples(false);
let subscriber = Registry::default().with(filter_layer).with(telemetry); let filter_layer = EnvFilter::new("trace,h2=off");
tracing::subscriber::set_global_default(subscriber)?;
} else if config.tracing_flame {
let registry = Registry::default();
let (flame_layer, guard) = FlameLayer::with_file("./tracing.folded")?;
flame_guard = Some(guard);
let flame_layer = flame_layer.with_empty_samples(false);
let filter_layer = EnvFilter::new("trace,h2=off"); Ok::<_, error::Observability>((
flame_layer.with_filter(filter_layer),
guard,
))
})
.transpose()?
.unzip();
let subscriber = registry.with(filter_layer).with(flame_layer); let fmt_layer = tracing_subscriber::fmt::Layer::new()
tracing::subscriber::set_global_default(subscriber)?; .with_filter(config_filter_layer()?);
} else {
let registry = Registry::default();
let fmt_layer = tracing_subscriber::fmt::Layer::new();
let filter_layer = EnvFilter::try_new(&config.log)?;
let subscriber = registry.with(filter_layer).with(fmt_layer); let subscriber = Registry::default()
tracing::subscriber::set_global_default(subscriber)?; .with(jaeger_layer)
} .with(flame_layer)
.with(fmt_layer);
tracing::subscriber::set_global_default(subscriber)?;
Ok(Guard { Ok(Guard {
flame_guard, flame_guard,