You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2020/07/08 12:13:12 UTC

[camel] branch master updated: CAMEL-15255: Extend set of micrometer metrics provided (#3976)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 9e1f2d3  CAMEL-15255: Extend set of micrometer metrics provided (#3976)
9e1f2d3 is described below

commit 9e1f2d3e9dd70616445fe97798238515acb0b8ba
Author: espeandr <es...@hotmail.com>
AuthorDate: Wed Jul 8 14:12:57 2020 +0200

    CAMEL-15255: Extend set of micrometer metrics provided (#3976)
    
    Co-authored-by: Espen Andreassen <es...@statnett.no>
---
 .../component/micrometer/MicrometerConstants.java  |  3 +
 .../MicrometerExchangeEventNotifier.java           | 24 +++++++-
 ...rometerExchangeEventNotifierNamingStrategy.java | 14 +++++
 .../routepolicy/MicrometerRoutePolicy.java         | 18 ++++++
 .../MicrometerRoutePolicyNamingStrategy.java       | 17 ++++++
 .../MicrometerExchangeEventNotifierTest.java       | 11 ++++
 .../ManagedMicrometerRoutePolicyTest.java          |  4 +-
 .../MicrometerRoutePolicyExchangeStatusTest.java   | 64 ++++++++++++++++++++++
 ...MicrometerRoutePolicyMulticastSubRouteTest.java | 31 +++++++++--
 .../MicrometerRoutePolicySubRouteTest.java         |  7 ++-
 10 files changed, 182 insertions(+), 11 deletions(-)

diff --git a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerConstants.java b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerConstants.java
index 5ffd3d9..d30ae6d 100644
--- a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerConstants.java
+++ b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerConstants.java
@@ -31,10 +31,13 @@ public final class MicrometerConstants {
     public static final String HEADER_METRIC_TAGS = HEADER_PREFIX + "Tags";
 
     public static final String DEFAULT_CAMEL_MESSAGE_HISTORY_METER_NAME = "CamelMessageHistory";
+    public static final String DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_FAILED_METER_NAME = "CamelExchangesFailed";
+    public static final String DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_SUCCEEDED_METER_NAME = "CamelExchangesSucceeded";
     public static final String DEFAULT_CAMEL_ROUTE_POLICY_METER_NAME = "CamelRoutePolicy";
     public static final String DEFAULT_CAMEL_EXCHANGE_EVENT_METER_NAME = "CamelExchangeEventNotifier";
     public static final String DEFAULT_CAMEL_ROUTES_ADDED = "CamelRoutesAdded";
     public static final String DEFAULT_CAMEL_ROUTES_RUNNING = "CamelRoutesRunning";
+    public static final String DEFAULT_CAMEL_ROUTES_EXCHANGES_INFLIGHT = "CamelExchangesInflight";
 
     public static final String ROUTE_ID_TAG = "routeId";
     public static final String NODE_ID_TAG = "nodeId";
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 85929d7..f22ff17 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
@@ -19,6 +19,7 @@ package org.apache.camel.component.micrometer.eventnotifier;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Predicate;
 
+import io.micrometer.core.instrument.Gauge;
 import io.micrometer.core.instrument.Tags;
 import io.micrometer.core.instrument.Timer;
 import org.apache.camel.Exchange;
@@ -28,9 +29,10 @@ import org.apache.camel.spi.CamelEvent.ExchangeCreatedEvent;
 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;
 
 public class MicrometerExchangeEventNotifier extends AbstractMicrometerEventNotifier<ExchangeEvent> {
-
+    private InflightRepository inflightRepository;
     private Predicate<Exchange> ignoreExchanges = exchange -> false;
     private MicrometerExchangeEventNotifierNamingStrategy namingStrategy = MicrometerExchangeEventNotifierNamingStrategy.DEFAULT;
 
@@ -55,8 +57,15 @@ public class MicrometerExchangeEventNotifier extends AbstractMicrometerEventNoti
     }
 
     @Override
+    protected void doStart() throws Exception {
+        inflightRepository = getCamelContext().getInflightRepository();
+        super.doStart();
+    }
+
+    @Override
     public void notify(CamelEvent eventObject) {
         if (!(getIgnoreExchanges().test(((ExchangeEvent) eventObject).getExchange()))) {
+            handleExchangeEvent((ExchangeEvent) eventObject);
             if (eventObject instanceof ExchangeSentEvent) {
                 handleSentEvent((ExchangeSentEvent) eventObject);
             } else if (eventObject instanceof ExchangeCreatedEvent) {
@@ -67,6 +76,14 @@ public class MicrometerExchangeEventNotifier extends AbstractMicrometerEventNoti
         }
     }
 
+    private void handleExchangeEvent(ExchangeEvent exchangeEvent) {
+        String name = namingStrategy.getInflightExchangesName(exchangeEvent.getExchange(), exchangeEvent.getExchange().getFromEndpoint());
+        Tags tags = namingStrategy.getInflightExchangesTags(exchangeEvent, exchangeEvent.getExchange().getFromEndpoint());
+        Gauge.builder(name, () -> getInflightExchangesInRoute(exchangeEvent))
+            .tags(tags)
+            .register(getMeterRegistry());
+    }
+
     protected void handleSentEvent(ExchangeSentEvent sentEvent) {
         String name = namingStrategy.getName(sentEvent.getExchange(), sentEvent.getEndpoint());
         Tags tags = namingStrategy.getTags(sentEvent, sentEvent.getEndpoint());
@@ -88,5 +105,10 @@ 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 7ce935d..5a27f76 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
@@ -26,9 +26,11 @@ import org.apache.camel.spi.CamelEvent.ExchangeEvent;
 
 import static org.apache.camel.component.micrometer.MicrometerConstants.CAMEL_CONTEXT_TAG;
 import static org.apache.camel.component.micrometer.MicrometerConstants.DEFAULT_CAMEL_EXCHANGE_EVENT_METER_NAME;
+import static org.apache.camel.component.micrometer.MicrometerConstants.DEFAULT_CAMEL_ROUTES_EXCHANGES_INFLIGHT;
 import static org.apache.camel.component.micrometer.MicrometerConstants.ENDPOINT_NAME;
 import static org.apache.camel.component.micrometer.MicrometerConstants.EVENT_TYPE_TAG;
 import static org.apache.camel.component.micrometer.MicrometerConstants.FAILED_TAG;
+import static org.apache.camel.component.micrometer.MicrometerConstants.ROUTE_ID_TAG;
 import static org.apache.camel.component.micrometer.MicrometerConstants.SERVICE_NAME;
 
 public interface MicrometerExchangeEventNotifierNamingStrategy {
@@ -38,6 +40,10 @@ public interface MicrometerExchangeEventNotifierNamingStrategy {
 
     String getName(Exchange exchange, Endpoint endpoint);
 
+    default String getInflightExchangesName(Exchange exchange, Endpoint endpoint) {
+        return DEFAULT_CAMEL_ROUTES_EXCHANGES_INFLIGHT;
+    }
+
     default Tags getTags(ExchangeEvent event, Endpoint endpoint) {
         return Tags.of(
                 CAMEL_CONTEXT_TAG, event.getExchange().getContext().getName(),
@@ -47,4 +53,12 @@ public interface MicrometerExchangeEventNotifierNamingStrategy {
                 FAILED_TAG, Boolean.toString(event.getExchange().isFailed())
         );
     }
+
+    default Tags getInflightExchangesTags(ExchangeEvent event, Endpoint endpoint) {
+        return Tags.of(
+            CAMEL_CONTEXT_TAG, event.getExchange().getContext().getName(),
+            SERVICE_NAME, MicrometerEventNotifierService.class.getSimpleName(),
+            ROUTE_ID_TAG, event.getExchange().getFromRouteId()
+        );
+    }
 }
diff --git a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicy.java b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicy.java
index 200be1c..4af8cf7 100644
--- a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicy.java
+++ b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicy.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.micrometer.routepolicy;
 
 import java.util.concurrent.TimeUnit;
 
+import io.micrometer.core.instrument.Counter;
 import io.micrometer.core.instrument.MeterRegistry;
 import io.micrometer.core.instrument.Tags;
 import io.micrometer.core.instrument.Timer;
@@ -51,11 +52,15 @@ public class MicrometerRoutePolicy extends RoutePolicySupport implements NonMana
         private final MeterRegistry meterRegistry;
         private final Route route;
         private final MicrometerRoutePolicyNamingStrategy namingStrategy;
+        private final Counter exchangesSucceeded;
+        private final Counter exchangesFailed;
 
         private MetricsStatistics(MeterRegistry meterRegistry, Route route, MicrometerRoutePolicyNamingStrategy namingStrategy) {
             this.meterRegistry = ObjectHelper.notNull(meterRegistry, "MeterRegistry", this);
             this.namingStrategy = ObjectHelper.notNull(namingStrategy, "MicrometerRoutePolicyNamingStrategy", this);
             this.route = route;
+            this.exchangesSucceeded = createCounter(namingStrategy.getExchangesSucceededName(route));
+            this.exchangesFailed = createCounter(namingStrategy.getExchangesFailedName(route));
         }
 
         public void onExchangeBegin(Exchange exchange) {
@@ -72,11 +77,24 @@ public class MicrometerRoutePolicy extends RoutePolicySupport implements NonMana
                         .register(meterRegistry);
                 sample.stop(timer);
             }
+
+            if (exchange.isFailed()) {
+                exchangesFailed.increment();
+            } else {
+                exchangesSucceeded.increment();
+            }
         }
 
         private String propertyName(Exchange exchange) {
             return String.format("%s-%s-%s", DEFAULT_CAMEL_ROUTE_POLICY_METER_NAME, route.getId(), exchange.getExchangeId());
         }
+
+        private Counter createCounter(String meterName) {
+            return Counter.builder(meterName)
+                .tags(namingStrategy.getExchangeStatusTags(route))
+                .description(route.getDescription())
+                .register(meterRegistry);
+        }
     }
 
 
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 00cd0b66..c1c205b 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
@@ -24,6 +24,8 @@ import org.apache.camel.Exchange;
 import org.apache.camel.Route;
 
 import static org.apache.camel.component.micrometer.MicrometerConstants.CAMEL_CONTEXT_TAG;
+import static org.apache.camel.component.micrometer.MicrometerConstants.DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_FAILED_METER_NAME;
+import static org.apache.camel.component.micrometer.MicrometerConstants.DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_SUCCEEDED_METER_NAME;
 import static org.apache.camel.component.micrometer.MicrometerConstants.DEFAULT_CAMEL_ROUTE_POLICY_METER_NAME;
 import static org.apache.camel.component.micrometer.MicrometerConstants.FAILED_TAG;
 import static org.apache.camel.component.micrometer.MicrometerConstants.ROUTE_ID_TAG;
@@ -40,6 +42,14 @@ public interface MicrometerRoutePolicyNamingStrategy {
 
     String getName(Route route);
 
+    default String getExchangesSucceededName(Route route) {
+        return DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_SUCCEEDED_METER_NAME;
+    }
+
+    default String getExchangesFailedName(Route route) {
+        return DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_FAILED_METER_NAME;
+    }
+
     default Tags getTags(Route route, Exchange exchange) {
         return Tags.of(
                 CAMEL_CONTEXT_TAG, route.getCamelContext().getName(),
@@ -49,4 +59,11 @@ public interface MicrometerRoutePolicyNamingStrategy {
         );
     }
 
+    default Tags getExchangeStatusTags(Route route) {
+        return Tags.of(
+                CAMEL_CONTEXT_TAG, route.getCamelContext().getName(),
+                SERVICE_NAME, MicrometerRoutePolicyService.class.getSimpleName(),
+                ROUTE_ID_TAG, route.getId()
+        );
+    }
 }
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 5ccf666..e56d481 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
@@ -28,6 +28,9 @@ import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.support.ExpressionAdapter;
 import org.junit.Test;
 
+import static org.apache.camel.component.micrometer.MicrometerConstants.DEFAULT_CAMEL_ROUTES_EXCHANGES_INFLIGHT;
+import static org.apache.camel.component.micrometer.MicrometerConstants.ROUTE_ID_TAG;
+
 public class MicrometerExchangeEventNotifierTest extends AbstractMicrometerEventNotifierTest {
 
     private static final String ROUTE_ID = "test";
@@ -50,6 +53,7 @@ public class MicrometerExchangeEventNotifierTest extends AbstractMicrometerEvent
             @Override
             public Object evaluate(Exchange exchange) {
                 try {
+                    assertEquals(1.0D, currentInflightExchanges(), 0.1D);
                     Thread.sleep(SLEEP);
                     return exchange.getIn().getBody();
                 } catch (InterruptedException e) {
@@ -63,9 +67,16 @@ public class MicrometerExchangeEventNotifierTest extends AbstractMicrometerEvent
         for (int i = 0; i < count; i++) {
             template.sendBody(DIRECT_IN, new Object());
         }
+
+        mock.assertIsSatisfied();
         Timer timer = meterRegistry.find(MOCK_OUT).timer();
         assertEquals(count, timer.count());
         assertTrue(timer.mean(TimeUnit.MILLISECONDS) > SLEEP.doubleValue());
+        assertEquals(0.0D, currentInflightExchanges(), 0.1D);
+    }
+
+    private double currentInflightExchanges() {
+        return meterRegistry.find(DEFAULT_CAMEL_ROUTES_EXCHANGES_INFLIGHT).tag(ROUTE_ID_TAG, ROUTE_ID).gauge().value();
     }
 
     @Override
diff --git a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/ManagedMicrometerRoutePolicyTest.java b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/ManagedMicrometerRoutePolicyTest.java
index 2d209ba..63c4a83 100644
--- a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/ManagedMicrometerRoutePolicyTest.java
+++ b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/ManagedMicrometerRoutePolicyTest.java
@@ -48,9 +48,9 @@ public class ManagedMicrometerRoutePolicyTest extends AbstractMicrometerRoutePol
 
         assertMockEndpointsSatisfied();
 
-        // there should be 3 names
+        // there should be 7 names
         List<Meter> meters = meterRegistry.getMeters();
-        assertEquals(3, meters.size());
+        assertEquals(7, meters.size());
 
         String name = String.format("org.apache.camel:context=%s,type=services,name=MicrometerRoutePolicyService", context.getManagementName());
         ObjectName on = ObjectName.getInstance(name);
diff --git a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyExchangeStatusTest.java b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyExchangeStatusTest.java
new file mode 100644
index 0000000..7f2e94d
--- /dev/null
+++ b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyExchangeStatusTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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 io.micrometer.core.instrument.Counter;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Test;
+
+import static org.apache.camel.component.micrometer.MicrometerConstants.*;
+
+public class MicrometerRoutePolicyExchangeStatusTest extends AbstractMicrometerRoutePolicyTest {
+
+    @Test
+    public void testMetricsExchangeStatus() throws Exception {
+        int count = 10;
+        MockEndpoint mockEndpoint = getMockEndpoint("mock:result");
+        mockEndpoint.expectedMessageCount(count / 2);
+
+        for (int i = 0; i < count; i++) {
+            if (i % 2 == 0) {
+                template.sendBody("direct:completing", "Hello");
+            } else {
+                assertThrows(RuntimeException.class, () -> template.sendBody("direct:failing", "Hello"));
+            }
+        }
+
+        assertMockEndpointsSatisfied();
+        Counter exchangesSucceededCounter = meterRegistry.find(DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_SUCCEEDED_METER_NAME).tag(ROUTE_ID_TAG, "completing").counter();
+        Counter exchangesFailedCounter = meterRegistry.find(DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_FAILED_METER_NAME).tag(ROUTE_ID_TAG, "failing").counter();
+        assertEquals(count / 2.0D, exchangesSucceededCounter.count(), 0.01D);
+        assertEquals(count / 2.0D, exchangesFailedCounter.count(), 0.01D);
+
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:completing").routeId("completing")
+                    .to("mock:result");
+
+                from("direct:failing").routeId("failing")
+                    .throwException(RuntimeException.class, "Failing")
+                    .to("mock:result");
+            }
+        };
+    }
+}
diff --git a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyMulticastSubRouteTest.java b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyMulticastSubRouteTest.java
index 3ca4b08..acdba8e 100644
--- a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyMulticastSubRouteTest.java
+++ b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyMulticastSubRouteTest.java
@@ -18,11 +18,14 @@ package org.apache.camel.component.micrometer.routepolicy;
 
 import java.util.List;
 
+import io.micrometer.core.instrument.Counter;
 import io.micrometer.core.instrument.Meter;
 import io.micrometer.core.instrument.Timer;
 import org.apache.camel.builder.RouteBuilder;
 import org.junit.Test;
 
+import static org.apache.camel.component.micrometer.MicrometerConstants.*;
+
 /**
  * CAMEL-9226 - check metrics are counted correctly in multicast sub-routes
  */
@@ -42,14 +45,32 @@ public class MicrometerRoutePolicyMulticastSubRouteTest extends AbstractMicromet
 
         assertMockEndpointsSatisfied();
 
-        // there should be 3 names
+        // there should be 9 names
         List<Meter> meters = meterRegistry.getMeters();
-        assertEquals(3, meters.size());
-
+        assertEquals(9, meters.size());
 
         meters.forEach(meter -> {
-            Timer timer = (Timer) meter;
-            assertEquals("Timer " + timer.getId() + " should have count of " + count,  count, timer.count());
+            String meterName = meter.getId().getName();
+            switch (meterName) {
+                case DEFAULT_CAMEL_ROUTE_POLICY_METER_NAME:
+                    Timer timer = (Timer) meter;
+                    assertEquals("Timer " + timer.getId() + " should have count of " + count, count, timer.count());
+                    break;
+                case DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_SUCCEEDED_METER_NAME: {
+                    Counter counter = (Counter) meter;
+                    assertEquals("Counter " + counter.getId() + " should have count of " + count, count, counter.count(), 0.01D);
+                    break;
+                }
+                case DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_FAILED_METER_NAME: {
+                    Counter counter = (Counter) meter;
+                    assertEquals("Counter " + counter.getId() + " should have count of " + 0, 0, counter.count(), 0.01D);
+                    break;
+                }
+                default: {
+                    fail("Unexpected meter " + meterName);
+                    break;
+                }
+            }
         });
     }
 
diff --git a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicySubRouteTest.java b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicySubRouteTest.java
index 9478831..b424d12 100644
--- a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicySubRouteTest.java
+++ b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicySubRouteTest.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.micrometer.routepolicy;
 
 import java.util.List;
 
+import io.micrometer.core.instrument.Counter;
 import io.micrometer.core.instrument.Meter;
 import io.micrometer.core.instrument.Timer;
 import org.apache.camel.builder.RouteBuilder;
@@ -37,10 +38,10 @@ public class MicrometerRoutePolicySubRouteTest extends AbstractMicrometerRoutePo
 
         assertMockEndpointsSatisfied();
 
-        // there should be 2 names
+        // there should be 6 names
         List<Meter> meters = meterRegistry.getMeters();
-        assertEquals(2, meters.size());
-        meters.forEach(meter -> assertTrue(meter instanceof Timer));
+        assertEquals(6, meters.size());
+        meters.forEach(meter -> assertTrue(meter instanceof Timer || meter instanceof Counter));
     }
 
     @Override