From cd0ae687835cd9acef7ebeb7413e98f098d76ccd Mon Sep 17 00:00:00 2001 From: Harold Dost Date: Fri, 17 Jun 2022 09:11:57 +0200 Subject: [PATCH] WIP - Benchmarks --- opentelemetry-sdk/Cargo.toml | 5 ++-- opentelemetry-sdk/benches/trace.rs | 46 ++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/opentelemetry-sdk/Cargo.toml b/opentelemetry-sdk/Cargo.toml index 7d810cbdfc..a783e88812 100644 --- a/opentelemetry-sdk/Cargo.toml +++ b/opentelemetry-sdk/Cargo.toml @@ -17,7 +17,7 @@ once_cell = "1.10" opentelemetry-api = { version = "0.1", path = "../opentelemetry-api/" } percent-encoding = { version = "2.0", optional = true } pin-project = { version = "1.0.2", optional = true } -rand = { version = "0.8", default-features = false, features = ["std", "std_rng"], optional = true } +rand = { version = "0.8", default-features = false, features = ["std", "std_rng","small_rng"], optional = true } serde = { version = "1.0", features = ["derive", "rc"], optional = true } thiserror = "1" tokio = { version = "1.0", default-features = false, features = ["rt", "time"], optional = true } @@ -29,7 +29,7 @@ rustdoc-args = ["--cfg", "docsrs"] [dev-dependencies] bincode = "1.2" -criterion = "0.3.1" +criterion = { version = "0.3.1", features = ["html_reports"] } rand_distr = "0.4.0" [features] @@ -44,6 +44,7 @@ rt-async-std = ["async-std"] [[bench]] name = "trace" harness = false +required-features = ["testing"] [[bench]] name = "batch_span_processor" diff --git a/opentelemetry-sdk/benches/trace.rs b/opentelemetry-sdk/benches/trace.rs index 4d75e7493c..f50d25755e 100644 --- a/opentelemetry-sdk/benches/trace.rs +++ b/opentelemetry-sdk/benches/trace.rs @@ -1,11 +1,15 @@ use criterion::{criterion_group, criterion_main, Criterion}; use futures_util::future::BoxFuture; +use opentelemetry_api::trace::{SpanId, TraceId}; +use rand::{SeedableRng, Rng,rngs::SmallRng}; +use std::cell::RefCell; use opentelemetry_api::{ trace::{Span, Tracer, TracerProvider}, Key, KeyValue, }; use opentelemetry_sdk::{ export::trace::{ExportResult, SpanData, SpanExporter}, + trace::IdGenerator, trace as sdktrace, }; @@ -107,6 +111,30 @@ impl SpanExporter for VoidExporter { } } + +/// Test [`IdGenerator`] implementation. +/// +/// Generates Trace and Span ids using a random number generator using SmallRng +#[derive(Clone, Debug, Default)] +pub struct SmallRandomIdGenerator { + _private: (), +} + +impl IdGenerator for SmallRandomIdGenerator { + fn new_trace_id(&self) -> TraceId { + CURRENT_RNG.with(|rng| TraceId::from(rng.borrow_mut().gen::<[u8; 16]>())) + } + + fn new_span_id(&self) -> SpanId { + CURRENT_RNG.with(|rng| SpanId::from(rng.borrow_mut().gen::<[u8; 8]>())) + } +} + +thread_local! { + /// Store random number generator for each thread + static CURRENT_RNG: RefCell = RefCell::new(SmallRng::from_entropy()); +} + fn trace_benchmark_group(c: &mut Criterion, name: &str, f: F) { let mut group = c.benchmark_group(name); @@ -129,6 +157,24 @@ fn trace_benchmark_group(c: &mut Criterion, name: &str b.iter(|| f(&never_sample)); }); + group.bench_function("always-sample-smallrng", |b| { + let provider = sdktrace::TracerProvider::builder() + .with_config(sdktrace::config().with_sampler(sdktrace::Sampler::AlwaysOn).with_id_generator(SmallRandomIdGenerator::default())) + .with_simple_exporter(VoidExporter) + .build(); + let always_sample = provider.tracer("always-sample-smallrng"); + + b.iter(|| f(&always_sample)); + }); + + group.bench_function("never-sample-smallrng", |b| { + let provider = sdktrace::TracerProvider::builder() + .with_config(sdktrace::config().with_sampler(sdktrace::Sampler::AlwaysOff).with_id_generator(SmallRandomIdGenerator::default())) + .with_simple_exporter(VoidExporter) + .build(); + let never_sample = provider.tracer("never-sample-smallrng"); + b.iter(|| f(&never_sample)); + }); group.finish(); }