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); }