use criterion::{criterion_group, criterion_main, Criterion}; #[cfg(not(target_os = "windows"))] use pprof::criterion::{Output, PProfProfiler}; use tracing_opentelemetry::MetricsLayer; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; // OpenTelemetry crate no longer publishes their NoopMeterProvider, // so we just implement our own here. mod noop { use opentelemetry::metrics::{InstrumentProvider, Meter, MeterProvider}; #[derive(Default)] pub struct NoopMeterProvider { _private: (), } impl MeterProvider for NoopMeterProvider { fn meter_with_scope(&self, _: opentelemetry::InstrumentationScope) -> Meter { Meter::new(std::sync::Arc::new(NoopMeter::default())) } } #[derive(Default)] pub struct NoopMeter { _private: (), } impl InstrumentProvider for NoopMeter {} } use noop::*; fn metrics_events(c: &mut Criterion) { let mut group = c.benchmark_group("otel_metrics_events"); { let _subscriber = tracing_subscriber::registry().set_default(); group.bench_function("no_metrics_layer", |b| { b.iter(|| { tracing::info!(key_1 = "va", "msg"); }) }); } { let _subscriber = tracing_subscriber::registry() .with(MetricsLayer::new(NoopMeterProvider::default())) .set_default(); group.bench_function("metrics_events_0_attr_0", |b| { b.iter(|| { tracing::info!(key_1 = "va", "msg"); }) }); } { let _subscriber = tracing_subscriber::registry() .with(MetricsLayer::new(NoopMeterProvider::default())) .set_default(); group.bench_function("metrics_events_1_attr_0", |b| { b.iter(|| { tracing::info!(monotonic_counter.c1 = 1, "msg"); }) }); } { let _subscriber = tracing_subscriber::registry() .with(MetricsLayer::new(NoopMeterProvider::default())) .set_default(); group.bench_function("metrics_events_2_attr_0", |b| { b.iter(|| { tracing::info!(monotonic_counter.c1 = 1, monotonic_counter.c2 = 1, "msg"); }) }); } { let _subscriber = tracing_subscriber::registry() .with(MetricsLayer::new(NoopMeterProvider::default())) .set_default(); group.bench_function("metrics_events_4_attr_0", |b| { b.iter(|| { tracing::info!( monotonic_counter.c1 = 1, monotonic_counter.c2 = 1, monotonic_counter.c3 = 1, monotonic_counter.c4 = 1, "msg" ); }) }); } { let _subscriber = tracing_subscriber::registry() .with(MetricsLayer::new(NoopMeterProvider::default())) .set_default(); group.bench_function("metrics_events_8_attr_0", |b| { b.iter(|| { tracing::info!( monotonic_counter.c1 = 1, monotonic_counter.c2 = 1, monotonic_counter.c3 = 1, monotonic_counter.c4 = 1, monotonic_counter.c5 = 1, monotonic_counter.c6 = 1, monotonic_counter.c7 = 1, monotonic_counter.c8 = 1, "msg" ); }) }); } { let _subscriber = tracing_subscriber::registry() .with(MetricsLayer::new(NoopMeterProvider::default())) .set_default(); group.bench_function("metrics_events_1_attr_1", |b| { b.iter(|| { tracing::info!(monotonic_counter.c1 = 1, key_1 = 1_i64, "msg"); }) }); } { let _subscriber = tracing_subscriber::registry() .with(MetricsLayer::new(NoopMeterProvider::default())) .set_default(); group.bench_function("metrics_events_1_attr_2", |b| { b.iter(|| { tracing::info!( monotonic_counter.c1 = 1, key_1 = 1_i64, key_2 = 1_i64, "msg" ); }) }); } { let _subscriber = tracing_subscriber::registry() .with(MetricsLayer::new(NoopMeterProvider::default())) .set_default(); group.bench_function("metrics_events_1_attr_4", |b| { b.iter(|| { tracing::info!( monotonic_counter.c1 = 1, key_1 = 1_i64, key_2 = 1_i64, key_3 = 1_i64, key_4 = 1_i64, "msg" ); }) }); } { let _subscriber = tracing_subscriber::registry() .with(MetricsLayer::new(NoopMeterProvider::default())) .set_default(); group.bench_function("metrics_events_1_attr_8", |b| { b.iter(|| { tracing::info!( monotonic_counter.c1 = 1, key_1 = 1_i64, key_2 = 1_i64, key_3 = 1_i64, key_4 = 1_i64, key_5 = 1_i64, key_6 = 1_i64, key_7 = 1_i64, key_8 = 1_i64, "msg" ); }) }); } group.finish(); } #[cfg(not(target_os = "windows"))] criterion_group! { name = benches; config = Criterion::default().with_profiler(PProfProfiler::new(100, Output::Flamegraph(None))); targets = metrics_events } #[cfg(target_os = "windows")] criterion_group! { name = benches; config = Criterion::default(); targets = metrics_events } criterion_main!(benches);