package io.prometheus.benchmark; import com.codahale.metrics.MetricRegistry; import java.util.concurrent.TimeUnit; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.runner.Runner; import org.openjdk.jmh.runner.RunnerException; import org.openjdk.jmh.runner.options.Options; import org.openjdk.jmh.runner.options.OptionsBuilder; @State(Scope.Benchmark) public class GaugeBenchmark { MetricRegistry registry; com.codahale.metrics.Counter codahaleCounter; io.prometheus.client.metrics.Gauge prometheusGauge; io.prometheus.client.metrics.Gauge.Child prometheusGaugeChild; io.prometheus.client.Gauge prometheusSimpleGauge; io.prometheus.client.Gauge.Child prometheusSimpleGaugeChild; io.prometheus.client.Gauge prometheusSimpleGaugeNoLabels; @Setup public void setup() { prometheusGauge = io.prometheus.client.metrics.Gauge.newBuilder() .name("name") .documentation("some description..") .build(); prometheusGaugeChild = prometheusGauge.newPartial().apply(); prometheusSimpleGauge = io.prometheus.client.Gauge.build() .name("name") .help("some description..") .labelNames("some", "group").create(); prometheusSimpleGaugeChild = prometheusSimpleGauge.labels("test", "group"); prometheusSimpleGaugeNoLabels = io.prometheus.client.Gauge.build() .name("name") .help("some description..") .create(); registry = new MetricRegistry(); codahaleCounter = registry.counter("name"); } // Increment. @Benchmark @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.NANOSECONDS) public void prometheusGaugeIncBenchmark() { prometheusGauge.newPartial().apply().increment(); } @Benchmark @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.NANOSECONDS) public void prometheusGaugeChildIncBenchmark() { prometheusGaugeChild.increment(); } @Benchmark @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.NANOSECONDS) public void prometheusSimpleGaugeIncBenchmark() { prometheusSimpleGauge.labels("test", "group").inc(); } @Benchmark @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.NANOSECONDS) public void prometheusSimpleGaugeChildIncBenchmark() { prometheusSimpleGaugeChild.inc(); } @Benchmark @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.NANOSECONDS) public void prometheusSimpleGaugeNoLabelsIncBenchmark() { prometheusSimpleGaugeNoLabels.inc(); } @Benchmark @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.NANOSECONDS) public void codahaleCounterIncBenchmark() { codahaleCounter.inc(); } // Decrement. @Benchmark @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.NANOSECONDS) public void prometheusGaugeDecBenchmark() { prometheusGauge.newPartial().apply().decrement(); } @Benchmark @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.NANOSECONDS) public void prometheusGaugeChildDecBenchmark() { prometheusGaugeChild.decrement(); } @Benchmark @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.NANOSECONDS) public void prometheusSimpleGaugeDecBenchmark() { prometheusSimpleGauge.labels("test", "group").dec(); } @Benchmark @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.NANOSECONDS) public void prometheusSimpleGaugeChildDecBenchmark() { prometheusSimpleGaugeChild.dec(); } @Benchmark @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.NANOSECONDS) public void prometheusSimpleGaugeNoLabelsDecBenchmark() { prometheusSimpleGaugeNoLabels.dec(); } @Benchmark @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.NANOSECONDS) public void codahaleCounterDecBenchmark() { codahaleCounter.dec(); } // Set. @Benchmark @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.NANOSECONDS) public void prometheusGaugeSetBenchmark() { prometheusGauge.newPartial().apply().set(42); } @Benchmark @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.NANOSECONDS) public void prometheusGaugeChildSetBenchmark() { prometheusGaugeChild.set(42); } @Benchmark @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.NANOSECONDS) public void prometheusSimpleGaugeSetBenchmark() { prometheusSimpleGauge.labels("test", "group").set(42); } @Benchmark @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.NANOSECONDS) public void prometheusSimpleGaugeChildSetBenchmark() { prometheusSimpleGaugeChild.set(42); } @Benchmark @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.NANOSECONDS) public void prometheusSimpleGaugeNoLabelsSetBenchmark() { prometheusSimpleGaugeNoLabels.set(42); } public static void main(String[] args) throws RunnerException { Options opt = new OptionsBuilder() .include(GaugeBenchmark.class.getSimpleName()) .warmupIterations(5) .measurementIterations(4) .threads(4) .forks(1) .build(); new Runner(opt).run(); } }