Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions benchmarks/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,31 @@
<jmh.version>1.37</jmh.version>
<simpleclient.version>0.16.0</simpleclient.version>
<codahale.version>3.0.2</codahale.version>
<!-- TODO: remove once opentelemetry-instrumentation-bom-alpha ships with otel 1.66.0. -->
<benchmark.otel.version>1.66.0</benchmark.otel.version>
<coverage.skip>true</coverage.skip>
<javadoc.skip>true</javadoc.skip>
</properties>

<dependencyManagement>
<dependencies>
<!-- TODO: remove these two BOM imports once opentelemetry-instrumentation-bom-alpha
ships with otel 1.66.0. They must be listed before the instrumentation BOM so
their versions win. -->
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-bom</artifactId>
<version>${benchmark.otel.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-bom-alpha</artifactId>
<version>${benchmark.otel.version}-alpha</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-instrumentation-bom-alpha</artifactId>
Expand Down Expand Up @@ -73,6 +92,10 @@
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk-testing</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api-incubator</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,15 @@
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.incubator.metrics.BoundDoubleCounter;
import io.opentelemetry.api.incubator.metrics.BoundLongCounter;
import io.opentelemetry.api.incubator.metrics.ExtendedDoubleCounter;
import io.opentelemetry.api.incubator.metrics.ExtendedLongCounter;
import io.opentelemetry.api.metrics.DoubleCounter;
import io.opentelemetry.api.metrics.LongCounter;
import io.opentelemetry.api.metrics.Meter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.metrics.ExemplarFilter;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader;
Expand Down Expand Up @@ -94,6 +99,7 @@ public OpenTelemetryCounter() {
SdkMeterProvider.builder()
.registerMetricReader(InMemoryMetricReader.create())
.setResource(Resource.getDefault())
.setExemplarFilter(ExemplarFilter.alwaysOff())
.build();
OpenTelemetry openTelemetry =
OpenTelemetrySdk.builder().setMeterProvider(sdkMeterProvider).build();
Expand All @@ -111,6 +117,45 @@ public OpenTelemetryCounter() {
}
}

/**
* OpenTelemetry counter using the incubator "bound instrument" API, which pre-binds a set of
* attributes at initialization time to avoid a per-record attribute map lookup.
*/
@State(Scope.Benchmark)
public static class OpenTelemetryBoundCounter {

final BoundLongCounter longCounter;
final BoundDoubleCounter doubleCounter;

public OpenTelemetryBoundCounter() {

SdkMeterProvider sdkMeterProvider =
SdkMeterProvider.builder()
.registerMetricReader(InMemoryMetricReader.create())
.setResource(Resource.getDefault())
.setExemplarFilter(ExemplarFilter.alwaysOff())
.build();
OpenTelemetry openTelemetry =
OpenTelemetrySdk.builder().setMeterProvider(sdkMeterProvider).build();
Meter meter =
openTelemetry
.meterBuilder("instrumentation-library-name")
.setInstrumentationVersion("1.0.0")
.build();
Attributes attributes =
Attributes.of(
AttributeKey.stringKey("path"), "/",
AttributeKey.stringKey("status"), "200");
this.longCounter =
((ExtendedLongCounter) meter.counterBuilder("test1").setDescription("test").build())
.bind(attributes);
this.doubleCounter =
((ExtendedDoubleCounter)
meter.counterBuilder("test2").ofDoubles().setDescription("test").build())
.bind(attributes);
}
}

@Benchmark
@Threads(4)
public CounterDataPoint prometheusAdd(RandomNumbers randomNumbers, PrometheusCounter counter) {
Expand Down Expand Up @@ -156,6 +201,25 @@ public LongCounter openTelemetryIncNoLabels(OpenTelemetryCounter counter) {
return counter.longCounter;
}

@Benchmark
@Threads(4)
public BoundDoubleCounter openTelemetryBoundAdd(
RandomNumbers randomNumbers, OpenTelemetryBoundCounter counter) {
for (int i = 0; i < randomNumbers.randomNumbers.length; i++) {
counter.doubleCounter.add(randomNumbers.randomNumbers[i]);
}
return counter.doubleCounter;
}

@Benchmark
@Threads(4)
public BoundLongCounter openTelemetryBoundInc(OpenTelemetryBoundCounter counter) {
for (int i = 0; i < 10 * 1024; i++) {
counter.longCounter.add(1);
}
return counter.longCounter;
}

@Benchmark
@Threads(4)
public io.prometheus.client.Counter.Child simpleclientAdd(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package io.prometheus.metrics.benchmarks;

import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.incubator.metrics.BoundDoubleHistogram;
import io.opentelemetry.api.incubator.metrics.ExtendedDoubleHistogram;
import io.opentelemetry.api.metrics.Meter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.metrics.Aggregation;
import io.opentelemetry.sdk.metrics.ExemplarFilter;
import io.opentelemetry.sdk.metrics.InstrumentSelector;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.metrics.View;
Expand Down Expand Up @@ -95,6 +100,7 @@ public OpenTelemetryClassicHistogram() {
SdkMeterProvider.builder()
.registerMetricReader(InMemoryMetricReader.create())
.setResource(Resource.getDefault())
.setExemplarFilter(ExemplarFilter.alwaysOff())
.registerView(
InstrumentSelector.builder().setName("test").build(),
View.builder()
Expand Down Expand Up @@ -126,6 +132,7 @@ public OpenTelemetryExponentialHistogram() {
SdkMeterProvider.builder()
.registerMetricReader(InMemoryMetricReader.create())
.setResource(Resource.getDefault())
.setExemplarFilter(ExemplarFilter.alwaysOff())
.registerView(
InstrumentSelector.builder().setName("test").build(),
View.builder()
Expand All @@ -143,6 +150,85 @@ public OpenTelemetryExponentialHistogram() {
}
}

/**
* OpenTelemetry classic histogram using the incubator "bound instrument" API to pre-bind
* attributes at initialization time.
*/
@State(Scope.Benchmark)
public static class OpenTelemetryBoundClassicHistogram {

final BoundDoubleHistogram histogram;

public OpenTelemetryBoundClassicHistogram() {
SdkMeterProvider sdkMeterProvider =
SdkMeterProvider.builder()
.registerMetricReader(InMemoryMetricReader.create())
.setResource(Resource.getDefault())
.setExemplarFilter(ExemplarFilter.alwaysOff())
.registerView(
InstrumentSelector.builder().setName("test").build(),
View.builder()
.setAggregation(
Aggregation.explicitBucketHistogram(
Arrays.asList(
.005, .01, .025, .05, .1, .25, .5, 1.0, 2.5, 5.0, 10.0)))
.build())
.build();
OpenTelemetry openTelemetry =
OpenTelemetrySdk.builder().setMeterProvider(sdkMeterProvider).build();
Meter meter =
openTelemetry
.meterBuilder("instrumentation-library-name")
.setInstrumentationVersion("1.0.0")
.build();
Attributes attributes =
Attributes.of(
AttributeKey.stringKey("path"), "/",
AttributeKey.stringKey("status"), "200");
this.histogram =
((ExtendedDoubleHistogram) meter.histogramBuilder("test").setDescription("test").build())
.bind(attributes);
}
}

/**
* OpenTelemetry exponential histogram using the incubator "bound instrument" API to pre-bind
* attributes at initialization time.
*/
@State(Scope.Benchmark)
public static class OpenTelemetryBoundExponentialHistogram {

final BoundDoubleHistogram histogram;

public OpenTelemetryBoundExponentialHistogram() {
SdkMeterProvider sdkMeterProvider =
SdkMeterProvider.builder()
.registerMetricReader(InMemoryMetricReader.create())
.setResource(Resource.getDefault())
.setExemplarFilter(ExemplarFilter.alwaysOff())
.registerView(
InstrumentSelector.builder().setName("test").build(),
View.builder()
.setAggregation(Aggregation.base2ExponentialBucketHistogram(10_000, 5))
.build())
.build();
OpenTelemetry openTelemetry =
OpenTelemetrySdk.builder().setMeterProvider(sdkMeterProvider).build();
Meter meter =
openTelemetry
.meterBuilder("instrumentation-library-name")
.setInstrumentationVersion("1.0.0")
.build();
Attributes attributes =
Attributes.of(
AttributeKey.stringKey("path"), "/",
AttributeKey.stringKey("status"), "200");
this.histogram =
((ExtendedDoubleHistogram) meter.histogramBuilder("test").setDescription("test").build())
.bind(attributes);
}
}

@Benchmark
@Threads(4)
public Histogram prometheusClassic(
Expand Down Expand Up @@ -212,4 +298,24 @@ public io.opentelemetry.api.metrics.DoubleHistogram openTelemetryExponential(
}
return histogram.histogram;
}

@Benchmark
@Threads(4)
public BoundDoubleHistogram openTelemetryBoundClassic(
RandomNumbers randomNumbers, OpenTelemetryBoundClassicHistogram histogram) {
for (int i = 0; i < randomNumbers.randomNumbers.length; i++) {
histogram.histogram.record(randomNumbers.randomNumbers[i]);
}
return histogram.histogram;
}

@Benchmark
@Threads(4)
public BoundDoubleHistogram openTelemetryBoundExponential(
RandomNumbers randomNumbers, OpenTelemetryBoundExponentialHistogram histogram) {
for (int i = 0; i < randomNumbers.randomNumbers.length; i++) {
histogram.histogram.record(randomNumbers.randomNumbers[i]);
}
return histogram.histogram;
}
}
Loading