Skip to content

Commit 34be4b5

Browse files
committed
Add Gauge benchmarks
Signed-off-by: Dariel Li <[email protected]>
1 parent 5867b79 commit 34be4b5

File tree

3 files changed

+145
-3
lines changed

3 files changed

+145
-3
lines changed

Diff for: benchmarks/README.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ java -jar ./benchmarks/target/benchmarks.jar CounterBenchmark
1717

1818
See Javadoc of the benchmark classes:
1919

20-
* [CounterBenchmark](https://github.com/prometheus/client_java/blob/1.0.x/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/CounterBenchmark.java)
21-
* [HistogramBenchmark](https://github.com/prometheus/client_java/blob/1.0.x/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/HistogramBenchmark.java)
20+
* [CounterBenchmark](https://github.com/prometheus/client_java/blob/main/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/CounterBenchmark.java)
21+
* [GaugeBenchmark](https://github.com/prometheus/client_java/blob/main/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/GaugeBenchmark.java)
22+
* [HistogramBenchmark](https://github.com/prometheus/client_java/blob/main/benchmarks/src/main/java/io/prometheus/metrics/benchmarks/HistogramBenchmark.java)
2223

2324
## What Prometheus Java client optimizes for
2425

Diff for: benchmarks/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<jmh.version>1.37</jmh.version>
2020
<simpleclient.version>0.16.0</simpleclient.version>
2121
<codahale.version>3.0.2</codahale.version>
22-
<opentelemetry.version>1.30.1</opentelemetry.version>
22+
<opentelemetry.version>1.38.0</opentelemetry.version>
2323
</properties>
2424

2525
<licenses>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
package io.prometheus.metrics.benchmarks;
2+
3+
import io.opentelemetry.api.OpenTelemetry;
4+
import io.opentelemetry.api.common.AttributeKey;
5+
import io.opentelemetry.api.common.Attributes;
6+
import io.opentelemetry.api.metrics.*;
7+
import io.opentelemetry.sdk.OpenTelemetrySdk;
8+
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
9+
import io.opentelemetry.sdk.resources.Resource;
10+
import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader;
11+
import io.prometheus.metrics.core.datapoints.GaugeDataPoint;
12+
import io.prometheus.metrics.core.metrics.Gauge;
13+
import org.openjdk.jmh.annotations.*;
14+
15+
/**
16+
* Results on a machine with dedicated 8 vCPU cores:
17+
* <pre>
18+
* Benchmark Mode Cnt Score Error Units
19+
* i.p.metrics.benchmarks.GaugeBenchmark.openTelemetryDoubleGauge thrpt 25 1673.376 ± 129.696 ops/s
20+
* i.p.metrics.benchmarks.GaugeBenchmark.openTelemetryLongGauge thrpt 25 1638.250 ± 48.570 ops/s
21+
* i.p.metrics.benchmarks.GaugeBenchmark.prometheus thrpt 25 56532.523 ± 1048.815 ops/s
22+
* i.p.metrics.benchmarks.GaugeBenchmark.simpleclient thrpt 25 16201.762 ± 140.938 ops/s
23+
* </pre>
24+
*/
25+
26+
public class GaugeBenchmark {
27+
28+
@State(Scope.Benchmark)
29+
public static class PrometheusGauge {
30+
31+
final Gauge noLabels;
32+
final GaugeDataPoint dataPoint;
33+
34+
public PrometheusGauge() {
35+
noLabels = Gauge.builder()
36+
.name("test")
37+
.help("help")
38+
.build();
39+
40+
Gauge labels = Gauge.builder()
41+
.name("test")
42+
.help("help")
43+
.labelNames("path", "status")
44+
.build();
45+
this.dataPoint = labels.labelValues("/", "200");
46+
}
47+
}
48+
49+
@State(Scope.Benchmark)
50+
public static class SimpleclientGauge {
51+
52+
final io.prometheus.client.Gauge noLabels;
53+
final io.prometheus.client.Gauge.Child dataPoint;
54+
55+
public SimpleclientGauge() {
56+
noLabels = io.prometheus.client.Gauge.build()
57+
.name("name")
58+
.help("help")
59+
.create();
60+
61+
io.prometheus.client.Gauge gauge = io.prometheus.client.Gauge.build()
62+
.name("name")
63+
.help("help")
64+
.labelNames("path", "status")
65+
.create();
66+
67+
this.dataPoint = gauge.labels("/", "200");
68+
}
69+
}
70+
71+
@State(Scope.Benchmark)
72+
public static class OpenTelemetryGauge {
73+
74+
final LongGauge longGauge;
75+
final DoubleGauge doubleGauge;
76+
final Attributes attributes;
77+
78+
public OpenTelemetryGauge() {
79+
80+
SdkMeterProvider sdkMeterProvider = SdkMeterProvider.builder()
81+
.registerMetricReader(InMemoryMetricReader.create())
82+
.setResource(Resource.getDefault())
83+
.build();
84+
OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
85+
.setMeterProvider(sdkMeterProvider)
86+
.build();
87+
Meter meter = openTelemetry
88+
.meterBuilder("instrumentation-library-name")
89+
.setInstrumentationVersion("1.0.0")
90+
.build();
91+
this.longGauge = meter
92+
.gaugeBuilder("test1")
93+
.setDescription("test")
94+
.ofLongs()
95+
.build();
96+
this.doubleGauge = meter
97+
.gaugeBuilder("test2")
98+
.setDescription("test")
99+
.build();
100+
this.attributes = Attributes.of(
101+
AttributeKey.stringKey("path"), "/",
102+
AttributeKey.stringKey("status"), "200");
103+
}
104+
}
105+
106+
@Benchmark
107+
@Threads(4)
108+
public GaugeDataPoint prometheus(RandomNumbers randomNumbers, PrometheusGauge gauge) {
109+
for (int i=0; i<randomNumbers.randomNumbers.length; i++) {
110+
gauge.dataPoint.set(randomNumbers.randomNumbers[i]);
111+
}
112+
return gauge.dataPoint;
113+
}
114+
115+
@Benchmark
116+
@Threads(4)
117+
public DoubleGauge openTelemetryDoubleGauge(RandomNumbers randomNumbers, OpenTelemetryGauge gauge) {
118+
for (int i=0; i<randomNumbers.randomNumbers.length; i++) {
119+
gauge.doubleGauge.set(randomNumbers.randomNumbers[i], gauge.attributes);
120+
}
121+
return gauge.doubleGauge;
122+
}
123+
124+
@Benchmark
125+
@Threads(4)
126+
public LongGauge openTelemetryLongGauge(RandomNumbers randomNumbers, OpenTelemetryGauge gauge) {
127+
for (int i=0; i<randomNumbers.randomNumbers.length; i++) {
128+
gauge.longGauge.set(1, gauge.attributes);
129+
}
130+
return gauge.longGauge;
131+
}
132+
133+
@Benchmark
134+
@Threads(4)
135+
public io.prometheus.client.Gauge.Child simpleclient(RandomNumbers randomNumbers, SimpleclientGauge gauge) {
136+
for (int i=0; i<randomNumbers.randomNumbers.length; i++) {
137+
gauge.dataPoint.set(randomNumbers.randomNumbers[i]);
138+
}
139+
return gauge.dataPoint;
140+
}
141+
}

0 commit comments

Comments
 (0)