This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch camel-4.0.x in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-4.0.x by this push: new 7450b61480c CAMEL-19907: camel-micrometer - Add option to use old legacy naming s… (#11798) 7450b61480c is described below commit 7450b61480cab9f181910d955f5ff0936191a02f Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Sun Oct 22 14:28:30 2023 +0200 CAMEL-19907: camel-micrometer - Add option to use old legacy naming s… (#11798) CAMEL-19907: camel-micrometer - Add option to use old legacy naming style, that allows users that migrate to keep using old name as changing their monitoring systems can be harder. --- .../src/main/docs/micrometer-component.adoc | 21 ++++++++++ .../component/micrometer/MicrometerUtils.java | 16 +++++++- ...rometerExchangeEventNotifierNamingStrategy.java | 20 +++++++++- ...MicrometerRouteEventNotifierNamingStrategy.java | 29 ++++++++++++++ .../MicrometerMessageHistoryNamingStrategy.java | 19 +++++++++ .../MicrometerRoutePolicyNamingStrategy.java | 35 +++++++++++++--- .../AbstractMicrometerRoutePolicyTest.java | 4 ++ .../LegacyMicrometerRoutePolicyTest.java | 46 ++++++++++++++++++++++ .../routepolicy/MicrometerRoutePolicyTest.java | 6 ++- 9 files changed, 186 insertions(+), 10 deletions(-) diff --git a/components/camel-micrometer/src/main/docs/micrometer-component.adoc b/components/camel-micrometer/src/main/docs/micrometer-component.adoc index ccc211b4303..bc0e501ab2c 100644 --- a/components/camel-micrometer/src/main/docs/micrometer-component.adoc +++ b/components/camel-micrometer/src/main/docs/micrometer-component.adoc @@ -148,6 +148,27 @@ Some Camel specific metrics are available out of the box. |camel.route.policy.long.task |gauge + summary |Route long task metric |===================================================== +=== Using legacy metrics naming + +In Camel 3.20 or older, then the naming of metrics are using _camelCase_ style. +However, since Camel 3.21 onwards, the naming is using micrometer convention style (see table above). + +To use the legacy naming, then you can use the `LEGACY` naming from the `xxxNamingStrategy` interfaces. + +For example: + +[source,java] +---- +MicrometerRoutePolicyFactory factory = new MicrometerRoutePolicyFactory(); +factory.setNamingStrategy(MicrometerRoutePolicyNamingStrategy.LEGACY); +---- + +The naming style can be configured on: + +- `MicrometerRoutePolicyFactory` +- `MicrometerExchangeEventNotifier` +- `MicrometerRouteEventNotifier` +- `MicrometerMessageHistoryFactory` == Usage of producers diff --git a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerUtils.java b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerUtils.java index 3a43725818b..609b1648dfb 100644 --- a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerUtils.java +++ b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerUtils.java @@ -24,6 +24,7 @@ import io.micrometer.core.instrument.composite.CompositeMeterRegistry; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import org.apache.camel.RuntimeCamelException; import org.apache.camel.spi.Registry; +import org.apache.camel.util.StringHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,7 +33,6 @@ public final class MicrometerUtils { private static final Logger LOG = LoggerFactory.getLogger(MicrometerUtils.class); private MicrometerUtils() { - } public static Meter.Type getByName(String meterName) { @@ -88,6 +88,20 @@ public final class MicrometerUtils { return new SimpleMeterRegistry(); } + /** + * Converts the name to the legacy name + * + * @param name the name + * @return in legacy format (CamelCase with upper cased first letter) + */ + public static String legacyName(String name) { + // "camel.route.policy" -> "camelRoutePolicy" + name = name.replace('.', '-'); + name = StringHelper.dashToCamelCase(name); + // upper case first letter + return Character.toUpperCase(name.charAt(0)) + name.substring(1); + } + private static MeterRegistry getMeterRegistryFromCamelRegistry( Registry camelRegistry, String registryName, Class<? extends MeterRegistry> registryType) { diff --git a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerExchangeEventNotifierNamingStrategy.java b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerExchangeEventNotifierNamingStrategy.java index c7f935a9569..fdaa1c91053 100644 --- a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerExchangeEventNotifierNamingStrategy.java +++ b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerExchangeEventNotifierNamingStrategy.java @@ -37,12 +37,30 @@ public interface MicrometerExchangeEventNotifierNamingStrategy { Predicate<Meter.Id> EVENT_NOTIFIERS = id -> MicrometerEventNotifierService.class.getSimpleName().equals(id.getTag(SERVICE_NAME)); + + /** + * Default naming strategy that uses micrometer naming convention. + */ MicrometerExchangeEventNotifierNamingStrategy DEFAULT = (event, endpoint) -> DEFAULT_CAMEL_EXCHANGE_EVENT_METER_NAME; + /** + * Naming strategy that uses the classic/legacy naming style (camelCase) + */ + MicrometerExchangeEventNotifierNamingStrategy LEGACY = new MicrometerExchangeEventNotifierNamingStrategy() { + @Override + public String getName(Exchange exchange, Endpoint endpoint) { + return formatName(DEFAULT_CAMEL_EXCHANGE_EVENT_METER_NAME); + } + }; + String getName(Exchange exchange, Endpoint endpoint); + default String formatName(String name) { + return name; + } + default String getInflightExchangesName(Exchange exchange, Endpoint endpoint) { - return DEFAULT_CAMEL_ROUTES_EXCHANGES_INFLIGHT; + return formatName(DEFAULT_CAMEL_ROUTES_EXCHANGES_INFLIGHT); } default Tags getTags(ExchangeEvent event, Endpoint endpoint) { diff --git a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerRouteEventNotifierNamingStrategy.java b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerRouteEventNotifierNamingStrategy.java index ac1206772c1..094567ee790 100644 --- a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerRouteEventNotifierNamingStrategy.java +++ b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerRouteEventNotifierNamingStrategy.java @@ -21,6 +21,7 @@ import java.util.function.Predicate; import io.micrometer.core.instrument.Meter; import io.micrometer.core.instrument.Tags; import org.apache.camel.CamelContext; +import org.apache.camel.component.micrometer.MicrometerUtils; import org.apache.camel.spi.CamelEvent.RouteEvent; import static org.apache.camel.component.micrometer.MicrometerConstants.CAMEL_CONTEXT_TAG; @@ -33,6 +34,10 @@ public interface MicrometerRouteEventNotifierNamingStrategy { Predicate<Meter.Id> EVENT_NOTIFIERS = id -> MicrometerEventNotifierService.class.getSimpleName().equals(id.getTag(SERVICE_NAME)); + + /** + * Default naming strategy that uses micrometer naming convention. + */ MicrometerRouteEventNotifierNamingStrategy DEFAULT = new MicrometerRouteEventNotifierNamingStrategy() { @Override public String getRouteAddedName() { @@ -45,6 +50,30 @@ public interface MicrometerRouteEventNotifierNamingStrategy { } }; + /** + * Naming strategy that uses the classic/legacy naming style (camelCase) + */ + MicrometerRouteEventNotifierNamingStrategy LEGACY = new MicrometerRouteEventNotifierNamingStrategy() { + @Override + public String getRouteAddedName() { + return formatName(DEFAULT_CAMEL_ROUTES_ADDED); + } + + @Override + public String getRouteRunningName() { + return formatName(DEFAULT_CAMEL_ROUTES_RUNNING); + } + + @Override + public String formatName(String name) { + return MicrometerUtils.legacyName(name); + } + }; + + default String formatName(String name) { + return name; + } + String getRouteAddedName(); String getRouteRunningName(); diff --git a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/messagehistory/MicrometerMessageHistoryNamingStrategy.java b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/messagehistory/MicrometerMessageHistoryNamingStrategy.java index 1fcda3eadb1..69fc05a1aa0 100644 --- a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/messagehistory/MicrometerMessageHistoryNamingStrategy.java +++ b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/messagehistory/MicrometerMessageHistoryNamingStrategy.java @@ -22,6 +22,7 @@ import io.micrometer.core.instrument.Meter; import io.micrometer.core.instrument.Tags; import org.apache.camel.NamedNode; import org.apache.camel.Route; +import org.apache.camel.component.micrometer.MicrometerUtils; import static org.apache.camel.component.micrometer.MicrometerConstants.CAMEL_CONTEXT_TAG; import static org.apache.camel.component.micrometer.MicrometerConstants.DEFAULT_CAMEL_MESSAGE_HISTORY_METER_NAME; @@ -36,10 +37,28 @@ public interface MicrometerMessageHistoryNamingStrategy { Predicate<Meter.Id> MESSAGE_HISTORIES = id -> MicrometerMessageHistoryService.class.getSimpleName().equals(id.getTag(SERVICE_NAME)); + + /** + * Default naming strategy that uses micrometer naming convention. + */ MicrometerMessageHistoryNamingStrategy DEFAULT = (route, node) -> DEFAULT_CAMEL_MESSAGE_HISTORY_METER_NAME; + /** + * Naming strategy that uses the classic/legacy naming style (camelCase) + */ + MicrometerMessageHistoryNamingStrategy LEGACY = new MicrometerMessageHistoryNamingStrategy() { + @Override + public String getName(Route route, NamedNode node) { + return MicrometerUtils.legacyName(DEFAULT_CAMEL_MESSAGE_HISTORY_METER_NAME); + } + }; + String getName(Route route, NamedNode node); + default String formatName(String name) { + return name; + } + default Tags getTags(Route route, NamedNode node) { return Tags.of( CAMEL_CONTEXT_TAG, route.getCamelContext().getName(), diff --git a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyNamingStrategy.java b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyNamingStrategy.java index 1b51c687965..f3e05e5e534 100644 --- a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyNamingStrategy.java +++ b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyNamingStrategy.java @@ -21,6 +21,7 @@ import java.util.function.Predicate; import io.micrometer.core.instrument.Meter; import io.micrometer.core.instrument.Tags; import org.apache.camel.Route; +import org.apache.camel.component.micrometer.MicrometerUtils; import static org.apache.camel.component.micrometer.MicrometerConstants.*; @@ -32,32 +33,54 @@ public interface MicrometerRoutePolicyNamingStrategy { Predicate<Meter.Id> ROUTE_POLICIES = id -> MicrometerRoutePolicyService.class.getSimpleName().equals(id.getTag(SERVICE_NAME)); + /** + * Default naming strategy that uses micrometer naming convention. + */ MicrometerRoutePolicyNamingStrategy DEFAULT = route -> DEFAULT_CAMEL_ROUTE_POLICY_METER_NAME; + /** + * Naming strategy that uses the classic/legacy naming style (camelCase) + */ + MicrometerRoutePolicyNamingStrategy LEGACY = new MicrometerRoutePolicyNamingStrategy() { + @Override + public String getName(Route route) { + return formatName(DEFAULT_CAMEL_ROUTE_POLICY_METER_NAME); + } + + @Override + public String formatName(String name) { + return MicrometerUtils.legacyName(name); + } + }; + String getName(Route route); + default String formatName(String name) { + return name; + } + default String getExchangesSucceededName(Route route) { - return DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_SUCCEEDED_METER_NAME; + return formatName(DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_SUCCEEDED_METER_NAME); } default String getExchangesFailedName(Route route) { - return DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_FAILED_METER_NAME; + return formatName(DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_FAILED_METER_NAME); } default String getExchangesTotalName(Route route) { - return DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_TOTAL_METER_NAME; + return formatName(DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_TOTAL_METER_NAME); } default String getFailuresHandledName(Route route) { - return DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_FAILURES_HANDLED_METER_NAME; + return formatName(DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_FAILURES_HANDLED_METER_NAME); } default String getExternalRedeliveriesName(Route route) { - return DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_EXTERNAL_REDELIVERIES_METER_NAME; + return formatName(DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_EXTERNAL_REDELIVERIES_METER_NAME); } default String getLongTaskName(Route route) { - return DEFAULT_CAMEL_ROUTE_POLICY_LONGMETER_NAME; + return formatName(DEFAULT_CAMEL_ROUTE_POLICY_LONGMETER_NAME); } default Tags getTags(Route route) { diff --git a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/AbstractMicrometerRoutePolicyTest.java b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/AbstractMicrometerRoutePolicyTest.java index b2aa93976b3..feb1dd369c5 100644 --- a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/AbstractMicrometerRoutePolicyTest.java +++ b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/AbstractMicrometerRoutePolicyTest.java @@ -51,6 +51,10 @@ public abstract class AbstractMicrometerRoutePolicyTest extends CamelTestSupport return new MicrometerRoutePolicyFactory(); } + protected String formatMetricName(String name) { + return name; + } + @Override protected CamelContext createCamelContext() throws Exception { CamelContext context = super.createCamelContext(); diff --git a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/LegacyMicrometerRoutePolicyTest.java b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/LegacyMicrometerRoutePolicyTest.java new file mode 100644 index 00000000000..f3989e47bd2 --- /dev/null +++ b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/LegacyMicrometerRoutePolicyTest.java @@ -0,0 +1,46 @@ +/* + * 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.component.micrometer.routepolicy; + +import org.apache.camel.component.micrometer.MicrometerConstants; +import org.apache.camel.component.micrometer.MicrometerUtils; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class LegacyMicrometerRoutePolicyTest extends MicrometerRoutePolicyTest { + + @Override + protected MicrometerRoutePolicyFactory createMicrometerRoutePolicyFactory() { + MicrometerRoutePolicyFactory factory = new MicrometerRoutePolicyFactory(); + factory.setNamingStrategy(MicrometerRoutePolicyNamingStrategy.LEGACY); + return factory; + } + + @Override + protected String formatMetricName(String name) { + // use legacy name + return "CamelRoutePolicy"; + } + + @Test + public void testLegacyName() { + Assertions.assertEquals("CamelRoutePolicy", + MicrometerUtils.legacyName(MicrometerConstants.DEFAULT_CAMEL_ROUTE_POLICY_METER_NAME)); + Assertions.assertEquals("CamelMessageHistory", + MicrometerUtils.legacyName(MicrometerConstants.DEFAULT_CAMEL_MESSAGE_HISTORY_METER_NAME)); + } +} diff --git a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyTest.java b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyTest.java index 2ad23ccb158..7096b9d4d90 100644 --- a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyTest.java +++ b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyTest.java @@ -49,13 +49,15 @@ public class MicrometerRoutePolicyTest extends AbstractMicrometerRoutePolicyTest MockEndpoint.assertIsSatisfied(context); - Timer fooTimer = meterRegistry.find(DEFAULT_CAMEL_ROUTE_POLICY_METER_NAME).tag(ROUTE_ID_TAG, "foo").timer(); + Timer fooTimer + = meterRegistry.find(formatMetricName(DEFAULT_CAMEL_ROUTE_POLICY_METER_NAME)).tag(ROUTE_ID_TAG, "foo").timer(); assertEquals(count / 2, fooTimer.count()); assertTrue(fooTimer.mean(TimeUnit.MILLISECONDS) > DELAY_FOO); assertTrue(fooTimer.max(TimeUnit.MILLISECONDS) > DELAY_FOO); assertTrue(fooTimer.totalTime(TimeUnit.MILLISECONDS) > DELAY_FOO * count / 2); - Timer barTimer = meterRegistry.find(DEFAULT_CAMEL_ROUTE_POLICY_METER_NAME).tag(ROUTE_ID_TAG, "bar").timer(); + Timer barTimer + = meterRegistry.find(formatMetricName(DEFAULT_CAMEL_ROUTE_POLICY_METER_NAME)).tag(ROUTE_ID_TAG, "bar").timer(); assertEquals(count / 2, barTimer.count()); assertTrue(barTimer.mean(TimeUnit.MILLISECONDS) > DELAY_BAR); assertTrue(barTimer.max(TimeUnit.MILLISECONDS) > DELAY_BAR);