001package io.prometheus.benchmark;
002
003import com.codahale.metrics.MetricRegistry;
004
005import java.util.concurrent.TimeUnit;
006import org.openjdk.jmh.annotations.BenchmarkMode;
007import org.openjdk.jmh.annotations.Mode;
008import org.openjdk.jmh.annotations.Benchmark;
009import org.openjdk.jmh.annotations.OutputTimeUnit;
010import org.openjdk.jmh.annotations.Scope;
011import org.openjdk.jmh.annotations.Setup;
012import org.openjdk.jmh.annotations.State;
013import org.openjdk.jmh.runner.Runner;
014import org.openjdk.jmh.runner.RunnerException;
015import org.openjdk.jmh.runner.options.Options;
016import org.openjdk.jmh.runner.options.OptionsBuilder;
017
018@State(Scope.Benchmark)
019public class GaugeBenchmark {
020
021  MetricRegistry registry;
022  com.codahale.metrics.Counter codahaleCounter;
023
024  io.prometheus.client.metrics.Gauge prometheusGauge;
025  io.prometheus.client.metrics.Gauge.Child prometheusGaugeChild;
026  io.prometheus.client.Gauge prometheusSimpleGauge;
027  io.prometheus.client.Gauge.Child prometheusSimpleGaugeChild;
028  io.prometheus.client.Gauge prometheusSimpleGaugeNoLabels;
029
030  @Setup
031  public void setup() {
032    prometheusGauge = io.prometheus.client.metrics.Gauge.newBuilder()
033      .name("name")
034      .documentation("some description..")
035      .build();
036    prometheusGaugeChild = prometheusGauge.newPartial().apply();
037
038    prometheusSimpleGauge = io.prometheus.client.Gauge.build()
039      .name("name")
040      .help("some description..")
041      .labelNames("some", "group").create();
042    prometheusSimpleGaugeChild = prometheusSimpleGauge.labels("test", "group");
043
044    prometheusSimpleGaugeNoLabels = io.prometheus.client.Gauge.build()
045      .name("name")
046      .help("some description..")
047      .create();
048
049    registry = new MetricRegistry();
050    codahaleCounter = registry.counter("name");
051  }
052
053  // Increment.
054  @Benchmark
055  @BenchmarkMode({Mode.AverageTime})
056  @OutputTimeUnit(TimeUnit.NANOSECONDS)
057  public void prometheusGaugeIncBenchmark() {
058    prometheusGauge.newPartial().apply().increment();
059  }
060
061  @Benchmark
062  @BenchmarkMode({Mode.AverageTime})
063  @OutputTimeUnit(TimeUnit.NANOSECONDS)
064  public void prometheusGaugeChildIncBenchmark() {
065    prometheusGaugeChild.increment();
066  }
067
068  @Benchmark
069  @BenchmarkMode({Mode.AverageTime})
070  @OutputTimeUnit(TimeUnit.NANOSECONDS)
071  public void prometheusSimpleGaugeIncBenchmark() {
072    prometheusSimpleGauge.labels("test", "group").inc(); 
073  }
074  
075  @Benchmark
076  @BenchmarkMode({Mode.AverageTime})
077  @OutputTimeUnit(TimeUnit.NANOSECONDS)
078  public void prometheusSimpleGaugeChildIncBenchmark() {
079    prometheusSimpleGaugeChild.inc(); 
080  }
081
082  @Benchmark
083  @BenchmarkMode({Mode.AverageTime})
084  @OutputTimeUnit(TimeUnit.NANOSECONDS)
085  public void prometheusSimpleGaugeNoLabelsIncBenchmark() {
086    prometheusSimpleGaugeNoLabels.inc(); 
087  }
088
089  @Benchmark
090  @BenchmarkMode({Mode.AverageTime})
091  @OutputTimeUnit(TimeUnit.NANOSECONDS)
092  public void codahaleCounterIncBenchmark() {
093    codahaleCounter.inc();
094  }
095
096
097  // Decrement.
098  @Benchmark
099  @BenchmarkMode({Mode.AverageTime})
100  @OutputTimeUnit(TimeUnit.NANOSECONDS)
101  public void prometheusGaugeDecBenchmark() {
102    prometheusGauge.newPartial().apply().decrement();
103  }
104
105  @Benchmark
106  @BenchmarkMode({Mode.AverageTime})
107  @OutputTimeUnit(TimeUnit.NANOSECONDS)
108  public void prometheusGaugeChildDecBenchmark() {
109    prometheusGaugeChild.decrement();
110  }
111
112  @Benchmark
113  @BenchmarkMode({Mode.AverageTime})
114  @OutputTimeUnit(TimeUnit.NANOSECONDS)
115  public void prometheusSimpleGaugeDecBenchmark() {
116    prometheusSimpleGauge.labels("test", "group").dec(); 
117  }
118  
119  @Benchmark
120  @BenchmarkMode({Mode.AverageTime})
121  @OutputTimeUnit(TimeUnit.NANOSECONDS)
122  public void prometheusSimpleGaugeChildDecBenchmark() {
123    prometheusSimpleGaugeChild.dec(); 
124  }
125
126  @Benchmark
127  @BenchmarkMode({Mode.AverageTime})
128  @OutputTimeUnit(TimeUnit.NANOSECONDS)
129  public void prometheusSimpleGaugeNoLabelsDecBenchmark() {
130    prometheusSimpleGaugeNoLabels.dec(); 
131  }
132
133  @Benchmark
134  @BenchmarkMode({Mode.AverageTime})
135  @OutputTimeUnit(TimeUnit.NANOSECONDS)
136  public void codahaleCounterDecBenchmark() {
137    codahaleCounter.dec();
138  }
139
140  // Set.
141  @Benchmark
142  @BenchmarkMode({Mode.AverageTime})
143  @OutputTimeUnit(TimeUnit.NANOSECONDS)
144  public void prometheusGaugeSetBenchmark() {
145    prometheusGauge.newPartial().apply().set(42);
146  }
147
148  @Benchmark
149  @BenchmarkMode({Mode.AverageTime})
150  @OutputTimeUnit(TimeUnit.NANOSECONDS)
151  public void prometheusGaugeChildSetBenchmark() {
152    prometheusGaugeChild.set(42);
153  }
154
155  @Benchmark
156  @BenchmarkMode({Mode.AverageTime})
157  @OutputTimeUnit(TimeUnit.NANOSECONDS)
158  public void prometheusSimpleGaugeSetBenchmark() {
159    prometheusSimpleGauge.labels("test", "group").set(42); 
160  }
161  
162  @Benchmark
163  @BenchmarkMode({Mode.AverageTime})
164  @OutputTimeUnit(TimeUnit.NANOSECONDS)
165  public void prometheusSimpleGaugeChildSetBenchmark() {
166    prometheusSimpleGaugeChild.set(42);
167  }
168
169  @Benchmark
170  @BenchmarkMode({Mode.AverageTime})
171  @OutputTimeUnit(TimeUnit.NANOSECONDS)
172  public void prometheusSimpleGaugeNoLabelsSetBenchmark() {
173    prometheusSimpleGaugeNoLabels.set(42); 
174  }
175
176  public static void main(String[] args) throws RunnerException {
177
178    Options opt = new OptionsBuilder()
179      .include(GaugeBenchmark.class.getSimpleName())
180      .warmupIterations(5)
181      .measurementIterations(4)
182      .threads(4)
183      .forks(1)
184      .build();
185
186    new Runner(opt).run();
187  }
188}