You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2023/10/22 08:52:49 UTC

[camel] 01/01: 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.

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch m-oldname
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 1cb1a3d806105964deca1e753e867ea229d6c015
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sun Oct 22 10:52:35 2023 +0200

    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      | 14 ++++++++-
 ...rometerExchangeEventNotifierNamingStrategy.java | 20 ++++++++++++-
 ...MicrometerRouteEventNotifierNamingStrategy.java | 29 ++++++++++++++++++
 .../MicrometerMessageHistoryNamingStrategy.java    | 19 ++++++++++++
 .../MicrometerRoutePolicyNamingStrategy.java       | 35 ++++++++++++++++++----
 .../MicrometerExchangeEventNotifierTest.java       |  4 +--
 .../AbstractMicrometerRoutePolicyTest.java         |  4 +++
 .../LegacyMicrometerRoutePolicyTest.java           | 34 +++++++++++++++++++++
 .../routepolicy/MicrometerRoutePolicyTest.java     |  6 ++--
 10 files changed, 174 insertions(+), 12 deletions(-)

diff --git a/components/camel-micrometer/src/main/docs/micrometer-component.adoc b/components/camel-micrometer/src/main/docs/micrometer-component.adoc
index 70284236a27..dc5f0bc930c 100644
--- a/components/camel-micrometer/src/main/docs/micrometer-component.adoc
+++ b/components/camel-micrometer/src/main/docs/micrometer-component.adoc
@@ -96,6 +96,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..002a67e55d8 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,18 @@ public final class MicrometerUtils {
         return new SimpleMeterRegistry();
     }
 
+    /**
+     * Converts the name to the legacy name
+     *
+     * @param  name the name
+     * @return      in legacy format (camelCase)
+     */
+    public static String legacyName(String name) {
+        // "camel.route.policy" -> "camelRoutePolicy"
+        name = name.replace('.', '-');
+        return StringHelper.dashToCamelCase(name);
+    }
+
     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/eventnotifier/MicrometerExchangeEventNotifierTest.java b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerExchangeEventNotifierTest.java
index 7369a94c85f..3065a76661a 100644
--- a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerExchangeEventNotifierTest.java
+++ b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerExchangeEventNotifierTest.java
@@ -55,8 +55,8 @@ public class MicrometerExchangeEventNotifierTest extends AbstractMicrometerEvent
             @Override
             public Object evaluate(Exchange exchange) {
                 try {
-                    Awaitility.await().pollDelay(SLEEP, TimeUnit.MILLISECONDS).catchUncaughtExceptions().untilAsserted(() ->
-                            Assertions.assertThat(currentInflightExchanges()).isEqualTo(1.0D, withPrecision(0.1D)));
+                    Awaitility.await().pollDelay(SLEEP, TimeUnit.MILLISECONDS).catchUncaughtExceptions().untilAsserted(
+                            () -> Assertions.assertThat(currentInflightExchanges()).isEqualTo(1.0D, withPrecision(0.1D)));
                     return exchange.getIn().getBody();
                 } catch (Exception e) {
                     if (e.getCause() instanceof InterruptedException) {
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..667659160ac
--- /dev/null
+++ b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/LegacyMicrometerRoutePolicyTest.java
@@ -0,0 +1,34 @@
+/*
+ * 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.MicrometerUtils;
+
+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) {
+        return MicrometerUtils.legacyName(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);