Added support for non-default Prometheus CollectorRegistry (#876)

* Added support for using a Prometheus CollectorRegistry other than the default one

* Fixed a broken test
pull/888/head
Lorenzo Lucherini 8 years ago committed by Brett Wooldridge
parent 3b8d964191
commit b626396496

@ -34,17 +34,20 @@ class PrometheusMetricsTracker implements IMetricsTracker
private final Summary eaSummary;
private final Summary ebSummary;
private final Summary ecSummary;
private final Collector collector;
private final CollectorRegistry registry;
PrometheusMetricsTracker(String poolName, Collector collector)
PrometheusMetricsTracker(String poolName, Collector collector, CollectorRegistry registry)
{
this.collector = collector;
this.registry = registry;
ctCounter = Counter.build()
.name("hikaricp_connection_timeout_count")
.labelNames("pool")
.help("Connection timeout count")
.register();
.register(registry);
this.connectionTimeoutCounter = ctCounter.labels(poolName);
@ -52,32 +55,32 @@ class PrometheusMetricsTracker implements IMetricsTracker
.name("hikaricp_connection_acquired_nanos")
.labelNames("pool")
.help("Connection acquired time (ns)")
.register();
.register(registry);
this.elapsedAcquiredSummary = eaSummary.labels(poolName);
ebSummary = Summary.build()
.name("hikaricp_connection_usage_millis")
.labelNames("pool")
.help("Connection usage (ms)")
.register();
.register(registry);
this.elapsedBorrowedSummary = ebSummary.labels(poolName);
ecSummary = Summary.build()
.name("hikaricp_connection_creation_millis")
.labelNames("pool")
.help("Connection creation (ms)")
.register();
.register(registry);
this.elapsedCreationSummary = ecSummary.labels(poolName);
}
@Override
public void close()
{
CollectorRegistry.defaultRegistry.unregister(ctCounter);
CollectorRegistry.defaultRegistry.unregister(eaSummary);
CollectorRegistry.defaultRegistry.unregister(ebSummary);
CollectorRegistry.defaultRegistry.unregister(ecSummary);
CollectorRegistry.defaultRegistry.unregister(collector);
registry.unregister(ctCounter);
registry.unregister(eaSummary);
registry.unregister(ebSummary);
registry.unregister(ecSummary);
registry.unregister(collector);
}
@Override

@ -21,6 +21,7 @@ import com.zaxxer.hikari.metrics.MetricsTrackerFactory;
import com.zaxxer.hikari.metrics.PoolStats;
import io.prometheus.client.Collector;
import io.prometheus.client.CollectorRegistry;
/**
* <pre>{@code
@ -30,10 +31,21 @@ import io.prometheus.client.Collector;
*/
public class PrometheusMetricsTrackerFactory implements MetricsTrackerFactory
{
private final CollectorRegistry registry;
public PrometheusMetricsTrackerFactory() {
this(CollectorRegistry.defaultRegistry);
}
public PrometheusMetricsTrackerFactory(CollectorRegistry registry) {
this.registry = registry;
}
@Override
public IMetricsTracker create(String poolName, PoolStats poolStats)
{
Collector collector = new HikariCPCollector(poolName, poolStats).register();
return new PrometheusMetricsTracker(poolName, collector);
Collector collector = new HikariCPCollector(poolName, poolStats).register(registry);
return new PrometheusMetricsTracker(poolName, collector, registry);
}
}

@ -19,17 +19,16 @@ package com.zaxxer.hikari.metrics.prometheus;
import static com.zaxxer.hikari.pool.TestElf.newHikariConfig;
import static com.zaxxer.hikari.util.UtilityElf.quietlySleep;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
import java.sql.Connection;
import org.junit.Test;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import com.zaxxer.hikari.mocks.StubConnection;
import io.prometheus.client.CollectorRegistry;
import org.junit.Test;
import java.sql.Connection;
public class HikariCPCollectorTest {
@Test
@ -117,10 +116,32 @@ public class HikariCPCollectorTest {
}
}
private double getValue(String name, String poolName) {
@Test
public void checkRegistry() {
HikariConfig config = newHikariConfig();
config.setMinimumIdle(0);
CollectorRegistry customRegistry = new CollectorRegistry();
config.setMetricsTrackerFactory(new PrometheusMetricsTrackerFactory(customRegistry));
config.setDataSourceClassName("com.zaxxer.hikari.mocks.StubDataSource");
StubConnection.slowCreate = true;
try (HikariDataSource ds = new HikariDataSource(config)) {
assertThat(getValue("hikaricp_active_connections", "checkRegistry", customRegistry), is(0.0));
assertThat(getValue("hikaricp_active_connections", "checkRegistry"), is(nullValue()));
}
finally {
StubConnection.slowCreate = false;
}
}
private Double getValue(String name, String poolName) {
return this.getValue(name, poolName, CollectorRegistry.defaultRegistry);
}
private Double getValue(String name, String poolName, CollectorRegistry registry) {
String[] labelNames = {"pool"};
String[] labelValues = {poolName};
return CollectorRegistry.defaultRegistry.getSampleValue(name, labelNames, labelValues);
return registry.getSampleValue(name, labelNames, labelValues);
}
}

@ -19,20 +19,20 @@ package com.zaxxer.hikari.metrics.prometheus;
import static com.zaxxer.hikari.pool.TestElf.newHikariConfig;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.sql.Connection;
import java.sql.SQLTransientConnectionException;
import org.junit.Test;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import io.prometheus.client.CollectorRegistry;
import org.junit.Test;
import java.sql.Connection;
import java.sql.SQLTransientConnectionException;
public class PrometheusMetricsTrackerTest {
@Test
public void recordConnectionTimeout() throws Exception {
HikariConfig config = newHikariConfig();
@ -40,7 +40,7 @@ public class PrometheusMetricsTrackerTest {
config.setJdbcUrl("jdbc:h2:mem:");
config.setMaximumPoolSize(2);
config.setConnectionTimeout(250);
String[] labelNames = {"pool"};
String[] labelValues = {config.getPoolName()};
@ -75,4 +75,28 @@ public class PrometheusMetricsTrackerTest {
labelValues) > 0.0);
}
}
@Test
public void testThatTheProperRegistryIsUsed() throws Exception {
HikariConfig config = newHikariConfig();
CollectorRegistry customRegistry = new CollectorRegistry();
config.setMetricsTrackerFactory(new PrometheusMetricsTrackerFactory(customRegistry));
config.setJdbcUrl("jdbc:h2:mem:");
config.setMaximumPoolSize(2);
config.setConnectionTimeout(250);
String[] labelNames = {"pool"};
String[] labelValues = {config.getPoolName()};
try (HikariDataSource hikariDataSource = new HikariDataSource(config)) {
assertThat(customRegistry.getSampleValue(
"hikaricp_connection_timeout_count",
labelNames,
labelValues), is(0.0));
assertThat(CollectorRegistry.defaultRegistry.getSampleValue(
"hikaricp_connection_usage_millis_sum",
labelNames,
labelValues), is(nullValue()));
}
}
}

Loading…
Cancel
Save