From a2d91e491149fcc563eda30d24b46972f1c91fbb Mon Sep 17 00:00:00 2001 From: Dariel Li Date: Tue, 4 Jun 2024 15:26:45 +0800 Subject: [PATCH] Add Gauge benchmarks --- benchmarks/README.md | 5 +- benchmarks/pom.xml | 2 +- .../metrics/benchmarks/GaugeBenchmark.java | 141 ++++++++++++++++++ 3 files changed, 145 insertions(+), 3 deletions(-) create mode 100644 benchmarks/src/main/java/io/prometheus/metrics/benchmarks/GaugeBenchmark.java diff --git a/benchmarks/README.md b/benchmarks/README.md index 36300e4d1..740e24682 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -17,8 +17,9 @@ java -jar ./benchmarks/target/benchmarks.jar CounterBenchmark See Javadoc of the benchmark classes: -* [CounterBenchmark](https://github.com/prometheus/client_java/blob/1.0.x/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/CounterBenchmark.java) -* [HistogramBenchmark](https://github.com/prometheus/client_java/blob/1.0.x/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/HistogramBenchmark.java) +* [CounterBenchmark](https://github.com/prometheus/client_java/blob/main/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/CounterBenchmark.java) +* [GaugeBenchmark](https://github.com/prometheus/client_java/blob/main/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/GaugeBenchmark.java) +* [HistogramBenchmark](https://github.com/prometheus/client_java/blob/main/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/HistogramBenchmark.java) ## What Prometheus Java client optimizes for diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index f9d2f1866..4546227df 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -19,7 +19,7 @@ 1.37 0.16.0 3.0.2 - 1.30.1 + 1.38.0 diff --git a/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/GaugeBenchmark.java b/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/GaugeBenchmark.java new file mode 100644 index 000000000..f9fc4cc95 --- /dev/null +++ b/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/GaugeBenchmark.java @@ -0,0 +1,141 @@ +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.metrics.*; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.metrics.SdkMeterProvider; +import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader; +import io.prometheus.metrics.core.datapoints.GaugeDataPoint; +import io.prometheus.metrics.core.metrics.Gauge; +import org.openjdk.jmh.annotations.*; + +/** + * Results on a machine with dedicated 8 vCPU cores: + *
+ * Benchmark                                                        Mode  Cnt      Score      Error  Units
+ * i.p.metrics.benchmarks.GaugeBenchmark.openTelemetryDoubleGauge  thrpt   25   1673.376 ±  129.696  ops/s
+ * i.p.metrics.benchmarks.GaugeBenchmark.openTelemetryLongGauge    thrpt   25   1638.250 ±   48.570  ops/s
+ * i.p.metrics.benchmarks.GaugeBenchmark.prometheus                thrpt   25  56532.523 ± 1048.815  ops/s
+ * i.p.metrics.benchmarks.GaugeBenchmark.simpleclient              thrpt   25  16201.762 ±  140.938  ops/s
+ * 
+ */ + +public class GaugeBenchmark { + + @State(Scope.Benchmark) + public static class PrometheusGauge { + + final Gauge noLabels; + final GaugeDataPoint dataPoint; + + public PrometheusGauge() { + noLabels = Gauge.builder() + .name("test") + .help("help") + .build(); + + Gauge labels = Gauge.builder() + .name("test") + .help("help") + .labelNames("path", "status") + .build(); + this.dataPoint = labels.labelValues("/", "200"); + } + } + + @State(Scope.Benchmark) + public static class SimpleclientGauge { + + final io.prometheus.client.Gauge noLabels; + final io.prometheus.client.Gauge.Child dataPoint; + + public SimpleclientGauge() { + noLabels = io.prometheus.client.Gauge.build() + .name("name") + .help("help") + .create(); + + io.prometheus.client.Gauge gauge = io.prometheus.client.Gauge.build() + .name("name") + .help("help") + .labelNames("path", "status") + .create(); + + this.dataPoint = gauge.labels("/", "200"); + } + } + + @State(Scope.Benchmark) + public static class OpenTelemetryGauge { + + final LongGauge longGauge; + final DoubleGauge doubleGauge; + final Attributes attributes; + + public OpenTelemetryGauge() { + + SdkMeterProvider sdkMeterProvider = SdkMeterProvider.builder() + .registerMetricReader(InMemoryMetricReader.create()) + .setResource(Resource.getDefault()) + .build(); + OpenTelemetry openTelemetry = OpenTelemetrySdk.builder() + .setMeterProvider(sdkMeterProvider) + .build(); + Meter meter = openTelemetry + .meterBuilder("instrumentation-library-name") + .setInstrumentationVersion("1.0.0") + .build(); + this.longGauge = meter + .gaugeBuilder("test1") + .setDescription("test") + .ofLongs() + .build(); + this.doubleGauge = meter + .gaugeBuilder("test2") + .setDescription("test") + .build(); + this.attributes = Attributes.of( + AttributeKey.stringKey("path"), "/", + AttributeKey.stringKey("status"), "200"); + } + } + + @Benchmark + @Threads(4) + public GaugeDataPoint prometheus(RandomNumbers randomNumbers, PrometheusGauge gauge) { + for (int i=0; i