PrometheusExporter().init();
?
/metrics
endpoint here?jaeger/all-in-one
, so I don't know if I want to setup a web server on the client app for Prometheus to try to hit
rust-prometheus push
exmaple here:fn criterion_benchmark(c: &mut Criterion) {
c.bench_function("many_children", |b| {
let tracer = sdktrace::TracerProvider::default().get_tracer("always-sample", None);
b.iter(|| {
fn dummy(tracer: &sdktrace::Tracer, cx: &opentelemetry::Context) {
for _ in 0..99 {
tracer.start_with_context("child", cx.clone());
}
}
tracer.in_span("root", |root| dummy(&tracer, &root));
});
});
}
many_children time: [35.839 us 36.414 us 37.007 us]
std::sync::channel
send is probably another ~12us
#[derive(Debug)]
pub struct NoopExporter;
#[async_trait::async_trait]
impl opentelemetry::sdk::export::trace::SpanExporter for NoopExporter {
async fn export(
&mut self,
_batch: Vec<opentelemetry::sdk::export::trace::SpanData>,
) -> opentelemetry::sdk::export::trace::ExportResult {
Ok(())
}
}
fn criterion_benchmark(c: &mut Criterion) {
c.bench_function("many_children", |b| {
let provider = sdktrace::TracerProvider::builder()
.with_simple_exporter(NoopExporter)
.build();
let tracer = provider.get_tracer("always-sample", None);
b.iter(|| {
fn dummy(tracer: &sdktrace::Tracer, cx: &opentelemetry::Context) {
for _ in 0..99 {
tracer.start_with_context("child", cx.clone());
}
}
tracer.in_span("root", |root| dummy(&tracer, &root));
});
});
}
time: [98.073 us 98.287 us 98.521 us]
#[derive(Debug)]
pub struct NoopExporter;
#[async_trait::async_trait]
impl opentelemetry::sdk::export::trace::SpanExporter for NoopExporter {
async fn export(
&mut self,
_batch: Vec<opentelemetry::sdk::export::trace::SpanData>,
) -> opentelemetry::sdk::export::trace::ExportResult {
Ok(())
}
}
fn criterion_benchmark(c: &mut Criterion) {
c.bench_function("many_children", |b| {
let rt = tokio::runtime::Runtime::new().unwrap();
let _g = rt.enter();
let provider = sdktrace::TracerProvider::builder()
.with_exporter(NoopExporter)
.build();
let tracer = provider.get_tracer("always-sample", None);
b.to_async(&rt).iter(|| async {
fn dummy(tracer: &sdktrace::Tracer, cx: &opentelemetry::Context) {
for _ in 0..99 {
tracer.start_with_context("child", cx.clone());
}
}
tracer.in_span("root", |root| dummy(&tracer, &root));
});
});
}
many_children time: [202.30 us 203.93 us 205.56 us]
change: [+102.42% +104.51% +106.59%] (p = 0.00 < 0.05)