Skip to content

Commit f6efe91

Browse files
Merge branch 'wholesail-dropwizard5-metrics' into dev
2 parents 84a140c + fb49f35 commit f6efe91

14 files changed

Lines changed: 819 additions & 304 deletions

CHANGES

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ Changes in 6.0.1
44

55
* change default maxLifetime variance from 2.5% to 25% to further avoid mass connection die-off dips
66

7+
* Dropwizard 5 metrics are now supported via the setMetricRegistry() method in HikariConfig and in HikariDataSource
8+
79
Changes in 6.0.0
810

911
* fixed #2152 duplicate connection in try with resources clause caused close() being called twice on each connection

pom.xml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,13 @@
3131

3232
<docker.maven.plugin.fabric8.version>0.45.0</docker.maven.plugin.fabric8.version>
3333
<felix.bundle.plugin.version>5.1.1</felix.bundle.plugin.version>
34-
<felix.version>6.0.1</felix.version>
34+
<felix.version>7.0.5</felix.version>
3535
<hibernate.version>5.4.24.Final</hibernate.version>
3636
<javassist.version>3.29.2-GA</javassist.version>
3737
<jndi.version>0.11.4.1</jndi.version>
3838
<maven.release.version>3.0.1</maven.release.version>
3939
<metrics.version>3.2.5</metrics.version>
40+
<metrics5.version>5.0.0-rc17</metrics5.version>
4041
<micrometer.version>1.5.10</micrometer.version>
4142
<simpleclient.version>0.16.0</simpleclient.version>
4243
<mockito.version>3.7.7</mockito.version>
@@ -195,6 +196,13 @@
195196
<scope>provided</scope>
196197
<optional>true</optional>
197198
</dependency>
199+
<dependency>
200+
<groupId>io.dropwizard.metrics5</groupId>
201+
<artifactId>metrics-core</artifactId>
202+
<version>${metrics5.version}</version>
203+
<scope>provided</scope>
204+
<optional>true</optional>
205+
</dependency>
198206
<dependency>
199207
<groupId>io.prometheus</groupId>
200208
<artifactId>simpleclient</artifactId>
@@ -581,6 +589,7 @@
581589
javax.sql.rowset.spi,
582590
com.codahale.metrics;resolution:=optional,
583591
com.codahale.metrics.health;resolution:=optional,
592+
io.dropwizard.metrics5;resolution:=optional,
584593
io.micrometer.core.instrument;resolution:=optional,
585594
org.slf4j;version="[1.6,2)",
586595
org.hibernate;resolution:=optional,

src/main/java/com/zaxxer/hikari/HikariConfig.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -693,8 +693,10 @@ public void setMetricRegistry(Object metricRegistry)
693693
metricRegistry = getObjectOrPerformJndiLookup(metricRegistry);
694694

695695
if (!safeIsAssignableFrom(metricRegistry, "com.codahale.metrics.MetricRegistry")
696+
&& !(safeIsAssignableFrom(metricRegistry, "io.dropwizard.metrics5.MetricRegistry"))
696697
&& !(safeIsAssignableFrom(metricRegistry, "io.micrometer.core.instrument.MeterRegistry"))) {
697-
throw new IllegalArgumentException("Class must be instance of com.codahale.metrics.MetricRegistry or io.micrometer.core.instrument.MeterRegistry");
698+
throw new IllegalArgumentException("Class must be instance of com.codahale.metrics.MetricRegistry, " +
699+
"io.dropwizard.metrics5.MetricRegistry, or io.micrometer.core.instrument.MeterRegistry");
698700
}
699701
}
700702

src/main/java/com/zaxxer/hikari/metrics/dropwizard/CodaHaleMetricsTracker.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,18 @@
2626
import com.zaxxer.hikari.metrics.IMetricsTracker;
2727
import com.zaxxer.hikari.metrics.PoolStats;
2828

29+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_CATEGORY;
30+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_ACTIVE_CONNECTIONS;
31+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_CONNECT;
32+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_IDLE_CONNECTIONS;
33+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_MAX_CONNECTIONS;
34+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_MIN_CONNECTIONS;
35+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_PENDING_CONNECTIONS;
36+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_TIMEOUT_RATE;
37+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_TOTAL_CONNECTIONS;
38+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_USAGE;
39+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_WAIT;
40+
2941
public final class CodaHaleMetricsTracker implements IMetricsTracker
3042
{
3143
private final String poolName;
@@ -35,18 +47,6 @@ public final class CodaHaleMetricsTracker implements IMetricsTracker
3547
private final Meter connectionTimeoutMeter;
3648
private final MetricRegistry registry;
3749

38-
private static final String METRIC_CATEGORY = "pool";
39-
private static final String METRIC_NAME_WAIT = "Wait";
40-
private static final String METRIC_NAME_USAGE = "Usage";
41-
private static final String METRIC_NAME_CONNECT = "ConnectionCreation";
42-
private static final String METRIC_NAME_TIMEOUT_RATE = "ConnectionTimeoutRate";
43-
private static final String METRIC_NAME_TOTAL_CONNECTIONS = "TotalConnections";
44-
private static final String METRIC_NAME_IDLE_CONNECTIONS = "IdleConnections";
45-
private static final String METRIC_NAME_ACTIVE_CONNECTIONS = "ActiveConnections";
46-
private static final String METRIC_NAME_PENDING_CONNECTIONS = "PendingConnections";
47-
private static final String METRIC_NAME_MAX_CONNECTIONS = "MaxConnections";
48-
private static final String METRIC_NAME_MIN_CONNECTIONS = "MinConnections";
49-
5050
CodaHaleMetricsTracker(final String poolName, final PoolStats poolStats, final MetricRegistry registry)
5151
{
5252
this.poolName = poolName;
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package com.zaxxer.hikari.metrics.dropwizard;
2+
3+
import java.util.concurrent.TimeUnit;
4+
5+
import com.zaxxer.hikari.metrics.IMetricsTracker;
6+
import com.zaxxer.hikari.metrics.PoolStats;
7+
import io.dropwizard.metrics5.Gauge;
8+
import io.dropwizard.metrics5.Histogram;
9+
import io.dropwizard.metrics5.Meter;
10+
import io.dropwizard.metrics5.MetricRegistry;
11+
import io.dropwizard.metrics5.Timer;
12+
13+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_CATEGORY;
14+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_ACTIVE_CONNECTIONS;
15+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_CONNECT;
16+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_IDLE_CONNECTIONS;
17+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_MAX_CONNECTIONS;
18+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_MIN_CONNECTIONS;
19+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_PENDING_CONNECTIONS;
20+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_TIMEOUT_RATE;
21+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_TOTAL_CONNECTIONS;
22+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_USAGE;
23+
import static com.zaxxer.hikari.metrics.dropwizard.DropwizardCommon.METRIC_NAME_WAIT;
24+
25+
public class Dropwizard5MetricsTracker implements IMetricsTracker
26+
{
27+
private final String poolName;
28+
private final Timer connectionObtainTimer;
29+
private final Histogram connectionUsage;
30+
private final Histogram connectionCreation;
31+
private final Meter connectionTimeoutMeter;
32+
private final MetricRegistry registry;
33+
34+
Dropwizard5MetricsTracker(final String poolName, final PoolStats poolStats, final MetricRegistry registry)
35+
{
36+
this.poolName = poolName;
37+
this.registry = registry;
38+
this.connectionObtainTimer = registry.timer(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_WAIT));
39+
this.connectionUsage = registry.histogram(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_USAGE));
40+
this.connectionCreation = registry.histogram(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_CONNECT));
41+
this.connectionTimeoutMeter = registry.meter(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_TIMEOUT_RATE));
42+
43+
registry.register(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_TOTAL_CONNECTIONS),
44+
(Gauge<Integer>) poolStats::getTotalConnections);
45+
46+
registry.register(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_IDLE_CONNECTIONS),
47+
(Gauge<Integer>) poolStats::getIdleConnections);
48+
49+
registry.register(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_ACTIVE_CONNECTIONS),
50+
(Gauge<Integer>) poolStats::getActiveConnections);
51+
52+
registry.register(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_PENDING_CONNECTIONS),
53+
(Gauge<Integer>) poolStats::getPendingThreads);
54+
55+
registry.register(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_MAX_CONNECTIONS),
56+
(Gauge<Integer>) poolStats::getMaxConnections);
57+
58+
registry.register(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_MIN_CONNECTIONS),
59+
(Gauge<Integer>) poolStats::getMinConnections);
60+
}
61+
62+
/** {@inheritDoc} */
63+
@Override
64+
public void close()
65+
{
66+
registry.remove(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_WAIT));
67+
registry.remove(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_USAGE));
68+
registry.remove(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_CONNECT));
69+
registry.remove(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_TIMEOUT_RATE));
70+
registry.remove(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_TOTAL_CONNECTIONS));
71+
registry.remove(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_IDLE_CONNECTIONS));
72+
registry.remove(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_ACTIVE_CONNECTIONS));
73+
registry.remove(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_PENDING_CONNECTIONS));
74+
registry.remove(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_MAX_CONNECTIONS));
75+
registry.remove(MetricRegistry.name(poolName, METRIC_CATEGORY, METRIC_NAME_MIN_CONNECTIONS));
76+
}
77+
78+
/** {@inheritDoc} */
79+
@Override
80+
public void recordConnectionAcquiredNanos(final long elapsedAcquiredNanos)
81+
{
82+
connectionObtainTimer.update(elapsedAcquiredNanos, TimeUnit.NANOSECONDS);
83+
}
84+
85+
/** {@inheritDoc} */
86+
@Override
87+
public void recordConnectionUsageMillis(final long elapsedBorrowedMillis)
88+
{
89+
connectionUsage.update(elapsedBorrowedMillis);
90+
}
91+
92+
@Override
93+
public void recordConnectionTimeout()
94+
{
95+
connectionTimeoutMeter.mark();
96+
}
97+
98+
@Override
99+
public void recordConnectionCreatedMillis(final long connectionCreatedMillis)
100+
{
101+
connectionCreation.update(connectionCreatedMillis);
102+
}
103+
104+
public Timer getConnectionAcquisitionTimer()
105+
{
106+
return connectionObtainTimer;
107+
}
108+
109+
public Histogram getConnectionDurationHistogram()
110+
{
111+
return connectionUsage;
112+
}
113+
114+
public Histogram getConnectionCreationHistogram()
115+
{
116+
return connectionCreation;
117+
}
118+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.zaxxer.hikari.metrics.dropwizard;
2+
3+
import com.zaxxer.hikari.metrics.IMetricsTracker;
4+
import com.zaxxer.hikari.metrics.MetricsTrackerFactory;
5+
import com.zaxxer.hikari.metrics.PoolStats;
6+
import io.dropwizard.metrics5.MetricRegistry;
7+
8+
public class Dropwizard5MetricsTrackerFactory implements MetricsTrackerFactory
9+
{
10+
private final MetricRegistry registry;
11+
12+
public Dropwizard5MetricsTrackerFactory(final MetricRegistry registry)
13+
{
14+
this.registry = registry;
15+
}
16+
17+
public MetricRegistry getRegistry()
18+
{
19+
return registry;
20+
}
21+
22+
@Override
23+
public IMetricsTracker create(final String poolName, final PoolStats poolStats)
24+
{
25+
return new Dropwizard5MetricsTracker(poolName, poolStats, registry);
26+
}
27+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* Licensed under the Apache License, Version 2.0 (the "License");
3+
* you may not use this file except in compliance with the License.
4+
* You may obtain a copy of the License at
5+
*
6+
* http://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* Unless required by applicable law or agreed to in writing, software
9+
* distributed under the License is distributed on an "AS IS" BASIS,
10+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
* See the License for the specific language governing permissions and
12+
* limitations under the License.
13+
*/
14+
15+
package com.zaxxer.hikari.metrics.dropwizard;
16+
17+
final class DropwizardCommon {
18+
private DropwizardCommon()
19+
{
20+
}
21+
22+
static final String METRIC_CATEGORY = "pool";
23+
static final String METRIC_NAME_WAIT = "Wait";
24+
static final String METRIC_NAME_USAGE = "Usage";
25+
static final String METRIC_NAME_CONNECT = "ConnectionCreation";
26+
static final String METRIC_NAME_TIMEOUT_RATE = "ConnectionTimeoutRate";
27+
static final String METRIC_NAME_TOTAL_CONNECTIONS = "TotalConnections";
28+
static final String METRIC_NAME_IDLE_CONNECTIONS = "IdleConnections";
29+
static final String METRIC_NAME_ACTIVE_CONNECTIONS = "ActiveConnections";
30+
static final String METRIC_NAME_PENDING_CONNECTIONS = "PendingConnections";
31+
static final String METRIC_NAME_MAX_CONNECTIONS = "MaxConnections";
32+
static final String METRIC_NAME_MIN_CONNECTIONS = "MinConnections";
33+
}

src/main/java/com/zaxxer/hikari/pool/HikariPool.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.zaxxer.hikari.metrics.PoolStats;
2525
import com.zaxxer.hikari.metrics.dropwizard.CodahaleHealthChecker;
2626
import com.zaxxer.hikari.metrics.dropwizard.CodahaleMetricsTrackerFactory;
27+
import com.zaxxer.hikari.metrics.dropwizard.Dropwizard5MetricsTrackerFactory;
2728
import com.zaxxer.hikari.metrics.micrometer.MicrometerMetricsTrackerFactory;
2829
import com.zaxxer.hikari.util.ConcurrentBag;
2930
import com.zaxxer.hikari.util.ConcurrentBag.IBagStateListener;
@@ -288,6 +289,9 @@ public void setMetricRegistry(Object metricRegistry)
288289
if (metricRegistry != null && safeIsAssignableFrom(metricRegistry, "com.codahale.metrics.MetricRegistry")) {
289290
setMetricsTrackerFactory(new CodahaleMetricsTrackerFactory((MetricRegistry) metricRegistry));
290291
}
292+
else if (metricRegistry != null && safeIsAssignableFrom(metricRegistry, "io.dropwizard.metrics5.MetricRegistry")) {
293+
setMetricsTrackerFactory(new Dropwizard5MetricsTrackerFactory((io.dropwizard.metrics5.MetricRegistry) metricRegistry));
294+
}
291295
else if (metricRegistry != null && safeIsAssignableFrom(metricRegistry, "io.micrometer.core.instrument.MeterRegistry")) {
292296
setMetricsTrackerFactory(new MicrometerMetricsTrackerFactory((MeterRegistry) metricRegistry));
293297
}

src/main/java/module-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
requires static simpleclient;
99
requires static metrics.core;
1010
requires static metrics.healthchecks;
11+
requires static io.dropwizard.metrics5;
1112
requires static micrometer.core;
1213
requires static org.javassist;
1314

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.zaxxer.hikari.metrics.dropwizard;
2+
3+
import com.zaxxer.hikari.mocks.StubPoolStats;
4+
import io.dropwizard.metrics5.MetricRegistry;
5+
import org.junit.Before;
6+
import org.junit.Test;
7+
import org.junit.runner.RunWith;
8+
import org.mockito.Mock;
9+
import org.mockito.junit.MockitoJUnitRunner;
10+
11+
import static org.mockito.Mockito.verify;
12+
13+
@RunWith(MockitoJUnitRunner.class)
14+
public class Dropwizard5MetricsTrackerTest
15+
{
16+
@Mock
17+
public MetricRegistry mockMetricRegistry;
18+
19+
private Dropwizard5MetricsTracker testee;
20+
21+
@Before
22+
public void setup()
23+
{
24+
testee = new Dropwizard5MetricsTracker("mypool", new StubPoolStats(0), mockMetricRegistry);
25+
}
26+
27+
@Test
28+
public void close()
29+
{
30+
testee.close();
31+
32+
verify(mockMetricRegistry).remove(MetricRegistry.name("mypool.pool.Wait"));
33+
verify(mockMetricRegistry).remove(MetricRegistry.name("mypool.pool.Usage"));
34+
verify(mockMetricRegistry).remove(MetricRegistry.name("mypool.pool.ConnectionCreation"));
35+
verify(mockMetricRegistry).remove(MetricRegistry.name("mypool.pool.ConnectionTimeoutRate"));
36+
verify(mockMetricRegistry).remove(MetricRegistry.name("mypool.pool.TotalConnections"));
37+
verify(mockMetricRegistry).remove(MetricRegistry.name("mypool.pool.IdleConnections"));
38+
verify(mockMetricRegistry).remove(MetricRegistry.name("mypool.pool.ActiveConnections"));
39+
verify(mockMetricRegistry).remove(MetricRegistry.name("mypool.pool.PendingConnections"));
40+
verify(mockMetricRegistry).remove(MetricRegistry.name("mypool.pool.MaxConnections"));
41+
verify(mockMetricRegistry).remove(MetricRegistry.name("mypool.pool.MinConnections"));
42+
}
43+
}

0 commit comments

Comments
 (0)