From cc368941648f50be7a1378ecfb4702c763cb0c4d Mon Sep 17 00:00:00 2001 From: Tommy Ludwig Date: Fri, 23 Feb 2018 15:30:45 +0900 Subject: [PATCH 1/2] Remove hard-coded percentiles from MicrometerMetricsTracker Rather than hard-coding a client-side calculated percentile in HikariCP's code, it is best to leave these configuration decisions to HikariCP users in their code. Users can configure percentiles and whether to record a histogram for HikariCP metrics via a `MeterFilter`. Resolves micrometer-metrics/micrometer#91 --- .../hikari/metrics/micrometer/MicrometerMetricsTracker.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/metrics/micrometer/MicrometerMetricsTracker.java b/src/main/java/com/zaxxer/hikari/metrics/micrometer/MicrometerMetricsTracker.java index 01c70c63..4ad5549a 100644 --- a/src/main/java/com/zaxxer/hikari/metrics/micrometer/MicrometerMetricsTracker.java +++ b/src/main/java/com/zaxxer/hikari/metrics/micrometer/MicrometerMetricsTracker.java @@ -39,19 +39,16 @@ public class MicrometerMetricsTracker implements IMetricsTracker { this.connectionObtainTimer = Timer.builder(METRIC_NAME_WAIT) .description("Connection acquire time") - .publishPercentiles(0.95) .tags(METRIC_CATEGORY, poolName) .register(meterRegistry); this.connectionCreation = Timer.builder(METRIC_NAME_CONNECT) .description("Connection creation time") - .publishPercentiles(0.95) .tags(METRIC_CATEGORY, poolName) .register(meterRegistry); this.connectionUsage = Timer.builder(METRIC_NAME_USAGE) .description("Connection usage time") - .publishPercentiles(0.95) .tags(METRIC_CATEGORY, poolName) .register(meterRegistry); From 5e84eeebbf61739314b76e61c7f10b9af7c51759 Mon Sep 17 00:00:00 2001 From: Tommy Ludwig Date: Fri, 23 Feb 2018 15:56:49 +0900 Subject: [PATCH 2/2] Extract Micrometer metric name to public constant and document usage Hard-coded percentiles were removed in a previous commit. This documents how a user can configure such things in their code and makes it easier to do by providing a public constant for the prefix used by all metric names. --- .../micrometer/MicrometerMetricsTracker.java | 42 +++++++++++++++---- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/metrics/micrometer/MicrometerMetricsTracker.java b/src/main/java/com/zaxxer/hikari/metrics/micrometer/MicrometerMetricsTracker.java index 4ad5549a..7fb2b42e 100644 --- a/src/main/java/com/zaxxer/hikari/metrics/micrometer/MicrometerMetricsTracker.java +++ b/src/main/java/com/zaxxer/hikari/metrics/micrometer/MicrometerMetricsTracker.java @@ -9,18 +9,42 @@ import io.micrometer.core.instrument.Timer; import java.util.concurrent.TimeUnit; +/** + * {@link IMetricsTracker Metrics tracker} for Micrometer. + * HikariCP metrics can be configured in your application by applying a + * {@link io.micrometer.core.instrument.config.MeterFilter MeterFilter} to metrics starting with + * {@link #HIKARI_METRIC_NAME_PREFIX}. For example, to configure client-side calculated percentiles: + * + *
+ *     new MeterFilter() {
+ *       @Override
+ *       public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {
+ *         if (id.getName().startsWith(MicrometerMetricsTracker.HIKARI_METRIC_NAME_PREFIX)) {
+ *           return DistributionStatisticConfig.builder()
+ *               .percentiles(0.5, 0.95)
+ *               .build()
+ *               .merge(config);
+ *            }
+ *         return config;
+ *         }
+ *      };
+ * 
+ */ public class MicrometerMetricsTracker implements IMetricsTracker { + /** Prefix used for all HikariCP metric names. */ + public static final String HIKARI_METRIC_NAME_PREFIX = "hikaricp"; + private static final String METRIC_CATEGORY = "pool"; - private static final String METRIC_NAME_WAIT = "hikaricp.connections.acquire"; - private static final String METRIC_NAME_USAGE = "hikaricp.connections.usage"; - private static final String METRIC_NAME_CONNECT = "hikaricp.connections.creation"; - - private static final String METRIC_NAME_TIMEOUT_RATE = "hikaricp.connections.timeout"; - private static final String METRIC_NAME_TOTAL_CONNECTIONS = "hikaricp.connections"; - private static final String METRIC_NAME_IDLE_CONNECTIONS = "hikaricp.connections.idle"; - private static final String METRIC_NAME_ACTIVE_CONNECTIONS = "hikaricp.connections.active"; - private static final String METRIC_NAME_PENDING_CONNECTIONS = "hikaricp.connections.pending"; + private static final String METRIC_NAME_WAIT = HIKARI_METRIC_NAME_PREFIX + ".connections.acquire"; + private static final String METRIC_NAME_USAGE = HIKARI_METRIC_NAME_PREFIX + ".connections.usage"; + private static final String METRIC_NAME_CONNECT = HIKARI_METRIC_NAME_PREFIX + ".connections.creation"; + + private static final String METRIC_NAME_TIMEOUT_RATE = HIKARI_METRIC_NAME_PREFIX + ".connections.timeout"; + private static final String METRIC_NAME_TOTAL_CONNECTIONS = HIKARI_METRIC_NAME_PREFIX + ".connections"; + private static final String METRIC_NAME_IDLE_CONNECTIONS = HIKARI_METRIC_NAME_PREFIX + ".connections.idle"; + private static final String METRIC_NAME_ACTIVE_CONNECTIONS = HIKARI_METRIC_NAME_PREFIX + ".connections.active"; + private static final String METRIC_NAME_PENDING_CONNECTIONS = HIKARI_METRIC_NAME_PREFIX + ".connections.pending"; private final Timer connectionObtainTimer; private final Counter connectionTimeoutCounter;