From 47c96b5dd9af237f1e96f82293c32b986163641d Mon Sep 17 00:00:00 2001 From: jason plumb <75337021+breedx-splk@users.noreply.github.com> Date: Wed, 3 Mar 2021 10:55:41 -0800 Subject: [PATCH] Fix trace benchmark (#2974) * fix address passed to span processor, which was causing benchmark to not run. * started some docs on how to run jmh --- docs/jmh.md | 21 +++++++++++++++++++ .../sdk/trace/SpanPipelineBenchmark.java | 17 +++++++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 docs/jmh.md diff --git a/docs/jmh.md b/docs/jmh.md new file mode 100644 index 0000000000..fed02923d3 --- /dev/null +++ b/docs/jmh.md @@ -0,0 +1,21 @@ + +# how to jmh + +[jmh] (Java Benchmark Harness) is a tool for running benchmarks and reporting results. + +opentelemetry-java has a lot of micro benchmarks. They live inside +`jmh` directories in the appropriate module. + +The benchmarks are run with a gradle plugin. + +To run an entire suite for a module, you can run the jmh gradle task. +As an example, here's how you can run the benchmarks for all of +the sdk trace module. + +``` +`./gradlew :sdk:trace:jmh` +``` + +If you just want to run a single benchmark and not the entire suite: + +`./gradlew -PjmhIncludeSingleClass=BatchSpanProcessorBenchmark :sdk:trace:jmh` \ No newline at end of file diff --git a/sdk/trace/src/jmh/java/io/opentelemetry/sdk/trace/SpanPipelineBenchmark.java b/sdk/trace/src/jmh/java/io/opentelemetry/sdk/trace/SpanPipelineBenchmark.java index 4f471a3fce..551c59c255 100644 --- a/sdk/trace/src/jmh/java/io/opentelemetry/sdk/trace/SpanPipelineBenchmark.java +++ b/sdk/trace/src/jmh/java/io/opentelemetry/sdk/trace/SpanPipelineBenchmark.java @@ -11,6 +11,8 @@ import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter; import io.opentelemetry.sdk.trace.export.BatchSpanProcessor; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; import io.opentelemetry.sdk.trace.samplers.Sampler; +import java.net.MalformedURLException; +import java.net.URL; import java.time.Duration; import java.util.concurrent.TimeUnit; import org.openjdk.jmh.annotations.Benchmark; @@ -66,18 +68,29 @@ public class SpanPipelineBenchmark { collector.start(); - String address = collector.getHost() + ":" + collector.getMappedPort(EXPOSED_PORT); + SpanProcessor spanProcessor = makeSpanProcessor(collector); SdkTracerProvider tracerProvider = SdkTracerProvider.builder() .setSampler(Sampler.alwaysOn()) - .addSpanProcessor(getSpanProcessor(address)) + .addSpanProcessor(spanProcessor) .build(); Tracer tracerSdk = tracerProvider.get("PipelineBenchmarkTracer"); sdkSpanBuilder = (SdkSpanBuilder) tracerSdk.spanBuilder("PipelineBenchmarkSpan"); } + private SpanProcessor makeSpanProcessor(GenericContainer collector) { + try { + String host = collector.getHost(); + Integer port = collector.getMappedPort(EXPOSED_PORT); + String address = new URL("http", host, port, "").toString(); + return getSpanProcessor(address); + } catch (MalformedURLException e) { + throw new IllegalStateException("can't make a url", e); + } + } + @Benchmark @BenchmarkMode(Mode.Throughput) @Warmup(iterations = 5, time = 1)