From 4942c266ac26dfb3a2bbfef2635afb922d5597da Mon Sep 17 00:00:00 2001 From: James Netherton Date: Thu, 4 Apr 2024 07:11:27 +0100 Subject: [PATCH] Add Micrometer naming strategy and route policy level configuration options Fixes #5843 --- .../reference/extensions/micrometer.adoc | 12 ++ ...icrometerInstrumentCoreThreadPoolTest.java | 6 +- .../MicrometerMetricsConfigDefaultsTest.java | 45 +++++- .../MicrometerMetricsConfigOverrideTest.java | 10 +- ...terMetricsContextRoutePolicyLevelTest.java | 79 +++++++++++ .../MicrometerMetricsDisabledTest.java | 5 +- ...crometerMetricsNamingPolicyLegacyTest.java | 130 ++++++++++++++++++ ...meterMetricsRouteRoutePolicyLevelTest.java | 79 +++++++++++ .../micrometer/CamelMicrometerConfig.java | 29 +++- .../micrometer/CamelMicrometerRecorder.java | 47 ++++++- 10 files changed, 424 insertions(+), 18 deletions(-) create mode 100644 extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsContextRoutePolicyLevelTest.java create mode 100644 extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsNamingPolicyLegacyTest.java create mode 100644 extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsRouteRoutePolicyLevelTest.java diff --git a/docs/modules/ROOT/pages/reference/extensions/micrometer.adoc b/docs/modules/ROOT/pages/reference/extensions/micrometer.adoc index 70911002fdb6..3a905593ede1 100644 --- a/docs/modules/ROOT/pages/reference/extensions/micrometer.adoc +++ b/docs/modules/ROOT/pages/reference/extensions/micrometer.adoc @@ -120,6 +120,18 @@ Set whether to enable the MicrometerRouteEventNotifier for capturing metrics on Set whether to gather performance information about Camel Thread Pools by injecting an InstrumentedThreadPoolFactory. | `boolean` | `false` + +|icon:lock[title=Fixed at build time] [[quarkus.camel.metrics.naming-strategy]]`link:#quarkus.camel.metrics.naming-strategy[quarkus.camel.metrics.naming-strategy]` + +Controls the naming style to use for metrics. The available values are `default` and `legacy`. `default` uses the default Micrometer naming convention. `legacy` uses the legacy camel-case naming style. +| `org.apache.camel.quarkus.component.micrometer.CamelMicrometerConfig.MetricsNamingStrategy` +| `default` + +|icon:lock[title=Fixed at build time] [[quarkus.camel.metrics.route-policy-level]]`link:#quarkus.camel.metrics.route-policy-level[quarkus.camel.metrics.route-policy-level]` + +Sets the level of metrics to capture. The available values are `all` ,`context` and `route`. `all` captures metrics for both the camel context and routes. `route` captures metrics for routes only. `context` captures metrics for the camel context only. +| `org.apache.camel.quarkus.component.micrometer.CamelMicrometerConfig.RoutePolicyLevel` +| `all` |=== [.configuration-legend] diff --git a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerInstrumentCoreThreadPoolTest.java b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerInstrumentCoreThreadPoolTest.java index 39830f813d89..ba8c28f86646 100644 --- a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerInstrumentCoreThreadPoolTest.java +++ b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerInstrumentCoreThreadPoolTest.java @@ -33,8 +33,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; public class MicrometerInstrumentCoreThreadPoolTest { @@ -50,10 +50,10 @@ public class MicrometerInstrumentCoreThreadPoolTest { public void testInstrumentedThreadPoolFactory() { ThreadPoolFactory threadPoolFactory = context.getExecutorServiceManager().getThreadPoolFactory(); assertNotNull(threadPoolFactory); - assertTrue(threadPoolFactory instanceof InstrumentedThreadPoolFactory); + assertInstanceOf(InstrumentedThreadPoolFactory.class, threadPoolFactory); } - public static final Asset applicationProperties() { + public static Asset applicationProperties() { Writer writer = new StringWriter(); Properties props = new Properties(); diff --git a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsConfigDefaultsTest.java b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsConfigDefaultsTest.java index f1e55cf7816d..0588c8cdb1c1 100644 --- a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsConfigDefaultsTest.java +++ b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsConfigDefaultsTest.java @@ -17,12 +17,18 @@ package org.apache.camel.quarkus.component.micrometer.deployment; import java.util.List; -import java.util.stream.Collectors; +import java.util.Optional; import io.quarkus.test.QuarkusUnitTest; import jakarta.inject.Inject; import org.apache.camel.CamelContext; +import org.apache.camel.component.micrometer.eventnotifier.MicrometerExchangeEventNotifier; +import org.apache.camel.component.micrometer.eventnotifier.MicrometerExchangeEventNotifierNamingStrategy; +import org.apache.camel.component.micrometer.eventnotifier.MicrometerRouteEventNotifier; +import org.apache.camel.component.micrometer.eventnotifier.MicrometerRouteEventNotifierNamingStrategy; +import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyConfiguration; import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyFactory; +import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyNamingStrategy; import org.apache.camel.component.micrometer.spi.InstrumentedThreadPoolFactory; import org.apache.camel.impl.engine.DefaultMessageHistoryFactory; import org.apache.camel.spi.EventNotifier; @@ -36,6 +42,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -52,19 +59,49 @@ public class MicrometerMetricsConfigDefaultsTest { public void testMicrometerMetricsConfiguration() { List routePolicyFactories = context.getRoutePolicyFactories(); assertEquals(1, routePolicyFactories.size()); - assertTrue(routePolicyFactories.get(0) instanceof MicrometerRoutePolicyFactory); + RoutePolicyFactory routePolicyFactory = routePolicyFactories.get(0); + assertInstanceOf(MicrometerRoutePolicyFactory.class, routePolicyFactory); + MicrometerRoutePolicyFactory micrometerRoutePolicyFactory = (MicrometerRoutePolicyFactory) routePolicyFactory; + assertEquals(MicrometerRoutePolicyNamingStrategy.DEFAULT, micrometerRoutePolicyFactory.getNamingStrategy()); + + MicrometerRoutePolicyConfiguration policyConfiguration = micrometerRoutePolicyFactory.getPolicyConfiguration(); + assertTrue(policyConfiguration.isContextEnabled()); + assertTrue(policyConfiguration.isRouteEnabled()); MessageHistoryFactory messageHistoryFactory = context.getMessageHistoryFactory(); assertNotNull(messageHistoryFactory); - assertTrue(messageHistoryFactory instanceof DefaultMessageHistoryFactory); + assertInstanceOf(DefaultMessageHistoryFactory.class, messageHistoryFactory); List eventNotifiers = context.getManagementStrategy() .getEventNotifiers() .stream() .filter(eventNotifier -> !eventNotifier.getClass().getName().contains("BaseMainSupport")) - .collect(Collectors.toList()); + .toList(); assertEquals(3, eventNotifiers.size()); + Optional optionalExchangeEventNotifier = context.getManagementStrategy() + .getEventNotifiers() + .stream() + .filter(eventNotifier -> eventNotifier.getClass().equals(MicrometerExchangeEventNotifier.class)) + .findFirst(); + assertTrue(optionalExchangeEventNotifier.isPresent()); + + MicrometerExchangeEventNotifier micrometerExchangeEventNotifier = (MicrometerExchangeEventNotifier) optionalExchangeEventNotifier + .get(); + assertEquals(MicrometerExchangeEventNotifierNamingStrategy.DEFAULT, + micrometerExchangeEventNotifier.getNamingStrategy()); + + Optional optionalRouteEventNotifier = context.getManagementStrategy() + .getEventNotifiers() + .stream() + .filter(eventNotifier -> eventNotifier.getClass().equals(MicrometerRouteEventNotifier.class)) + .findFirst(); + assertTrue(optionalRouteEventNotifier.isPresent()); + + MicrometerRouteEventNotifier micrometerRouteEventNotifier = (MicrometerRouteEventNotifier) optionalRouteEventNotifier + .get(); + assertEquals(MicrometerRouteEventNotifierNamingStrategy.DEFAULT, micrometerRouteEventNotifier.getNamingStrategy()); + ThreadPoolFactory threadPoolFactory = context.getExecutorServiceManager().getThreadPoolFactory(); assertNotNull(threadPoolFactory); assertFalse(threadPoolFactory instanceof InstrumentedThreadPoolFactory); diff --git a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsConfigOverrideTest.java b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsConfigOverrideTest.java index c7f4edc44f41..2a43e266c638 100644 --- a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsConfigOverrideTest.java +++ b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsConfigOverrideTest.java @@ -25,6 +25,7 @@ import jakarta.inject.Inject; import org.apache.camel.CamelContext; import org.apache.camel.component.micrometer.messagehistory.MicrometerMessageHistoryFactory; +import org.apache.camel.component.micrometer.messagehistory.MicrometerMessageHistoryNamingStrategy; import org.apache.camel.spi.MessageHistoryFactory; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.Asset; @@ -33,6 +34,8 @@ 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; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -52,10 +55,13 @@ public void testMicroProfileMetricsConfiguration() { MessageHistoryFactory messageHistoryFactory = context.getMessageHistoryFactory(); assertNotNull(messageHistoryFactory); - assertTrue(messageHistoryFactory instanceof MicrometerMessageHistoryFactory); + assertInstanceOf(MicrometerMessageHistoryFactory.class, messageHistoryFactory); + + MicrometerMessageHistoryFactory micrometerMessageHistoryFactory = (MicrometerMessageHistoryFactory) messageHistoryFactory; + assertEquals(MicrometerMessageHistoryNamingStrategy.DEFAULT, micrometerMessageHistoryFactory.getNamingStrategy()); } - public static final Asset applicationProperties() { + public static Asset applicationProperties() { Writer writer = new StringWriter(); Properties props = new Properties(); diff --git a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsContextRoutePolicyLevelTest.java b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsContextRoutePolicyLevelTest.java new file mode 100644 index 000000000000..12333a6cc250 --- /dev/null +++ b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsContextRoutePolicyLevelTest.java @@ -0,0 +1,79 @@ +/* + * 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 java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.util.List; +import java.util.Properties; + +import io.quarkus.test.QuarkusUnitTest; +import jakarta.inject.Inject; +import org.apache.camel.CamelContext; +import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyConfiguration; +import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyFactory; +import org.apache.camel.spi.RoutePolicyFactory; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.Asset; +import org.jboss.shrinkwrap.api.asset.StringAsset; +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.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class MicrometerMetricsContextRoutePolicyLevelTest { + @RegisterExtension + static final QuarkusUnitTest CONFIG = new QuarkusUnitTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) + .addAsResource(applicationProperties(), "application.properties")); + + @Inject + CamelContext context; + + @Test + void contextRoutePolicy() { + List routePolicyFactories = context.getRoutePolicyFactories(); + assertEquals(1, routePolicyFactories.size()); + RoutePolicyFactory routePolicyFactory = routePolicyFactories.get(0); + assertInstanceOf(MicrometerRoutePolicyFactory.class, routePolicyFactory); + + MicrometerRoutePolicyFactory micrometerRoutePolicyFactory = (MicrometerRoutePolicyFactory) routePolicyFactory; + MicrometerRoutePolicyConfiguration policyConfiguration = micrometerRoutePolicyFactory.getPolicyConfiguration(); + assertTrue(policyConfiguration.isContextEnabled()); + assertFalse(policyConfiguration.isRouteEnabled()); + } + + public static Asset applicationProperties() { + Writer writer = new StringWriter(); + + Properties props = new Properties(); + props.setProperty("quarkus.camel.metrics.route-policy-level", "context"); + + try { + props.store(writer, ""); + } catch (IOException e) { + throw new RuntimeException(e); + } + + return new StringAsset(writer.toString()); + } +} diff --git a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsDisabledTest.java b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsDisabledTest.java index 669bb1f8b727..860e7e0fa59b 100644 --- a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsDisabledTest.java +++ b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsDisabledTest.java @@ -35,6 +35,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -55,10 +56,10 @@ public void testMicrometerMetricsDisabled() { MessageHistoryFactory messageHistoryFactory = context.getMessageHistoryFactory(); assertNotNull(messageHistoryFactory); - assertTrue(messageHistoryFactory instanceof DefaultMessageHistoryFactory); + assertInstanceOf(DefaultMessageHistoryFactory.class, messageHistoryFactory); } - public static final Asset applicationProperties() { + public static Asset applicationProperties() { Writer writer = new StringWriter(); Properties props = new Properties(); diff --git a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsNamingPolicyLegacyTest.java b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsNamingPolicyLegacyTest.java new file mode 100644 index 000000000000..bab63673347e --- /dev/null +++ b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsNamingPolicyLegacyTest.java @@ -0,0 +1,130 @@ +/* + * 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 java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.util.List; +import java.util.Optional; +import java.util.Properties; + +import io.quarkus.test.QuarkusUnitTest; +import jakarta.inject.Inject; +import org.apache.camel.CamelContext; +import org.apache.camel.component.micrometer.eventnotifier.MicrometerExchangeEventNotifier; +import org.apache.camel.component.micrometer.eventnotifier.MicrometerExchangeEventNotifierNamingStrategy; +import org.apache.camel.component.micrometer.eventnotifier.MicrometerRouteEventNotifier; +import org.apache.camel.component.micrometer.eventnotifier.MicrometerRouteEventNotifierNamingStrategy; +import org.apache.camel.component.micrometer.messagehistory.MicrometerMessageHistoryFactory; +import org.apache.camel.component.micrometer.messagehistory.MicrometerMessageHistoryNamingStrategy; +import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyFactory; +import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyNamingStrategy; +import org.apache.camel.component.micrometer.spi.InstrumentedThreadPoolFactory; +import org.apache.camel.spi.EventNotifier; +import org.apache.camel.spi.MessageHistoryFactory; +import org.apache.camel.spi.RoutePolicyFactory; +import org.apache.camel.spi.ThreadPoolFactory; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.Asset; +import org.jboss.shrinkwrap.api.asset.StringAsset; +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.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class MicrometerMetricsNamingPolicyLegacyTest { + @RegisterExtension + static final QuarkusUnitTest CONFIG = new QuarkusUnitTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) + .addAsResource(applicationProperties(), "application.properties")); + + @Inject + CamelContext context; + + @Test + void legacyNamingPolicy() { + List routePolicyFactories = context.getRoutePolicyFactories(); + assertEquals(1, routePolicyFactories.size()); + RoutePolicyFactory routePolicyFactory = routePolicyFactories.get(0); + assertInstanceOf(MicrometerRoutePolicyFactory.class, routePolicyFactory); + MicrometerRoutePolicyFactory micrometerRoutePolicyFactory = (MicrometerRoutePolicyFactory) routePolicyFactory; + assertEquals(MicrometerRoutePolicyNamingStrategy.LEGACY, micrometerRoutePolicyFactory.getNamingStrategy()); + + MessageHistoryFactory messageHistoryFactory = context.getMessageHistoryFactory(); + assertNotNull(messageHistoryFactory); + assertInstanceOf(MicrometerMessageHistoryFactory.class, messageHistoryFactory); + + MicrometerMessageHistoryFactory micrometerMessageHistoryFactory = (MicrometerMessageHistoryFactory) messageHistoryFactory; + assertEquals(MicrometerMessageHistoryNamingStrategy.LEGACY, micrometerMessageHistoryFactory.getNamingStrategy()); + + List eventNotifiers = context.getManagementStrategy() + .getEventNotifiers() + .stream() + .filter(eventNotifier -> !eventNotifier.getClass().getName().contains("BaseMainSupport")) + .toList(); + assertEquals(3, eventNotifiers.size()); + + Optional optionalExchangeEventNotifier = context.getManagementStrategy() + .getEventNotifiers() + .stream() + .filter(eventNotifier -> eventNotifier.getClass().equals(MicrometerExchangeEventNotifier.class)) + .findFirst(); + assertTrue(optionalExchangeEventNotifier.isPresent()); + + MicrometerExchangeEventNotifier micrometerExchangeEventNotifier = (MicrometerExchangeEventNotifier) optionalExchangeEventNotifier + .get(); + assertEquals(MicrometerExchangeEventNotifierNamingStrategy.LEGACY, + micrometerExchangeEventNotifier.getNamingStrategy()); + + Optional optionalRouteEventNotifier = context.getManagementStrategy() + .getEventNotifiers() + .stream() + .filter(eventNotifier -> eventNotifier.getClass().equals(MicrometerRouteEventNotifier.class)) + .findFirst(); + assertTrue(optionalRouteEventNotifier.isPresent()); + + MicrometerRouteEventNotifier micrometerRouteEventNotifier = (MicrometerRouteEventNotifier) optionalRouteEventNotifier + .get(); + assertEquals(MicrometerRouteEventNotifierNamingStrategy.LEGACY, micrometerRouteEventNotifier.getNamingStrategy()); + + ThreadPoolFactory threadPoolFactory = context.getExecutorServiceManager().getThreadPoolFactory(); + assertNotNull(threadPoolFactory); + assertFalse(threadPoolFactory instanceof InstrumentedThreadPoolFactory); + } + + public static Asset applicationProperties() { + Writer writer = new StringWriter(); + + Properties props = new Properties(); + props.setProperty("quarkus.camel.metrics.naming-strategy", "legacy"); + props.setProperty("quarkus.camel.metrics.enable-message-history", "true"); + + try { + props.store(writer, ""); + } catch (IOException e) { + throw new RuntimeException(e); + } + + return new StringAsset(writer.toString()); + } +} diff --git a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsRouteRoutePolicyLevelTest.java b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsRouteRoutePolicyLevelTest.java new file mode 100644 index 000000000000..ca1581ce792a --- /dev/null +++ b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsRouteRoutePolicyLevelTest.java @@ -0,0 +1,79 @@ +/* + * 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 java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.util.List; +import java.util.Properties; + +import io.quarkus.test.QuarkusUnitTest; +import jakarta.inject.Inject; +import org.apache.camel.CamelContext; +import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyConfiguration; +import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyFactory; +import org.apache.camel.spi.RoutePolicyFactory; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.Asset; +import org.jboss.shrinkwrap.api.asset.StringAsset; +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.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class MicrometerMetricsRouteRoutePolicyLevelTest { + @RegisterExtension + static final QuarkusUnitTest CONFIG = new QuarkusUnitTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) + .addAsResource(applicationProperties(), "application.properties")); + + @Inject + CamelContext context; + + @Test + void routeRoutePolicy() { + List routePolicyFactories = context.getRoutePolicyFactories(); + assertEquals(1, routePolicyFactories.size()); + RoutePolicyFactory routePolicyFactory = routePolicyFactories.get(0); + assertInstanceOf(MicrometerRoutePolicyFactory.class, routePolicyFactory); + + MicrometerRoutePolicyFactory micrometerRoutePolicyFactory = (MicrometerRoutePolicyFactory) routePolicyFactory; + MicrometerRoutePolicyConfiguration policyConfiguration = micrometerRoutePolicyFactory.getPolicyConfiguration(); + assertFalse(policyConfiguration.isContextEnabled()); + assertTrue(policyConfiguration.isRouteEnabled()); + } + + public static Asset applicationProperties() { + Writer writer = new StringWriter(); + + Properties props = new Properties(); + props.setProperty("quarkus.camel.metrics.route-policy-level", "route"); + + try { + props.store(writer, ""); + } catch (IOException e) { + throw new RuntimeException(e); + } + + return new StringAsset(writer.toString()); + } +} diff --git a/extensions/micrometer/runtime/src/main/java/org/apache/camel/quarkus/component/micrometer/CamelMicrometerConfig.java b/extensions/micrometer/runtime/src/main/java/org/apache/camel/quarkus/component/micrometer/CamelMicrometerConfig.java index e283580286e4..ede0c1f8de3d 100644 --- a/extensions/micrometer/runtime/src/main/java/org/apache/camel/quarkus/component/micrometer/CamelMicrometerConfig.java +++ b/extensions/micrometer/runtime/src/main/java/org/apache/camel/quarkus/component/micrometer/CamelMicrometerConfig.java @@ -22,7 +22,6 @@ @ConfigRoot(name = "camel.metrics", phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED) public class CamelMicrometerConfig { - /** * Set whether to enable the MicrometerRoutePolicyFactory for capturing metrics * on route processing times. @@ -59,4 +58,32 @@ public class CamelMicrometerConfig { */ @ConfigItem(defaultValue = "false") public boolean enableInstrumentedThreadPoolFactory; + + /** + * Controls the naming style to use for metrics. The available values are {@code default} and {@code legacy}. + * {@code default} uses the default Micrometer naming convention. + * {@code legacy} uses the legacy camel-case naming style. + */ + @ConfigItem(defaultValue = "default") + public MetricsNamingStrategy namingStrategy; + + /** + * Sets the level of metrics to capture. The available values are {@code all} ,{@code context} and {@code route}. + * {@code all} captures metrics for both the camel context and routes. + * {@code route} captures metrics for routes only. + * {@code context} captures metrics for the camel context only. + */ + @ConfigItem(defaultValue = "all") + public RoutePolicyLevel routePolicyLevel; + + public enum MetricsNamingStrategy { + DEFAULT, + LEGACY + } + + public enum RoutePolicyLevel { + ALL, + CONTEXT, + ROUTE + } } 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 d7e7f2a9bc3b..bd4bf375f81e 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 @@ -23,10 +23,17 @@ 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.MicrometerExchangeEventNotifierNamingStrategy; import org.apache.camel.component.micrometer.eventnotifier.MicrometerRouteEventNotifier; +import org.apache.camel.component.micrometer.eventnotifier.MicrometerRouteEventNotifierNamingStrategy; import org.apache.camel.component.micrometer.messagehistory.MicrometerMessageHistoryFactory; +import org.apache.camel.component.micrometer.messagehistory.MicrometerMessageHistoryNamingStrategy; +import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyConfiguration; import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyFactory; +import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyNamingStrategy; import org.apache.camel.component.micrometer.spi.InstrumentedThreadPoolFactory; +import org.apache.camel.quarkus.component.micrometer.CamelMicrometerConfig.MetricsNamingStrategy; +import org.apache.camel.quarkus.component.micrometer.CamelMicrometerConfig.RoutePolicyLevel; import org.apache.camel.spi.CamelContextCustomizer; import org.apache.camel.spi.ManagementStrategy; @@ -59,18 +66,42 @@ public MicrometerContextCustomizer(CamelMicrometerConfig config) { @Override public void configure(CamelContext camelContext) { if (config.enableRoutePolicy) { - MicrometerRoutePolicyFactory mrpf = new MicrometerRoutePolicyFactory(); - mrpf.setCamelContext(camelContext); - camelContext.addRoutePolicyFactory(mrpf); + MicrometerRoutePolicyFactory factory = new MicrometerRoutePolicyFactory(); + factory.setCamelContext(camelContext); + camelContext.addRoutePolicyFactory(factory); + + if (config.namingStrategy.equals(MetricsNamingStrategy.LEGACY)) { + factory.setNamingStrategy(MicrometerRoutePolicyNamingStrategy.LEGACY); + } + + MicrometerRoutePolicyConfiguration policyConfiguration = factory.getPolicyConfiguration(); + if (config.routePolicyLevel.equals(RoutePolicyLevel.ALL)) { + factory.getPolicyConfiguration().setContextEnabled(true); + factory.getPolicyConfiguration().setRouteEnabled(true); + } else if (config.routePolicyLevel.equals(RoutePolicyLevel.CONTEXT)) { + factory.getPolicyConfiguration().setContextEnabled(true); + factory.getPolicyConfiguration().setRouteEnabled(false); + } else { + policyConfiguration.setContextEnabled(false); + policyConfiguration.setRouteEnabled(true); + } } ManagementStrategy managementStrategy = camelContext.getManagementStrategy(); if (config.enableExchangeEventNotifier) { - managementStrategy.addEventNotifier(new MicrometerExchangeEventNotifier()); + MicrometerExchangeEventNotifier eventNotifier = new MicrometerExchangeEventNotifier(); + if (config.namingStrategy.equals(MetricsNamingStrategy.LEGACY)) { + eventNotifier.setNamingStrategy(MicrometerExchangeEventNotifierNamingStrategy.LEGACY); + } + managementStrategy.addEventNotifier(eventNotifier); } if (config.enableRouteEventNotifier) { - managementStrategy.addEventNotifier(new MicrometerRouteEventNotifier()); + MicrometerRouteEventNotifier eventNotifier = new MicrometerRouteEventNotifier(); + if (config.namingStrategy.equals(MetricsNamingStrategy.LEGACY)) { + eventNotifier.setNamingStrategy(MicrometerRouteEventNotifierNamingStrategy.LEGACY); + } + managementStrategy.addEventNotifier(eventNotifier); } } } @@ -100,7 +131,11 @@ public void configure(CamelContext camelContext) { camelContext.setMessageHistory(true); } - camelContext.setMessageHistoryFactory(new MicrometerMessageHistoryFactory()); + MicrometerMessageHistoryFactory messageHistoryFactory = new MicrometerMessageHistoryFactory(); + if (config.namingStrategy.equals(MetricsNamingStrategy.LEGACY)) { + messageHistoryFactory.setNamingStrategy(MicrometerMessageHistoryNamingStrategy.LEGACY); + } + camelContext.setMessageHistoryFactory(messageHistoryFactory); } } }