diff --git a/src/main/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTracker.java b/src/main/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTracker.java index e31569b97..4a427114c 100644 --- a/src/main/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTracker.java +++ b/src/main/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTracker.java @@ -17,93 +17,76 @@ package com.zaxxer.hikari.metrics.prometheus; import com.zaxxer.hikari.metrics.IMetricsTracker; - import io.prometheus.client.Collector; import io.prometheus.client.CollectorRegistry; import io.prometheus.client.Counter; import io.prometheus.client.Summary; +import java.util.concurrent.TimeUnit; class PrometheusMetricsTracker implements IMetricsTracker { - private final Counter.Child connectionTimeoutCounter; - private final Summary.Child elapsedAcquiredSummary; - private final Summary.Child elapsedBorrowedSummary; - private final Summary.Child elapsedCreationSummary; - - private final Counter ctCounter; - private final Summary eaSummary; - private final Summary ebSummary; - private final Summary ecSummary; - + private static final Counter CONNECTION_TIMEOUT_COUNTER = Counter.build() + .name("hikaricp_connection_timeout_total") + .labelNames("pool") + .help("Connection timeout total count") + .register(); + private static final Summary ELAPSED_ACQUIRED_SUMMARY = Summary.build() + .name("hikaricp_connection_acquired_nanos") + .labelNames("pool") + .help("Connection acquired time (ns)") + .register(); + private static final Summary ELAPSED_BORROWED_SUMMARY = Summary.build() + .name("hikaricp_connection_usage_millis") + .labelNames("pool") + .help("Connection usage (ms)") + .register(); + private static final Summary ELAPSED_CREATION_SUMMARY = Summary.build() + .name("hikaricp_connection_creation_millis") + .labelNames("pool") + .help("Connection creation (ms)") + .register(); + + private final Counter.Child connectionTimeoutCounterChild; + private final Summary.Child elapsedAcquiredSummaryChild; + private final Summary.Child elapsedBorrowedSummaryChild; + private final Summary.Child elapsedCreationSummaryChild; private final Collector collector; - private final CollectorRegistry registry; - PrometheusMetricsTracker(String poolName, Collector collector, CollectorRegistry registry) - { + PrometheusMetricsTracker(String poolName, Collector collector) { this.collector = collector; - this.registry = registry; - - ctCounter = Counter.build() - .name("hikaricp_connection_timeout_count") - .labelNames("pool") - .help("Connection timeout count") - .register(registry); - - this.connectionTimeoutCounter = ctCounter.labels(poolName); - - eaSummary = Summary.build() - .name("hikaricp_connection_acquired_nanos") - .labelNames("pool") - .help("Connection acquired time (ns)") - .register(registry); - this.elapsedAcquiredSummary = eaSummary.labels(poolName); - - ebSummary = Summary.build() - .name("hikaricp_connection_usage_millis") - .labelNames("pool") - .help("Connection usage (ms)") - .register(registry); - this.elapsedBorrowedSummary = ebSummary.labels(poolName); - - ecSummary = Summary.build() - .name("hikaricp_connection_creation_millis") - .labelNames("pool") - .help("Connection creation (ms)") - .register(registry); - this.elapsedCreationSummary = ecSummary.labels(poolName); + this.connectionTimeoutCounterChild = CONNECTION_TIMEOUT_COUNTER.labels(poolName); + this.elapsedAcquiredSummaryChild = ELAPSED_ACQUIRED_SUMMARY.labels(poolName); + this.elapsedBorrowedSummaryChild = ELAPSED_BORROWED_SUMMARY.labels(poolName); + this.elapsedCreationSummaryChild = ELAPSED_CREATION_SUMMARY.labels(poolName); } @Override public void close() { - registry.unregister(ctCounter); - registry.unregister(eaSummary); - registry.unregister(ebSummary); - registry.unregister(ecSummary); - registry.unregister(collector); + CollectorRegistry.defaultRegistry.unregister(collector); } @Override public void recordConnectionAcquiredNanos(long elapsedAcquiredNanos) { - elapsedAcquiredSummary.observe(elapsedAcquiredNanos); + elapsedAcquiredSummaryChild.observe(elapsedAcquiredNanos); } @Override public void recordConnectionUsageMillis(long elapsedBorrowedMillis) { - elapsedBorrowedSummary.observe(elapsedBorrowedMillis); + elapsedBorrowedSummaryChild.observe(elapsedBorrowedMillis); } @Override public void recordConnectionCreatedMillis(long connectionCreatedMillis) { - elapsedCreationSummary.observe(connectionCreatedMillis); + elapsedCreationSummaryChild.observe(connectionCreatedMillis); } @Override public void recordConnectionTimeout() { - connectionTimeoutCounter.inc(); + connectionTimeoutCounterChild.inc(); } } diff --git a/src/main/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTrackerFactory.java b/src/main/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTrackerFactory.java index 1b18e8e5e..62e418120 100644 --- a/src/main/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTrackerFactory.java +++ b/src/main/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTrackerFactory.java @@ -19,9 +19,7 @@ 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; /** *
{@code @@ -31,20 +29,9 @@ */ 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(registry); - return new PrometheusMetricsTracker(poolName, collector, registry); + Collector collector = new HikariCPCollector(poolName, poolStats).register(); + return new PrometheusMetricsTracker(poolName, collector); } } diff --git a/src/test/java/com/zaxxer/hikari/metrics/prometheus/HikariCPCollectorTest.java b/src/test/java/com/zaxxer/hikari/metrics/prometheus/HikariCPCollectorTest.java index 43be0672d..63746a3d5 100644 --- a/src/test/java/com/zaxxer/hikari/metrics/prometheus/HikariCPCollectorTest.java +++ b/src/test/java/com/zaxxer/hikari/metrics/prometheus/HikariCPCollectorTest.java @@ -19,16 +19,17 @@ 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; +import io.prometheus.client.CollectorRegistry; public class HikariCPCollectorTest { @Test @@ -116,32 +117,10 @@ public void connectionClosed() throws Exception { } } - @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) { + private double getValue(String name, String poolName) { String[] labelNames = {"pool"}; String[] labelValues = {poolName}; - return registry.getSampleValue(name, labelNames, labelValues); + return CollectorRegistry.defaultRegistry.getSampleValue(name, labelNames, labelValues); } } diff --git a/src/test/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTrackerTest.java b/src/test/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTrackerTest.java index 39c537dab..da634cc95 100644 --- a/src/test/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTrackerTest.java +++ b/src/test/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTrackerTest.java @@ -19,17 +19,18 @@ 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; +import io.prometheus.client.CollectorRegistry; public class PrometheusMetricsTrackerTest { @@ -46,7 +47,7 @@ public void recordConnectionTimeout() throws Exception { try (HikariDataSource hikariDataSource = new HikariDataSource(config)) { try (Connection connection1 = hikariDataSource.getConnection(); - Connection connection2 = hikariDataSource.getConnection()) { + Connection connection2 = hikariDataSource.getConnection()) { try (Connection connection3 = hikariDataSource.getConnection()) { } catch (SQLTransientConnectionException ignored) { @@ -54,7 +55,7 @@ public void recordConnectionTimeout() throws Exception { } assertThat(CollectorRegistry.defaultRegistry.getSampleValue( - "hikaricp_connection_timeout_count", + "hikaricp_connection_timeout_total", labelNames, labelValues), is(1.0)); assertThat(CollectorRegistry.defaultRegistry.getSampleValue( @@ -77,26 +78,37 @@ public void recordConnectionTimeout() throws Exception { } @Test - public void testThatTheProperRegistryIsUsed() throws Exception { + public void testMultiplePoolName() throws Exception { + String[] labelNames = {"pool"}; + HikariConfig config = newHikariConfig(); - CollectorRegistry customRegistry = new CollectorRegistry(); - config.setMetricsTrackerFactory(new PrometheusMetricsTrackerFactory(customRegistry)); + config.setMetricsTrackerFactory(new PrometheusMetricsTrackerFactory()); + config.setPoolName("first"); config.setJdbcUrl("jdbc:h2:mem:"); config.setMaximumPoolSize(2); config.setConnectionTimeout(250); + String[] labelValues1 = {config.getPoolName()}; - String[] labelNames = {"pool"}; - String[] labelValues = {config.getPoolName()}; - - try (HikariDataSource hikariDataSource = new HikariDataSource(config)) { - assertThat(customRegistry.getSampleValue( - "hikaricp_connection_timeout_count", + try (HikariDataSource ignored = new HikariDataSource(config)) { + assertThat(CollectorRegistry.defaultRegistry.getSampleValue( + "hikaricp_connection_timeout_total", labelNames, - labelValues), is(0.0)); + labelValues1), is(0.0)); + } + + HikariConfig config2 = newHikariConfig(); + config2.setMetricsTrackerFactory(new PrometheusMetricsTrackerFactory()); + config2.setPoolName("second"); + config2.setJdbcUrl("jdbc:h2:mem:"); + config2.setMaximumPoolSize(4); + config2.setConnectionTimeout(250); + String[] labelValues2 = {config2.getPoolName()}; + + try (HikariDataSource ignored = new HikariDataSource(config2)) { assertThat(CollectorRegistry.defaultRegistry.getSampleValue( - "hikaricp_connection_usage_millis_sum", - labelNames, - labelValues), is(nullValue())); + "hikaricp_connection_timeout_total", + labelNames, + labelValues2), is(0.0)); } } }