TD-111381: Sketch of Proof of Concept for Prometheus Client migration

pull/2223/head
Krzysztof Zielinski 7 months ago
parent a28b6ec81d
commit bd4b92ebfa

@ -37,10 +37,12 @@
<jndi.version>0.11.4.1</jndi.version>
<maven.release.version>3.0.1</maven.release.version>
<metrics.version>3.2.5</metrics.version>
<metrics5.version>5.0.0-rc17</metrics5.version>
<micrometer.version>1.5.10</micrometer.version>
<metrics5.version>5.0.0-rc17</metrics5.version>
<!-- 1.5.10-->
<micrometer.version>1.13.2</micrometer.version>
<simpleclient.version>0.16.0</simpleclient.version>
<mockito.version>3.7.7</mockito.version>
<prometheus-metrics.version>1.3.1</prometheus-metrics.version>
<mockito.version>3.7.7</mockito.version>
<pax.exam.version>4.13.5</pax.exam.version>
<pax.url.version>2.5.4</pax.url.version>
<postgresql.version>42.7.4</postgresql.version>
@ -202,7 +204,14 @@
<scope>provided</scope>
<optional>true</optional>
</dependency>
<dependency>
<dependency>
<groupId>io.dropwizard.metrics5</groupId>
<artifactId>metrics-core</artifactId>
<version>${metrics5.version}</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.dropwizard.metrics5</groupId>
<artifactId>metrics-core</artifactId>
<version>${metrics5.version}</version>
@ -210,12 +219,26 @@
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient</artifactId>
<version>${simpleclient.version}</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>
<groupId>io.prometheus</groupId>
<artifactId>prometheus-metrics-core</artifactId>
<version>${prometheus-metrics.version}</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>prometheus-metrics-instrumentation-jvm</artifactId>
<version>${prometheus-metrics.version}</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>prometheus-metrics-exporter-httpserver</artifactId>
<version>${prometheus-metrics.version}</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>simple-jndi</groupId>
<artifactId>simple-jndi</artifactId>

@ -17,27 +17,25 @@
package com.zaxxer.hikari.metrics.prometheus;
import com.zaxxer.hikari.metrics.PoolStats;
import io.prometheus.client.Collector;
import io.prometheus.client.GaugeMetricFamily;
import io.prometheus.metrics.model.registry.MultiCollector;
import io.prometheus.metrics.model.snapshots.GaugeSnapshot;
import io.prometheus.metrics.model.snapshots.Labels;
import io.prometheus.metrics.model.snapshots.MetricMetadata;
import io.prometheus.metrics.model.snapshots.MetricSnapshots;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
class HikariCPCollector extends Collector
class HikariCPCollector implements MultiCollector
{
private static final List<String> LABEL_NAMES = Collections.singletonList("pool");
private final Map<String, PoolStats> poolStatsMap = new ConcurrentHashMap<>();
@Override
public List<MetricFamilySamples> collect()
public MetricSnapshots collect()
{
return Arrays.asList(
return new MetricSnapshots(Arrays.asList(
createGauge("hikaricp_active_connections", "Active connections",
PoolStats::getActiveConnections),
createGauge("hikaricp_idle_connections", "Idle connections",
@ -50,7 +48,7 @@ class HikariCPCollector extends Collector
PoolStats::getMaxConnections),
createGauge("hikaricp_min_connections", "Min connections",
PoolStats::getMinConnections)
);
));
}
void add(String name, PoolStats poolStats)
@ -63,14 +61,13 @@ class HikariCPCollector extends Collector
poolStatsMap.remove(name);
}
private GaugeMetricFamily createGauge(String metric, String help,
Function<PoolStats, Integer> metricValueFunction)
private GaugeSnapshot createGauge(String metric, String help,
Function<PoolStats, Integer> metricValueFunction)
{
var metricFamily = new GaugeMetricFamily(metric, help, LABEL_NAMES);
poolStatsMap.forEach((k, v) -> metricFamily.addMetric(
Collections.singletonList(k),
metricValueFunction.apply(v)
Collection<GaugeSnapshot.GaugeDataPointSnapshot> gaugeDataPointSnapshots = new ArrayList<>();
poolStatsMap.forEach((k, v) -> gaugeDataPointSnapshots.add(
new GaugeSnapshot.GaugeDataPointSnapshot(metricValueFunction.apply(v), Labels.of(k), null)
));
return metricFamily;
return new GaugeSnapshot(new MetricMetadata(metric, help), gaugeDataPointSnapshots);
}
}

@ -16,9 +16,11 @@
package com.zaxxer.hikari.metrics.prometheus;
import com.zaxxer.hikari.metrics.IMetricsTracker;
import io.prometheus.client.CollectorRegistry;
import io.prometheus.client.Counter;
import io.prometheus.client.Histogram;
import io.prometheus.metrics.core.datapoints.CounterDataPoint;
import io.prometheus.metrics.core.datapoints.DistributionDataPoint;
import io.prometheus.metrics.core.metrics.Histogram;
import io.prometheus.metrics.model.registry.PrometheusRegistry;
import io.prometheus.metrics.core.metrics.Counter;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@ -36,11 +38,11 @@ import static com.zaxxer.hikari.metrics.prometheus.PrometheusMetricsTrackerFacto
*/
class PrometheusHistogramMetricsTracker implements IMetricsTracker
{
private static final Counter CONNECTION_TIMEOUT_COUNTER = Counter.build()
private static final Counter CONNECTION_TIMEOUT_COUNTER = Counter.builder()
.name("hikaricp_connection_timeout_total")
.labelNames("pool")
.help("Connection timeout total count")
.create();
.register();
private static final Histogram ELAPSED_ACQUIRED_HISTOGRAM =
registerHistogram("hikaricp_connection_acquired_nanos", "Connection acquired time (ns)", 1_000);
@ -51,42 +53,42 @@ class PrometheusHistogramMetricsTracker implements IMetricsTracker
private static final Histogram ELAPSED_CREATION_HISTOGRAM =
registerHistogram("hikaricp_connection_creation_millis", "Connection creation (ms)", 1);
private final Counter.Child connectionTimeoutCounterChild;
private final CounterDataPoint connectionTimeoutCounterChild;
private static Histogram registerHistogram(String name, String help, double bucketStart) {
return Histogram.build()
return Histogram.builder()
.name(name)
.labelNames("pool")
.help(help)
.exponentialBuckets(bucketStart, 2.0, 11)
.create();
.classicExponentialUpperBounds(bucketStart, 2.0, 11)
.register();
}
private final static Map<CollectorRegistry, RegistrationStatus> registrationStatuses = new ConcurrentHashMap<>();
private final static Map<PrometheusRegistry, RegistrationStatus> registrationStatuses = new ConcurrentHashMap<>();
private final String poolName;
private final HikariCPCollector hikariCPCollector;
private final Histogram.Child elapsedAcquiredHistogramChild;
private final Histogram.Child elapsedBorrowedHistogramChild;
private final Histogram.Child elapsedCreationHistogramChild;
private final DistributionDataPoint elapsedAcquiredHistogramChild;
private final DistributionDataPoint elapsedBorrowedHistogramChild;
private final DistributionDataPoint elapsedCreationHistogramChild;
PrometheusHistogramMetricsTracker(String poolName, CollectorRegistry collectorRegistry, HikariCPCollector hikariCPCollector) {
PrometheusHistogramMetricsTracker(String poolName, PrometheusRegistry collectorRegistry, HikariCPCollector hikariCPCollector) {
registerMetrics(collectorRegistry);
this.poolName = poolName;
this.hikariCPCollector = hikariCPCollector;
this.connectionTimeoutCounterChild = CONNECTION_TIMEOUT_COUNTER.labels(poolName);
this.elapsedAcquiredHistogramChild = ELAPSED_ACQUIRED_HISTOGRAM.labels(poolName);
this.elapsedBorrowedHistogramChild = ELAPSED_BORROWED_HISTOGRAM.labels(poolName);
this.elapsedCreationHistogramChild = ELAPSED_CREATION_HISTOGRAM.labels(poolName);
this.connectionTimeoutCounterChild = CONNECTION_TIMEOUT_COUNTER.labelValues(poolName);
this.elapsedAcquiredHistogramChild = ELAPSED_ACQUIRED_HISTOGRAM.labelValues(poolName);
this.elapsedBorrowedHistogramChild = ELAPSED_BORROWED_HISTOGRAM.labelValues(poolName);
this.elapsedCreationHistogramChild = ELAPSED_CREATION_HISTOGRAM.labelValues(poolName);
}
private void registerMetrics(CollectorRegistry collectorRegistry) {
private void registerMetrics(PrometheusRegistry collectorRegistry) {
if (registrationStatuses.putIfAbsent(collectorRegistry, REGISTERED) == null) {
CONNECTION_TIMEOUT_COUNTER.register(collectorRegistry);
ELAPSED_ACQUIRED_HISTOGRAM.register(collectorRegistry);
ELAPSED_BORROWED_HISTOGRAM.register(collectorRegistry);
ELAPSED_CREATION_HISTOGRAM.register(collectorRegistry);
collectorRegistry.register(CONNECTION_TIMEOUT_COUNTER);
collectorRegistry.register(ELAPSED_ACQUIRED_HISTOGRAM);
collectorRegistry.register(ELAPSED_BORROWED_HISTOGRAM);
collectorRegistry.register(ELAPSED_CREATION_HISTOGRAM);
}
}

@ -20,13 +20,13 @@ import com.zaxxer.hikari.metrics.IMetricsTracker;
import com.zaxxer.hikari.metrics.MetricsTrackerFactory;
import com.zaxxer.hikari.metrics.PoolStats;
import com.zaxxer.hikari.metrics.prometheus.PrometheusMetricsTrackerFactory.RegistrationStatus;
import io.prometheus.client.Collector;
import io.prometheus.client.CollectorRegistry;
import io.prometheus.metrics.model.registry.MultiCollector;
import io.prometheus.metrics.model.registry.PrometheusRegistry;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import static com.zaxxer.hikari.metrics.prometheus.PrometheusMetricsTrackerFactory.RegistrationStatus.*;
import static com.zaxxer.hikari.metrics.prometheus.PrometheusMetricsTrackerFactory.RegistrationStatus.REGISTERED;
/**
* <pre>{@code
@ -36,25 +36,25 @@ import static com.zaxxer.hikari.metrics.prometheus.PrometheusMetricsTrackerFacto
*/
public class PrometheusHistogramMetricsTrackerFactory implements MetricsTrackerFactory {
private final static Map<CollectorRegistry, RegistrationStatus> registrationStatuses = new ConcurrentHashMap<>();
private final static Map<PrometheusRegistry, RegistrationStatus> registrationStatuses = new ConcurrentHashMap<>();
private final HikariCPCollector collector = new HikariCPCollector();
private final CollectorRegistry collectorRegistry;
private final PrometheusRegistry collectorRegistry;
/**
* Default Constructor. The Hikari metrics are registered to the default
* collector registry ({@code CollectorRegistry.defaultRegistry}).
*/
public PrometheusHistogramMetricsTrackerFactory() {
this(CollectorRegistry.defaultRegistry);
this(new PrometheusRegistry());
}
/**
* Constructor that allows to pass in a {@link CollectorRegistry} to which the
* Constructor that allows to pass in a {@link PrometheusRegistry} to which the
* Hikari metrics are registered.
*/
public PrometheusHistogramMetricsTrackerFactory(CollectorRegistry collectorRegistry) {
public PrometheusHistogramMetricsTrackerFactory(PrometheusRegistry collectorRegistry) {
this.collectorRegistry = collectorRegistry;
}
@ -65,9 +65,9 @@ public class PrometheusHistogramMetricsTrackerFactory implements MetricsTrackerF
return new PrometheusHistogramMetricsTracker(poolName, this.collectorRegistry, this.collector);
}
private void registerCollector(Collector collector, CollectorRegistry collectorRegistry) {
private void registerCollector(MultiCollector collector, PrometheusRegistry collectorRegistry) {
if (registrationStatuses.putIfAbsent(collectorRegistry, REGISTERED) == null) {
collector.register(collectorRegistry);
collectorRegistry.register(collector);
}
}
}

@ -18,9 +18,11 @@ package com.zaxxer.hikari.metrics.prometheus;
import com.zaxxer.hikari.metrics.IMetricsTracker;
import com.zaxxer.hikari.metrics.prometheus.PrometheusMetricsTrackerFactory.RegistrationStatus;
import io.prometheus.client.CollectorRegistry;
import io.prometheus.client.Counter;
import io.prometheus.client.Summary;
import io.prometheus.metrics.core.datapoints.CounterDataPoint;
import io.prometheus.metrics.core.datapoints.DistributionDataPoint;
import io.prometheus.metrics.core.metrics.Counter;
import io.prometheus.metrics.core.metrics.Summary;
import io.prometheus.metrics.model.registry.PrometheusRegistry;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@ -30,11 +32,11 @@ import static com.zaxxer.hikari.metrics.prometheus.PrometheusMetricsTrackerFacto
class PrometheusMetricsTracker implements IMetricsTracker
{
private final static Counter CONNECTION_TIMEOUT_COUNTER = Counter.build()
private final static Counter CONNECTION_TIMEOUT_COUNTER = Counter.builder()
.name("hikaricp_connection_timeout_total")
.labelNames("pool")
.help("Connection timeout total count")
.create();
.register();
private final static Summary ELAPSED_ACQUIRED_SUMMARY =
createSummary("hikaricp_connection_acquired_nanos", "Connection acquired time (ns)");
@ -45,35 +47,35 @@ class PrometheusMetricsTracker implements IMetricsTracker
private final static Summary ELAPSED_CREATION_SUMMARY =
createSummary("hikaricp_connection_creation_millis", "Connection creation (ms)");
private final static Map<CollectorRegistry, RegistrationStatus> registrationStatuses = new ConcurrentHashMap<>();
private final static Map<PrometheusRegistry, RegistrationStatus> registrationStatuses = new ConcurrentHashMap<>();
private final String poolName;
private final HikariCPCollector hikariCPCollector;
private final Counter.Child connectionTimeoutCounterChild;
private final CounterDataPoint connectionTimeoutCounterChild;
private final Summary.Child elapsedAcquiredSummaryChild;
private final Summary.Child elapsedUsageSummaryChild;
private final Summary.Child elapsedCreationSummaryChild;
private final DistributionDataPoint elapsedAcquiredSummaryChild;
private final DistributionDataPoint elapsedUsageSummaryChild;
private final DistributionDataPoint elapsedCreationSummaryChild;
PrometheusMetricsTracker(String poolName, CollectorRegistry collectorRegistry, HikariCPCollector hikariCPCollector)
PrometheusMetricsTracker(String poolName, PrometheusRegistry collectorRegistry, HikariCPCollector hikariCPCollector)
{
registerMetrics(collectorRegistry);
this.poolName = poolName;
this.hikariCPCollector = hikariCPCollector;
this.connectionTimeoutCounterChild = CONNECTION_TIMEOUT_COUNTER.labels(poolName);
this.elapsedAcquiredSummaryChild = ELAPSED_ACQUIRED_SUMMARY.labels(poolName);
this.elapsedUsageSummaryChild = ELAPSED_USAGE_SUMMARY.labels(poolName);
this.elapsedCreationSummaryChild = ELAPSED_CREATION_SUMMARY.labels(poolName);
this.connectionTimeoutCounterChild = CONNECTION_TIMEOUT_COUNTER.labelValues(poolName);
this.elapsedAcquiredSummaryChild = ELAPSED_ACQUIRED_SUMMARY.labelValues(poolName);
this.elapsedUsageSummaryChild = ELAPSED_USAGE_SUMMARY.labelValues(poolName);
this.elapsedCreationSummaryChild = ELAPSED_CREATION_SUMMARY.labelValues(poolName);
}
private void registerMetrics(CollectorRegistry collectorRegistry)
private void registerMetrics(PrometheusRegistry collectorRegistry)
{
if (registrationStatuses.putIfAbsent(collectorRegistry, REGISTERED) == null) {
CONNECTION_TIMEOUT_COUNTER.register(collectorRegistry);
ELAPSED_ACQUIRED_SUMMARY.register(collectorRegistry);
ELAPSED_USAGE_SUMMARY.register(collectorRegistry);
ELAPSED_CREATION_SUMMARY.register(collectorRegistry);
collectorRegistry.register(CONNECTION_TIMEOUT_COUNTER);
collectorRegistry.register(ELAPSED_ACQUIRED_SUMMARY);
collectorRegistry.register(ELAPSED_USAGE_SUMMARY);
collectorRegistry.register(ELAPSED_CREATION_SUMMARY);
}
}
@ -103,7 +105,7 @@ class PrometheusMetricsTracker implements IMetricsTracker
private static Summary createSummary(String name, String help)
{
return Summary.build()
return Summary.builder()
.name(name)
.labelNames("pool")
.help(help)
@ -111,8 +113,8 @@ class PrometheusMetricsTracker implements IMetricsTracker
.quantile(0.95, 0.01)
.quantile(0.99, 0.001)
.maxAgeSeconds(TimeUnit.MINUTES.toSeconds(5))
.ageBuckets(5)
.create();
.numberOfAgeBuckets(5)
.register();
}
@Override

@ -19,8 +19,9 @@ package com.zaxxer.hikari.metrics.prometheus;
import com.zaxxer.hikari.metrics.IMetricsTracker;
import com.zaxxer.hikari.metrics.MetricsTrackerFactory;
import com.zaxxer.hikari.metrics.PoolStats;
import io.prometheus.client.Collector;
import io.prometheus.client.CollectorRegistry;
import io.prometheus.metrics.model.registry.Collector;
import io.prometheus.metrics.model.registry.MultiCollector;
import io.prometheus.metrics.model.registry.PrometheusRegistry;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@ -43,11 +44,11 @@ import static com.zaxxer.hikari.metrics.prometheus.PrometheusMetricsTrackerFacto
public class PrometheusMetricsTrackerFactory implements MetricsTrackerFactory
{
private final static Map<CollectorRegistry, RegistrationStatus> registrationStatuses = new ConcurrentHashMap<>();
private final static Map<PrometheusRegistry, RegistrationStatus> registrationStatuses = new ConcurrentHashMap<>();
private final HikariCPCollector collector = new HikariCPCollector();
private final CollectorRegistry collectorRegistry;
private final PrometheusRegistry collectorRegistry;
enum RegistrationStatus
{
@ -60,14 +61,14 @@ public class PrometheusMetricsTrackerFactory implements MetricsTrackerFactory
*/
public PrometheusMetricsTrackerFactory()
{
this(CollectorRegistry.defaultRegistry);
this(PrometheusRegistry.defaultRegistry);
}
/**
* Constructor that allows to pass in a {@link CollectorRegistry} to which the
* Constructor that allows to pass in a {@link PrometheusRegistry} to which the
* Hikari metrics are registered.
*/
public PrometheusMetricsTrackerFactory(CollectorRegistry collectorRegistry)
public PrometheusMetricsTrackerFactory(PrometheusRegistry collectorRegistry)
{
this.collectorRegistry = collectorRegistry;
}
@ -80,10 +81,10 @@ public class PrometheusMetricsTrackerFactory implements MetricsTrackerFactory
return new PrometheusMetricsTracker(poolName, this.collectorRegistry, this.collector);
}
private void registerCollector(Collector collector, CollectorRegistry collectorRegistry)
private void registerCollector(MultiCollector collector, PrometheusRegistry collectorRegistry)
{
if (registrationStatuses.putIfAbsent(collectorRegistry, REGISTERED) == null) {
collector.register(collectorRegistry);
collectorRegistry.register(collector);
}
}
}

@ -5,12 +5,13 @@ module com.zaxxer.hikari
requires java.naming;
requires org.slf4j;
requires static org.hibernate.orm.core;
requires static simpleclient;
requires static metrics.core;
requires static metrics.healthchecks;
requires static io.dropwizard.metrics5;
requires static micrometer.core;
requires static org.javassist;
requires static io.prometheus.metrics.core;
requires static io.prometheus.metrics.model;
exports com.zaxxer.hikari;
exports com.zaxxer.hikari.hibernate;

@ -26,7 +26,9 @@ import java.sql.Connection;
import java.util.List;
import com.zaxxer.hikari.metrics.PoolStats;
import io.prometheus.client.Collector;
import io.prometheus.metrics.model.registry.MultiCollector;
import io.prometheus.metrics.model.registry.PrometheusRegistry;
import io.prometheus.metrics.model.snapshots.MetricSnapshots;
import org.junit.Before;
import org.junit.Test;
@ -34,17 +36,15 @@ import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import com.zaxxer.hikari.mocks.StubConnection;
import io.prometheus.client.CollectorRegistry;
public class HikariCPCollectorTest
{
private CollectorRegistry collectorRegistry;
private PrometheusRegistry collectorRegistry;
@Before
public void setupCollectorRegistry()
{
this.collectorRegistry = new CollectorRegistry();
this.collectorRegistry = new PrometheusRegistry();
}
@Test
@ -183,11 +183,11 @@ public class HikariCPCollectorTest
{
HikariCPCollector hikariCPCollector = new HikariCPCollector();
hikariCPCollector.add("collectorTestPool", poolStatsWithPredefinedValues());
List<Collector.MetricFamilySamples> metrics = hikariCPCollector.collect();
hikariCPCollector.register(collectorRegistry);
MetricSnapshots metrics = hikariCPCollector.collect();
collectorRegistry.register(hikariCPCollector);
assertThat(metrics.size(), is(6));
assertThat(metrics.stream().filter(metricFamilySamples -> metricFamilySamples.type == Collector.Type.GAUGE).count(), is(6L));
// assertThat(metrics.stream().filter(metricFamilySamples -> metricFamilySamples.type == Collector.Type.GAUGE).count(), is(6L));
assertThat(getValue("hikaricp_active_connections", "collectorTestPool"), is(58.0));
assertThat(getValue("hikaricp_idle_connections", "collectorTestPool"), is(42.0));
assertThat(getValue("hikaricp_pending_threads", "collectorTestPool"), is(1.0));

@ -3,12 +3,16 @@ package com.zaxxer.hikari.metrics.prometheus;
import com.zaxxer.hikari.metrics.PoolStats;
import io.prometheus.client.Collector;
import io.prometheus.client.CollectorRegistry;
import io.prometheus.metrics.model.registry.PrometheusRegistry;
import io.prometheus.metrics.model.snapshots.MetricSnapshot;
import io.prometheus.metrics.model.snapshots.MetricSnapshots;
import org.junit.After;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.stream.Collectors;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@ -17,11 +21,11 @@ public class PrometheusHistogramMetricsTrackerFactoryTest {
@Test
public void registersToProvidedCollectorRegistry() {
CollectorRegistry collectorRegistry = new CollectorRegistry();
PrometheusRegistry collectorRegistry = new PrometheusRegistry();
PrometheusHistogramMetricsTrackerFactory factory =
new PrometheusHistogramMetricsTrackerFactory(collectorRegistry);
factory.create("testpool-1", poolStats());
assertHikariMetricsAreNotPresent(CollectorRegistry.defaultRegistry);
assertHikariMetricsAreNotPresent(PrometheusRegistry.defaultRegistry);
assertHikariMetricsArePresent(collectorRegistry);
}
@ -29,16 +33,16 @@ public class PrometheusHistogramMetricsTrackerFactoryTest {
public void registersToDefaultCollectorRegistry() {
PrometheusHistogramMetricsTrackerFactory factory = new PrometheusHistogramMetricsTrackerFactory();
factory.create("testpool-2", poolStats());
assertHikariMetricsArePresent(CollectorRegistry.defaultRegistry);
assertHikariMetricsArePresent(PrometheusRegistry.defaultRegistry);
}
@After
public void clearCollectorRegistry(){
CollectorRegistry.defaultRegistry.clear();
// PrometheusRegistry.defaultRegistry.clear();
}
private void assertHikariMetricsArePresent(CollectorRegistry collectorRegistry) {
List<String> registeredMetrics = toMetricNames(collectorRegistry.metricFamilySamples());
private void assertHikariMetricsArePresent(PrometheusRegistry collectorRegistry) {
List<String> registeredMetrics = toMetricNames(collectorRegistry.scrape());
assertTrue(registeredMetrics.contains("hikaricp_active_connections"));
assertTrue(registeredMetrics.contains("hikaricp_idle_connections"));
assertTrue(registeredMetrics.contains("hikaricp_pending_threads"));
@ -47,8 +51,8 @@ public class PrometheusHistogramMetricsTrackerFactoryTest {
assertTrue(registeredMetrics.contains("hikaricp_min_connections"));
}
private void assertHikariMetricsAreNotPresent(CollectorRegistry collectorRegistry) {
List<String> registeredMetrics = toMetricNames(collectorRegistry.metricFamilySamples());
private void assertHikariMetricsAreNotPresent(PrometheusRegistry collectorRegistry) {
List<String> registeredMetrics = toMetricNames(collectorRegistry.scrape());
assertFalse(registeredMetrics.contains("hikaricp_active_connections"));
assertFalse(registeredMetrics.contains("hikaricp_idle_connections"));
assertFalse(registeredMetrics.contains("hikaricp_pending_threads"));
@ -57,12 +61,8 @@ public class PrometheusHistogramMetricsTrackerFactoryTest {
assertFalse(registeredMetrics.contains("hikaricp_min_connections"));
}
private List<String> toMetricNames(Enumeration<Collector.MetricFamilySamples> enumeration) {
List<String> list = new ArrayList<>();
while (enumeration.hasMoreElements()) {
list.add(enumeration.nextElement().name);
}
return list;
private List<String> toMetricNames(MetricSnapshots metricSnapshots) {
return metricSnapshots.stream().map(metricSnapshot -> metricSnapshot.getMetadata().getName()).collect(Collectors.toList());
}
private PoolStats poolStats() {

@ -18,7 +18,7 @@ package com.zaxxer.hikari.metrics.prometheus;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import io.prometheus.client.CollectorRegistry;
import io.prometheus.metrics.model.registry.PrometheusRegistry;
import org.junit.Before;
import org.junit.Test;
@ -32,16 +32,16 @@ import static org.hamcrest.MatcherAssert.assertThat;
public class PrometheusHistogramMetricsTrackerTest {
private CollectorRegistry defaultCollectorRegistry;
private CollectorRegistry customCollectorRegistry;
private PrometheusRegistry defaultCollectorRegistry;
private PrometheusRegistry customCollectorRegistry;
private static final String POOL_LABEL_NAME = "pool";
private static final String[] LABEL_NAMES = {POOL_LABEL_NAME};
@Before
public void setupCollectorRegistry() {
this.defaultCollectorRegistry = new CollectorRegistry();
this.customCollectorRegistry = new CollectorRegistry();
this.defaultCollectorRegistry = new PrometheusRegistry();
this.customCollectorRegistry = new PrometheusRegistry();
}
@Test

@ -3,12 +3,16 @@ package com.zaxxer.hikari.metrics.prometheus;
import com.zaxxer.hikari.mocks.StubPoolStats;
import io.prometheus.client.Collector;
import io.prometheus.client.CollectorRegistry;
import io.prometheus.metrics.model.registry.PrometheusRegistry;
import io.prometheus.metrics.model.snapshots.MetricSnapshot;
import io.prometheus.metrics.model.snapshots.MetricSnapshots;
import org.junit.After;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.stream.Collectors;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@ -19,16 +23,16 @@ public class PrometheusMetricsTrackerFactoryTest
@After
public void clearCollectorRegistry()
{
CollectorRegistry.defaultRegistry.clear();
// PrometheusRegistry.defaultRegistry.clear();
}
@Test
public void registersToProvidedCollectorRegistry()
{
CollectorRegistry collectorRegistry = new CollectorRegistry();
PrometheusRegistry collectorRegistry = new PrometheusRegistry();
PrometheusMetricsTrackerFactory factory = new PrometheusMetricsTrackerFactory(collectorRegistry);
factory.create("testpool-1", new StubPoolStats(0));
assertHikariMetricsAreNotPresent(CollectorRegistry.defaultRegistry);
assertHikariMetricsAreNotPresent(PrometheusRegistry.defaultRegistry);
assertHikariMetricsArePresent(collectorRegistry);
}
@ -37,12 +41,12 @@ public class PrometheusMetricsTrackerFactoryTest
{
PrometheusMetricsTrackerFactory factory = new PrometheusMetricsTrackerFactory();
factory.create("testpool-2", new StubPoolStats(0));
assertHikariMetricsArePresent(CollectorRegistry.defaultRegistry);
assertHikariMetricsArePresent(PrometheusRegistry.defaultRegistry);
}
private void assertHikariMetricsArePresent(CollectorRegistry collectorRegistry)
private void assertHikariMetricsArePresent(PrometheusRegistry collectorRegistry)
{
List<String> registeredMetrics = toMetricNames(collectorRegistry.metricFamilySamples());
List<String> registeredMetrics = toMetricNames(collectorRegistry.scrape());
assertTrue(registeredMetrics.contains("hikaricp_active_connections"));
assertTrue(registeredMetrics.contains("hikaricp_idle_connections"));
assertTrue(registeredMetrics.contains("hikaricp_pending_threads"));
@ -51,9 +55,9 @@ public class PrometheusMetricsTrackerFactoryTest
assertTrue(registeredMetrics.contains("hikaricp_min_connections"));
}
private void assertHikariMetricsAreNotPresent(CollectorRegistry collectorRegistry)
private void assertHikariMetricsAreNotPresent(PrometheusRegistry collectorRegistry)
{
List<String> registeredMetrics = toMetricNames(collectorRegistry.metricFamilySamples());
List<String> registeredMetrics = toMetricNames(collectorRegistry.scrape());
assertFalse(registeredMetrics.contains("hikaricp_active_connections"));
assertFalse(registeredMetrics.contains("hikaricp_idle_connections"));
assertFalse(registeredMetrics.contains("hikaricp_pending_threads"));
@ -62,12 +66,9 @@ public class PrometheusMetricsTrackerFactoryTest
assertFalse(registeredMetrics.contains("hikaricp_min_connections"));
}
private List<String> toMetricNames(Enumeration<Collector.MetricFamilySamples> enumeration)
private List<String> toMetricNames(MetricSnapshots metricSnapshots)
{
List<String> list = new ArrayList<>();
while (enumeration.hasMoreElements()) {
list.add(enumeration.nextElement().name);
}
return list;
return metricSnapshots.stream().map(metricSnapshot -> metricSnapshot.getMetadata().getName()).collect(Collectors.toList());
}
}

@ -20,7 +20,7 @@ import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import com.zaxxer.hikari.metrics.IMetricsTracker;
import com.zaxxer.hikari.mocks.StubPoolStats;
import io.prometheus.client.CollectorRegistry;
import io.prometheus.metrics.model.registry.PrometheusRegistry;
import org.junit.Before;
import org.junit.Test;
@ -36,8 +36,8 @@ import static org.hamcrest.MatcherAssert.assertThat;
public class PrometheusMetricsTrackerTest
{
private CollectorRegistry defaultCollectorRegistry;
private CollectorRegistry customCollectorRegistry;
private PrometheusRegistry defaultCollectorRegistry;
private PrometheusRegistry customCollectorRegistry;
private static final String POOL_LABEL_NAME = "pool";
private static final String[] LABEL_NAMES = {POOL_LABEL_NAME};
@ -48,8 +48,8 @@ public class PrometheusMetricsTrackerTest
@Before
public void setupCollectorRegistry()
{
this.defaultCollectorRegistry = new CollectorRegistry();
this.customCollectorRegistry = new CollectorRegistry();
this.defaultCollectorRegistry = new PrometheusRegistry();
this.customCollectorRegistry = new PrometheusRegistry();
}
@Test

Loading…
Cancel
Save