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/12/19 11:44:01 UTC

(camel) 07/07: Experiment

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

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

commit 35bdfded905bb5cf9760d53a14da9759792bc2f3
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Dec 19 12:43:23 2023 +0100

    Experiment
---
 .../prometheus/MicrometerPrometheus.java           |  6 ++--
 .../MicrometerExchangeEventNotifier.java           | 34 ++++++++++++++++++++--
 2 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/components/camel-micrometer-prometheus/src/main/java/org/apache/camel/component/micrometer/prometheus/MicrometerPrometheus.java b/components/camel-micrometer-prometheus/src/main/java/org/apache/camel/component/micrometer/prometheus/MicrometerPrometheus.java
index 0fb8ae2257e..63289d4b668 100644
--- a/components/camel-micrometer-prometheus/src/main/java/org/apache/camel/component/micrometer/prometheus/MicrometerPrometheus.java
+++ b/components/camel-micrometer-prometheus/src/main/java/org/apache/camel/component/micrometer/prometheus/MicrometerPrometheus.java
@@ -297,11 +297,9 @@ public class MicrometerPrometheus extends ServiceSupport implements CamelMetrics
                             for (Meter m : meterRegistry.getMeters()) {
                                 String n = m.getId().getName();
                                 boolean camel = n.startsWith("camel_") || n.startsWith("camel.");
-                                boolean inflight
-                                        = n.startsWith("camel.exchanges.inflight") || n.startsWith("camel_exchanges_inflight");
                                 boolean keep = n.startsWith("camel.exchanges.") || n.startsWith("camel_exchanges_");
-                                // remove camel or inflight, but keep those special camel.exchanges. counters
-                                boolean remove = camel && (inflight || !keep);
+                                // remove camel but keep those special camel.exchanges. counters
+                                boolean remove = camel && !keep;
                                 if (remove) {
                                     String t = m.getId().getTag("routeId");
                                     if (t != null) {
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 d4fc998b69f..61ce90e9526 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
@@ -16,10 +16,13 @@
  */
 package org.apache.camel.component.micrometer.eventnotifier;
 
+import java.util.HashMap;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Predicate;
 
 import io.micrometer.core.instrument.Gauge;
+import io.micrometer.core.instrument.Meter;
 import io.micrometer.core.instrument.Tags;
 import io.micrometer.core.instrument.Timer;
 import org.apache.camel.Exchange;
@@ -30,9 +33,12 @@ import org.apache.camel.spi.CamelEvent.ExchangeEvent;
 import org.apache.camel.spi.CamelEvent.ExchangeFailedEvent;
 import org.apache.camel.spi.CamelEvent.ExchangeSentEvent;
 import org.apache.camel.spi.InflightRepository;
+import org.apache.camel.support.SimpleEventNotifierSupport;
 
 public class MicrometerExchangeEventNotifier extends AbstractMicrometerEventNotifier<ExchangeEvent> {
     private InflightRepository inflightRepository;
+
+    private final Map<String, Meter> meterMap = new HashMap<>();
     private Predicate<Exchange> ignoreExchanges = exchange -> false;
     private MicrometerExchangeEventNotifierNamingStrategy namingStrategy
             = MicrometerExchangeEventNotifierNamingStrategy.DEFAULT;
@@ -59,8 +65,31 @@ public class MicrometerExchangeEventNotifier extends AbstractMicrometerEventNoti
 
     @Override
     protected void doStart() throws Exception {
-        inflightRepository = getCamelContext().getInflightRepository();
         super.doStart();
+
+        inflightRepository = getCamelContext().getInflightRepository();
+
+        // need to be able to remove meter if a route is removed
+        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);
+                    }
+                }
+            }
+        });
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        super.doStop();
+
+        meterMap.values().forEach(m -> getMeterRegistry().remove(m));
+        meterMap.clear();
     }
 
     @Override
@@ -82,10 +111,11 @@ public class MicrometerExchangeEventNotifier extends AbstractMicrometerEventNoti
         if (exchange.getFromRouteId() != null && exchange.getFromEndpoint() != null) {
             String name = namingStrategy.getInflightExchangesName(exchange, exchange.getFromEndpoint());
             Tags tags = namingStrategy.getInflightExchangesTags(exchangeEvent, exchange.getFromEndpoint());
-            Gauge.builder(name, () -> getInflightExchangesInRoute(exchangeEvent))
+            Meter meter = Gauge.builder(name, () -> getInflightExchangesInRoute(exchangeEvent))
                     .description("Route inflight messages")
                     .tags(tags)
                     .register(getMeterRegistry());
+            meterMap.put(exchange.getFromRouteId(), meter);
         }
     }