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

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


The following commit(s) were added to refs/heads/camel-4.8.x by this push:
     new c89fac232d6 CAMEL-21661: camel-micrometer - multiple registrations of 
gauge camel.exchanges.inflight (#17010)
c89fac232d6 is described below

commit c89fac232d60634db0987ddd3ddea97d69492c4a
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Sat Feb 1 11:11:29 2025 +0100

    CAMEL-21661: camel-micrometer - multiple registrations of gauge 
camel.exchanges.inflight (#17010)
---
 .../MicrometerExchangeEventNotifier.java           | 69 ++++++++++++----------
 ...rometerExchangeEventNotifierNamingStrategy.java | 14 +++++
 ...terExchangeEventNotifierNamingStrategyTest.java | 11 +---
 3 files changed, 54 insertions(+), 40 deletions(-)

diff --git 
a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerExchangeEventNotifier.java
 
b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerExchangeEventNotifier.java
index 94a3653e843..beb4c875d95 100644
--- 
a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerExchangeEventNotifier.java
+++ 
b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerExchangeEventNotifier.java
@@ -83,25 +83,51 @@ public class MicrometerExchangeEventNotifier extends 
AbstractMicrometerEventNoti
 
         inflightRepository = getCamelContext().getInflightRepository();
 
-        // need to be able to remove meter if a route is removed
+        // need to be able to add/remove meter accordingly to route changes
         getCamelContext().getManagementStrategy().addEventNotifier(new 
SimpleEventNotifierSupport() {
             @Override
             public void notify(CamelEvent event) throws Exception {
-                if (event instanceof CamelEvent.RouteRemovedEvent rre) {
-                    String id = rre.getRoute().getRouteId();
-                    Meter meter = meterMap.remove(id);
-                    if (meter != null) {
-                        getMeterRegistry().remove(meter);
-                    }
+                if (event instanceof CamelEvent.RouteAddedEvent rre) {
+                    addInflightMeter(rre.getRoute());
+                } else if (event instanceof CamelEvent.RouteRemovedEvent rre) {
+                    removeInflightMeter(rre.getRoute().getRouteId());
                 }
             }
         });
+
+        // add existing routes
+        for (Route route : getCamelContext().getRoutes()) {
+            addInflightMeter(route);
+        }
+    }
+
+    private void addInflightMeter(Route route) {
+        boolean skip = (route.isCreatedByKamelet() && !registerKamelets)
+                || (route.isCreatedByRouteTemplate() && !registerTemplates);
+        if (!skip) {
+            String routeId = route.getRouteId();
+            String name = getNamingStrategy().getInflightExchangesName();
+            Tags tags = 
getNamingStrategy().getInflightExchangesTags(getCamelContext(), routeId);
+            Meter meter = Gauge.builder(name, () -> 
inflightRepository.size(routeId))
+                    .description("Route inflight messages")
+                    .tags(tags)
+                    .register(getMeterRegistry());
+            meterMap.put(routeId, meter);
+        }
+    }
+
+    private void removeInflightMeter(String routeId) {
+        Meter meter = meterMap.remove(routeId);
+        if (meter != null) {
+            getMeterRegistry().remove(meter);
+        }
     }
 
     @Override
     protected void doStop() throws Exception {
         super.doStop();
 
+        // remove all meters
         meterMap.values().forEach(m -> getMeterRegistry().remove(m));
         meterMap.clear();
     }
@@ -128,7 +154,6 @@ public class MicrometerExchangeEventNotifier extends 
AbstractMicrometerEventNoti
                 return;
             }
             if (!(getIgnoreExchanges().test(ee.getExchange()))) {
-                handleExchangeEvent(ee);
                 if (eventObject instanceof ExchangeCreatedEvent) {
                     handleCreatedEvent((ExchangeCreatedEvent) eventObject);
                 } else if (eventObject instanceof ExchangeSentEvent) {
@@ -140,35 +165,22 @@ public class MicrometerExchangeEventNotifier extends 
AbstractMicrometerEventNoti
         }
     }
 
-    private void handleExchangeEvent(ExchangeEvent exchangeEvent) {
-        Exchange exchange = exchangeEvent.getExchange();
-        if (exchange.getFromRouteId() != null && exchange.getFromEndpoint() != 
null) {
-            String name = namingStrategy.getInflightExchangesName(exchange, 
exchange.getFromEndpoint());
-            Tags tags = namingStrategy.getInflightExchangesTags(exchangeEvent, 
exchange.getFromEndpoint());
-            Meter meter = Gauge.builder(name, () -> 
getInflightExchangesInRoute(exchangeEvent))
-                    .description("Route inflight messages")
-                    .tags(tags)
-                    .register(getMeterRegistry());
-            meterMap.put(exchange.getFromRouteId(), meter);
-        }
-    }
-
     protected void handleSentEvent(ExchangeSentEvent sentEvent) {
-        String name = namingStrategy.getName(sentEvent.getExchange(), 
sentEvent.getEndpoint());
-        Tags tags = namingStrategy.getTags(sentEvent, sentEvent.getEndpoint());
+        String name = getNamingStrategy().getName(sentEvent.getExchange(), 
sentEvent.getEndpoint());
+        Tags tags = getNamingStrategy().getTags(sentEvent, 
sentEvent.getEndpoint());
         Timer timer = Timer.builder(name).tags(tags).description("Time taken 
to send message to the endpoint")
                 .register(getMeterRegistry());
         timer.record(sentEvent.getTimeTaken(), TimeUnit.MILLISECONDS);
     }
 
     protected void handleCreatedEvent(ExchangeCreatedEvent createdEvent) {
-        String name = namingStrategy.getName(createdEvent.getExchange(), 
createdEvent.getExchange().getFromEndpoint());
+        String name = getNamingStrategy().getName(createdEvent.getExchange(), 
createdEvent.getExchange().getFromEndpoint());
         createdEvent.getExchange().setProperty("eventTimer:" + name, 
Timer.start(getMeterRegistry()));
     }
 
     protected void handleDoneEvent(ExchangeEvent doneEvent) {
-        String name = namingStrategy.getName(doneEvent.getExchange(), 
doneEvent.getExchange().getFromEndpoint());
-        Tags tags = namingStrategy.getTags(doneEvent, 
doneEvent.getExchange().getFromEndpoint());
+        String name = getNamingStrategy().getName(doneEvent.getExchange(), 
doneEvent.getExchange().getFromEndpoint());
+        Tags tags = getNamingStrategy().getTags(doneEvent, 
doneEvent.getExchange().getFromEndpoint());
         // Would have preferred LongTaskTimer, but you cannot set the 
FAILED_TAG once it is registered
         Timer.Sample sample = (Timer.Sample) 
doneEvent.getExchange().removeProperty("eventTimer:" + name);
         if (sample != null) {
@@ -176,9 +188,4 @@ public class MicrometerExchangeEventNotifier extends 
AbstractMicrometerEventNoti
         }
     }
 
-    private int getInflightExchangesInRoute(ExchangeEvent exchangeEvent) {
-        String routeId = exchangeEvent.getExchange().getFromRouteId();
-        return inflightRepository.size(routeId);
-    }
-
 }
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 dddf50e5bc8..e98023db494 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
@@ -20,6 +20,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.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.component.micrometer.MicrometerUtils;
@@ -66,7 +67,12 @@ public interface 
MicrometerExchangeEventNotifierNamingStrategy {
         return name;
     }
 
+    @Deprecated
     default String getInflightExchangesName(Exchange exchange, Endpoint 
endpoint) {
+        return getInflightExchangesName();
+    }
+
+    default String getInflightExchangesName() {
         return formatName(DEFAULT_CAMEL_ROUTES_EXCHANGES_INFLIGHT);
     }
 
@@ -95,6 +101,7 @@ public interface 
MicrometerExchangeEventNotifierNamingStrategy {
         }
     }
 
+    @Deprecated
     default Tags getInflightExchangesTags(ExchangeEvent event, Endpoint 
endpoint) {
         if (event.getExchange().getFromRouteId() != null) {
             return Tags.of(
@@ -107,4 +114,11 @@ public interface 
MicrometerExchangeEventNotifierNamingStrategy {
                     KIND, KIND_EXCHANGE);
         }
     }
+
+    default Tags getInflightExchangesTags(CamelContext camelContext, String 
routeId) {
+        return Tags.of(
+                CAMEL_CONTEXT_TAG, camelContext.getName(),
+                KIND, KIND_EXCHANGE,
+                ROUTE_ID_TAG, routeId);
+    }
 }
diff --git 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerExchangeEventNotifierNamingStrategyTest.java
 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerExchangeEventNotifierNamingStrategyTest.java
index c45dca04e03..9c3ca6b1373 100644
--- 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerExchangeEventNotifierNamingStrategyTest.java
+++ 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/eventnotifier/MicrometerExchangeEventNotifierNamingStrategyTest.java
@@ -16,12 +16,9 @@
  */
 package org.apache.camel.component.micrometer.eventnotifier;
 
-import org.apache.camel.Endpoint;
-import org.apache.camel.Exchange;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.mockito.Mockito.*;
 
 class MicrometerExchangeEventNotifierNamingStrategyTest {
 
@@ -45,20 +42,16 @@ class MicrometerExchangeEventNotifierNamingStrategyTest {
 
     @Test
     void getDefaultInflightExchangesName() {
-        Exchange exchange = mock(Exchange.class);
-        Endpoint endpoint = mock(Endpoint.class);
         MicrometerExchangeEventNotifierNamingStrategy defaultStrategy = 
MicrometerExchangeEventNotifierNamingStrategy.DEFAULT;
-        String result = defaultStrategy.getInflightExchangesName(exchange, 
endpoint);
+        String result = defaultStrategy.getInflightExchangesName();
 
         assertEquals("camel.exchanges.inflight", result);
     }
 
     @Test
     void getLegacyInflightExchangesName() {
-        Exchange exchange = mock(Exchange.class);
-        Endpoint endpoint = mock(Endpoint.class);
         MicrometerExchangeEventNotifierNamingStrategy defaultStrategy = 
MicrometerExchangeEventNotifierNamingStrategy.LEGACY;
-        String result = defaultStrategy.getInflightExchangesName(exchange, 
endpoint);
+        String result = defaultStrategy.getInflightExchangesName();
 
         assertEquals("CamelExchangesInflight", result);
     }

Reply via email to