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}