diff --git a/microprofile/metrics/pom.xml b/microprofile/metrics/pom.xml
index aba57224710..48f6af9ecc2 100644
--- a/microprofile/metrics/pom.xml
+++ b/microprofile/metrics/pom.xml
@@ -130,6 +130,7 @@
**/TestDisabledMetrics.java
**/TestSelectivelyDisabledMetrics.java
**/TestConfigProcessing.java
+ **/TestDistributionCustomizationsNoInit.java
true
@@ -196,6 +197,18 @@
+
+
+ test-dist-cust-with-no-init
+
+ test
+
+
+
+ **/TestDistributionCustomizationsNoInit.java
+
+
+
diff --git a/microprofile/metrics/src/main/java/io/helidon/microprofile/metrics/DistributionCustomizations.java b/microprofile/metrics/src/main/java/io/helidon/microprofile/metrics/DistributionCustomizations.java
index 4b171e2ad42..0f468605d94 100644
--- a/microprofile/metrics/src/main/java/io/helidon/microprofile/metrics/DistributionCustomizations.java
+++ b/microprofile/metrics/src/main/java/io/helidon/microprofile/metrics/DistributionCustomizations.java
@@ -62,7 +62,7 @@ class DistributionCustomizations {
private static final Duration DEFAULT_TIMER_MIN = Duration.ofMillis(5);
private static final Duration DEFAULT_TIMER_MAX = Duration.ofSeconds(10);
- private static DistributionCustomizations instance;
+ private static DistributionCustomizations instance = new DistributionCustomizations();
private final List percentileCustomizations;
private final List summaryBucketCustomizations;
private final List timerBucketCustomizations;
@@ -82,6 +82,13 @@ private DistributionCustomizations(Config mpConfig) {
Boolean::parseBoolean));
}
+ private DistributionCustomizations() {
+ percentileCustomizations = List.of();
+ summaryBucketCustomizations = List.of();
+ timerBucketCustomizations = List.of();
+ summaryBucketDefaultCustomizations = List.of();
+ }
+
static void init(Config mpConfig) {
instance = new DistributionCustomizations(mpConfig);
}
diff --git a/microprofile/metrics/src/test/java/io/helidon/microprofile/metrics/TestDistributionCustomizationsNoInit.java b/microprofile/metrics/src/test/java/io/helidon/microprofile/metrics/TestDistributionCustomizationsNoInit.java
new file mode 100644
index 00000000000..eb2fbc93e15
--- /dev/null
+++ b/microprofile/metrics/src/test/java/io/helidon/microprofile/metrics/TestDistributionCustomizationsNoInit.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2024 Oracle and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.helidon.microprofile.metrics;
+
+import org.eclipse.microprofile.metrics.MetricRegistry;
+import org.eclipse.microprofile.metrics.Timer;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.notNullValue;
+
+class TestDistributionCustomizationsNoInit {
+
+ private static MetricRegistry metricRegistry;
+
+ @BeforeAll
+ static void initRegistry() {
+ metricRegistry = RegistryFactory.getInstance().getRegistry(MetricRegistry.APPLICATION_SCOPE);
+ }
+
+ @Test
+ void checkDistributionCustomizations() {
+ // Without the change in the main source, the following triggers an NPE because this test does not use @HelidonTest
+ // and therefore the normal metrics CDI extension initialization code--which sets up the distribution
+ // customizations--does not run. That means the configurable distribution customizations are never set, leading
+ // to the NPE.
+ Timer timer = metricRegistry.timer("testTimer");
+ assertThat("Timer", timer, notNullValue());
+ }
+}