From 2e4fd31c47847e513d9450eeb3c5936242706603 Mon Sep 17 00:00:00 2001 From: Joe DiPol Date: Wed, 4 Dec 2024 15:19:51 -0800 Subject: [PATCH] Initialize distribution customizations even before config is applied (#9547) (#9564) * Initialize distribution customizations even before config is applied Co-authored-by: Tim Quinn --- microprofile/metrics/pom.xml | 13 ++++++ .../metrics/DistributionCustomizations.java | 9 +++- .../TestDistributionCustomizationsNoInit.java | 44 +++++++++++++++++++ 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 microprofile/metrics/src/test/java/io/helidon/microprofile/metrics/TestDistributionCustomizationsNoInit.java diff --git a/microprofile/metrics/pom.xml b/microprofile/metrics/pom.xml index ad393469f44..59543b03855 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()); + } +}