This is an automated email from the ASF dual-hosted git repository. jamesnetherton pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/main by this push: new d09c2e58e8 Micrometer: SimpleMeterRegistry is not created if no other registry is defined #5023 d09c2e58e8 is described below commit d09c2e58e80dd6c5807116bf998e93582ca88d98 Author: JiriOndrusek <ondrusek.j...@gmail.com> AuthorDate: Wed Jun 28 14:49:56 2023 +0200 Micrometer: SimpleMeterRegistry is not created if no other registry is defined #5023 --- .../pages/reference/extensions/micrometer.adoc | 2 + .../micrometer/deployment/MicrometerProcessor.java | 16 +++++++ .../MicrometerSimpleMeterRegistryTest.java | 50 ++++++++++++++++++++++ .../micrometer/runtime/src/main/doc/usage.adoc | 2 + .../micrometer/CamelMicrometerRecorder.java | 9 ++++ 5 files changed, 79 insertions(+) diff --git a/docs/modules/ROOT/pages/reference/extensions/micrometer.adoc b/docs/modules/ROOT/pages/reference/extensions/micrometer.adoc index 830a2c9648..6c220fca2b 100644 --- a/docs/modules/ROOT/pages/reference/extensions/micrometer.adoc +++ b/docs/modules/ROOT/pages/reference/extensions/micrometer.adoc @@ -58,6 +58,8 @@ Your application should declare the following dependency or one of the dependen </dependency> ---- +If no dependency is declared, the Micrometer extension creates a SimpleMeterRegistry instance, suitable mainly for testing. + [id="extensions-micrometer-camel-quarkus-limitations"] == Camel Quarkus limitations diff --git a/extensions/micrometer/deployment/src/main/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerProcessor.java b/extensions/micrometer/deployment/src/main/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerProcessor.java index 2fafc76b26..1bc904c4ed 100644 --- a/extensions/micrometer/deployment/src/main/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerProcessor.java +++ b/extensions/micrometer/deployment/src/main/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerProcessor.java @@ -16,12 +16,16 @@ */ package org.apache.camel.quarkus.component.micrometer.deployment; +import java.util.List; +import java.util.Optional; + import io.micrometer.core.instrument.MeterRegistry; import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.annotations.ExecutionTime; import io.quarkus.deployment.annotations.Record; import io.quarkus.deployment.builditem.FeatureBuildItem; import io.quarkus.micrometer.deployment.MicrometerProcessor.MicrometerEnabled; +import io.quarkus.micrometer.deployment.MicrometerRegistryProviderBuildItem; import io.quarkus.micrometer.deployment.RootMeterRegistryBuildItem; import org.apache.camel.component.micrometer.MicrometerConstants; import org.apache.camel.quarkus.component.micrometer.CamelMicrometerConfig; @@ -65,4 +69,16 @@ class MicrometerProcessor { return new RuntimeCamelContextCustomizerBuildItem( recorder.createRuntimeContextCustomizer(config, rootMeterRegistryBuildItem.getValue())); } + + @Record(ExecutionTime.STATIC_INIT) + @BuildStep + void configureDefaultRegistry( + List<MicrometerRegistryProviderBuildItem> providers, + Optional<RootMeterRegistryBuildItem> registry, + CamelMicrometerRecorder recorder) { + // Register SimpleMeterRegistry to the CompositeMeterRegistry (created by Quarkus) if there is no MicrometerRegistryProviderBuildItem + if (registry.isPresent() && providers.isEmpty()) { + recorder.configureDefaultRegistry(registry.get().getValue()); + } + } } diff --git a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerSimpleMeterRegistryTest.java b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerSimpleMeterRegistryTest.java new file mode 100644 index 0000000000..7647e31d11 --- /dev/null +++ b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerSimpleMeterRegistryTest.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.camel.quarkus.component.micrometer.deployment; + +import io.micrometer.core.instrument.composite.CompositeMeterRegistry; +import io.micrometer.core.instrument.simple.SimpleMeterRegistry; +import io.quarkus.test.QuarkusUnitTest; +import jakarta.inject.Inject; +import org.apache.camel.CamelContext; +import org.apache.camel.component.micrometer.MicrometerComponent; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; + +public class MicrometerSimpleMeterRegistryTest { + + @RegisterExtension + static final QuarkusUnitTest CONFIG = new QuarkusUnitTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)); + @Inject + CamelContext context; + + @Test + public void testSimpleRegistryRegistration() throws Exception { + MicrometerComponent component = context.getComponent("micrometer", MicrometerComponent.class); + assertInstanceOf(CompositeMeterRegistry.class, component.getMetricsRegistry(), "CompositeMeterRegistry"); + assertEquals(1, ((CompositeMeterRegistry) component.getMetricsRegistry()).getRegistries().size(), "! registry"); + assertInstanceOf(SimpleMeterRegistry.class, + ((CompositeMeterRegistry) component.getMetricsRegistry()).getRegistries().iterator().next(), + "SimpleMeterRegistry"); + } +} diff --git a/extensions/micrometer/runtime/src/main/doc/usage.adoc b/extensions/micrometer/runtime/src/main/doc/usage.adoc index 7170250acd..e4d485e32f 100644 --- a/extensions/micrometer/runtime/src/main/doc/usage.adoc +++ b/extensions/micrometer/runtime/src/main/doc/usage.adoc @@ -9,3 +9,5 @@ Your application should declare the following dependency or one of the dependen <artifactId>micrometer-registry-prometheus</artifactId> </dependency> ---- + +If no dependency is declared, the Micrometer extension creates a SimpleMeterRegistry instance, suitable mainly for testing. \ No newline at end of file diff --git a/extensions/micrometer/runtime/src/main/java/org/apache/camel/quarkus/component/micrometer/CamelMicrometerRecorder.java b/extensions/micrometer/runtime/src/main/java/org/apache/camel/quarkus/component/micrometer/CamelMicrometerRecorder.java index 5a736502c8..ddc5584c37 100644 --- a/extensions/micrometer/runtime/src/main/java/org/apache/camel/quarkus/component/micrometer/CamelMicrometerRecorder.java +++ b/extensions/micrometer/runtime/src/main/java/org/apache/camel/quarkus/component/micrometer/CamelMicrometerRecorder.java @@ -17,9 +17,11 @@ package org.apache.camel.quarkus.component.micrometer; import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.composite.CompositeMeterRegistry; import io.quarkus.runtime.RuntimeValue; import io.quarkus.runtime.annotations.Recorder; import org.apache.camel.CamelContext; +import org.apache.camel.component.micrometer.MicrometerUtils; import org.apache.camel.component.micrometer.eventnotifier.MicrometerExchangeEventNotifier; import org.apache.camel.component.micrometer.eventnotifier.MicrometerRouteEventNotifier; import org.apache.camel.component.micrometer.messagehistory.MicrometerMessageHistoryFactory; @@ -40,6 +42,13 @@ public class CamelMicrometerRecorder { return new RuntimeValue<>(new MicrometerRuntimeContextCustomizer(config, meterRegistry.getValue())); } + public void configureDefaultRegistry(RuntimeValue<MeterRegistry> rootMeterRegistry) { + // Add SimpleMeterRegistry to the Quarkus composite one + if (rootMeterRegistry.getValue() instanceof CompositeMeterRegistry) { + ((CompositeMeterRegistry) rootMeterRegistry.getValue()).add(MicrometerUtils.createMeterRegistry()); + } + } + private static class MicrometerContextCustomizer implements CamelContextCustomizer { private final CamelMicrometerConfig config;