diff --git a/src/main.rs b/src/main.rs index bf2f40dbdfe4faaa329e3274ea6dbe3db313fd6a..c7de0516d425a26b15e4c56bc877316a936df8e3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -476,24 +476,7 @@ fn init(args: clap::Args) -> Result<Server, Error> { None }; - let tracing_reload_handle; - - #[cfg(feature = "perf_measurements")] - { - tracing_reload_handle = if config.allow_jaeger { - init_tracing_jaeger(&config) - } else if config.tracing_flame { - #[cfg(feature = "perf_measurements")] - init_tracing_flame(&config) - } else { - init_tracing_sub(&config) - }; - }; - - #[cfg(not(feature = "perf_measurements"))] - { - tracing_reload_handle = init_tracing_sub(&config); - }; + let tracing_reload_handle = init_tracing(&config); config.check()?; @@ -596,7 +579,10 @@ fn reload(&self, new_value: &EnvFilter) -> Result<(), reload::Error> { } } -fn init_tracing_sub(config: &Config) -> LogLevelReloadHandles { +// clippy thinks the filter_layer clones are redundant if the next usage is +// behind a disabled feature. +#[allow(clippy::redundant_clone)] +fn init_tracing(config: &Config) -> LogLevelReloadHandles { let registry = Registry::default(); let fmt_layer = tracing_subscriber::fmt::Layer::new(); let filter_layer = match EnvFilter::try_new(&config.log) { @@ -623,11 +609,46 @@ fn init_tracing_sub(config: &Config) -> LogLevelReloadHandles { #[cfg(feature = "sentry_telemetry")] let subscriber = { let sentry_layer = sentry_tracing::layer(); - let (sentry_reload_filter, sentry_reload_handle) = reload::Layer::new(filter_layer); + let (sentry_reload_filter, sentry_reload_handle) = reload::Layer::new(filter_layer.clone()); reload_handles.push(Box::new(sentry_reload_handle)); subscriber.with(sentry_layer.with_filter(sentry_reload_filter)) }; + #[cfg(feature = "perf_measurements")] + let subscriber = { + let flame_layer = if config.tracing_flame { + let flame_filter = EnvFilter::new("trace,h2=off"); + + // TODO: actually preserve this guard until exit: https://docs.rs/tracing-flame/latest/tracing_flame/struct.FlameLayer.html#dropping-and-flushing + let (flame_layer, _guard) = tracing_flame::FlameLayer::with_file("./tracing.folded").unwrap(); + Some( + flame_layer + .with_empty_samples(false) + .with_filter(flame_filter), + ) + } else { + None + }; + + let jaeger_layer = if config.allow_jaeger { + opentelemetry::global::set_text_map_propagator(opentelemetry_jaeger::Propagator::new()); + let tracer = opentelemetry_jaeger::new_agent_pipeline() + .with_auto_split_batch(true) + .with_service_name("conduwuit") + .install_batch(opentelemetry_sdk::runtime::Tokio) + .unwrap(); + let telemetry = tracing_opentelemetry::layer().with_tracer(tracer); + + let (jaeger_reload_filter, jaeger_reload_handle) = reload::Layer::new(filter_layer); + reload_handles.push(Box::new(jaeger_reload_handle)); + Some(telemetry.with_filter(jaeger_reload_filter)) + } else { + None + }; + + subscriber.with(flame_layer).with(jaeger_layer) + }; + tracing::subscriber::set_global_default(subscriber).unwrap(); #[cfg(all(feature = "tokio_console", feature = "release_max_log_level"))] @@ -639,51 +660,6 @@ fn init_tracing_sub(config: &Config) -> LogLevelReloadHandles { LogLevelReloadHandles::new(reload_handles) } -#[cfg(feature = "perf_measurements")] -fn init_tracing_jaeger(config: &Config) -> LogLevelReloadHandles { - opentelemetry::global::set_text_map_propagator(opentelemetry_jaeger::Propagator::new()); - let tracer = opentelemetry_jaeger::new_agent_pipeline() - .with_auto_split_batch(true) - .with_service_name("conduwuit") - .install_batch(opentelemetry_sdk::runtime::Tokio) - .unwrap(); - let telemetry = tracing_opentelemetry::layer().with_tracer(tracer); - - let filter_layer = match EnvFilter::try_new(&config.log) { - Ok(s) => s, - Err(e) => { - eprintln!("It looks like your log config is invalid. The following error occurred: {e}"); - EnvFilter::try_new("warn").unwrap() - }, - }; - - let (reload_filter, reload_handle) = reload::Layer::new(filter_layer); - - let subscriber = Registry::default().with(reload_filter).with(telemetry); - - tracing::subscriber::set_global_default(subscriber).unwrap(); - - LogLevelReloadHandles::new(vec![Box::new(reload_handle)]) -} - -// TODO: tokio-console here? -#[cfg(feature = "perf_measurements")] -fn init_tracing_flame(_config: &Config) -> LogLevelReloadHandles { - let registry = Registry::default(); - let (flame_layer, _guard) = tracing_flame::FlameLayer::with_file("./tracing.folded").unwrap(); - let flame_layer = flame_layer.with_empty_samples(false); - - let filter_layer = EnvFilter::new("trace,h2=off"); - - let (reload_filter, reload_handle) = reload::Layer::new(filter_layer); - - let subscriber = registry.with(reload_filter).with(flame_layer); - - tracing::subscriber::set_global_default(subscriber).unwrap(); - - LogLevelReloadHandles::new(vec![Box::new(reload_handle)]) -} - // This is needed for opening lots of file descriptors, which tends to // happen more often when using RocksDB and making lots of federation // connections at startup. The soft limit is usually 1024, and the hard