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

jamesnetherton 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 a5ad2fe  CAMEL-15908: Add additional exchange metrics to 
MicrometerRoutePolicy
a5ad2fe is described below

commit a5ad2fea485122e15d975e8bb6f377078312af0b
Author: James Netherton <[email protected]>
AuthorDate: Tue Dec 1 07:30:04 2020 +0000

    CAMEL-15908: Add additional exchange metrics to MicrometerRoutePolicy
---
 .../component/micrometer/MicrometerConstants.java  |  5 ++
 .../routepolicy/MicrometerRoutePolicy.java         | 17 ++++++
 .../MicrometerRoutePolicyNamingStrategy.java       | 15 ++++++
 .../ManagedMicrometerRoutePolicyTest.java          |  4 +-
 ...MicrometerRoutePolicyMulticastSubRouteTest.java | 61 ++++++++++++++++++++--
 .../MicrometerRoutePolicySubRouteTest.java         |  4 +-
 6 files changed, 97 insertions(+), 9 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 d30ae6d..2494b14 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
@@ -33,6 +33,11 @@ public final class MicrometerConstants {
     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_EXCHANGES_TOTAL_METER_NAME = "CamelExchangesTotal";
+    public static final String 
DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_FAILURES_HANDLED_METER_NAME
+            = "CamelExchangesFailuresHandled";
+    public static final String 
DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_EXTERNAL_REDELIVERIES_METER_NAME
+            = "CamelExchangesExternalRedeliveries";
     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";
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 33e3a09..811770a 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
@@ -27,6 +27,7 @@ import org.apache.camel.NonManagedService;
 import org.apache.camel.Route;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.component.micrometer.MicrometerUtils;
+import org.apache.camel.support.ExchangeHelper;
 import org.apache.camel.support.RoutePolicySupport;
 import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.util.ObjectHelper;
@@ -54,6 +55,9 @@ public class MicrometerRoutePolicy extends RoutePolicySupport 
implements NonMana
         private final MicrometerRoutePolicyNamingStrategy namingStrategy;
         private final Counter exchangesSucceeded;
         private final Counter exchangesFailed;
+        private final Counter exchangesTotal;
+        private final Counter externalRedeliveries;
+        private final Counter failuresHandled;
 
         private MetricsStatistics(MeterRegistry meterRegistry, Route route,
                                   MicrometerRoutePolicyNamingStrategy 
namingStrategy) {
@@ -62,6 +66,9 @@ public class MicrometerRoutePolicy extends RoutePolicySupport 
implements NonMana
             this.route = route;
             this.exchangesSucceeded = 
createCounter(namingStrategy.getExchangesSucceededName(route));
             this.exchangesFailed = 
createCounter(namingStrategy.getExchangesFailedName(route));
+            this.exchangesTotal = 
createCounter(namingStrategy.getExchangesTotalName(route));
+            this.externalRedeliveries = 
createCounter(namingStrategy.getExternalRedeliveriesName(route));
+            this.failuresHandled = 
createCounter(namingStrategy.getFailuresHandledName(route));
         }
 
         public void onExchangeBegin(Exchange exchange) {
@@ -79,10 +86,20 @@ public class MicrometerRoutePolicy extends 
RoutePolicySupport implements NonMana
                 sample.stop(timer);
             }
 
+            exchangesTotal.increment();
+
             if (exchange.isFailed()) {
                 exchangesFailed.increment();
             } else {
                 exchangesSucceeded.increment();
+
+                if (ExchangeHelper.isFailureHandled(exchange)) {
+                    failuresHandled.increment();
+                }
+
+                if (exchange.isExternalRedelivered()) {
+                    externalRedeliveries.increment();
+                }
             }
         }
 
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 953b93f..9310d6a 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,8 +24,11 @@ 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_EXTERNAL_REDELIVERIES_METER_NAME;
 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_FAILURES_HANDLED_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_EXCHANGES_TOTAL_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;
@@ -51,6 +54,18 @@ public interface MicrometerRoutePolicyNamingStrategy {
         return DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_FAILED_METER_NAME;
     }
 
+    default String getExchangesTotalName(Route route) {
+        return DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_TOTAL_METER_NAME;
+    }
+
+    default String getFailuresHandledName(Route route) {
+        return 
DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_FAILURES_HANDLED_METER_NAME;
+    }
+
+    default String getExternalRedeliveriesName(Route route) {
+        return 
DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_EXTERNAL_REDELIVERIES_METER_NAME;
+    }
+
     default Tags getTags(Route route, Exchange exchange) {
         return Tags.of(
                 CAMEL_CONTEXT_TAG, route.getCamelContext().getName(),
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 da5bfa9..905798d 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
@@ -52,9 +52,9 @@ public class ManagedMicrometerRoutePolicyTest extends 
AbstractMicrometerRoutePol
 
         assertMockEndpointsSatisfied();
 
-        // there should be 7 names
+        // there should be 13 names
         List<Meter> meters = meterRegistry.getMeters();
-        assertEquals(7, meters.size());
+        assertEquals(13, meters.size());
 
         String name = 
String.format("org.apache.camel:context=%s,type=services,name=MicrometerRoutePolicyService",
                 context.getManagementName());
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 d992a00..429edde 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
@@ -24,8 +24,11 @@ import io.micrometer.core.instrument.Timer;
 import org.apache.camel.builder.RouteBuilder;
 import org.junit.jupiter.api.Test;
 
+import static 
org.apache.camel.component.micrometer.MicrometerConstants.DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_EXTERNAL_REDELIVERIES_METER_NAME;
 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_FAILURES_HANDLED_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_EXCHANGES_TOTAL_METER_NAME;
 import static 
org.apache.camel.component.micrometer.MicrometerConstants.DEFAULT_CAMEL_ROUTE_POLICY_METER_NAME;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.fail;
@@ -45,13 +48,14 @@ public class MicrometerRoutePolicyMulticastSubRouteTest 
extends AbstractMicromet
 
         for (int i = 0; i < count; i++) {
             template.sendBody("direct:multicast", "Hello World");
+            template.send("direct:failure", e -> e.getMessage().setBody("Hello 
World"));
         }
 
         assertMockEndpointsSatisfied();
 
-        // there should be 9 names
+        // there should be 6 metrics per route
         List<Meter> meters = meterRegistry.getMeters();
-        assertEquals(9, meters.size());
+        assertEquals(6 * context.getRouteDefinitions().size(), meters.size());
 
         meters.forEach(meter -> {
             String meterName = meter.getId().getName();
@@ -62,13 +66,53 @@ public class MicrometerRoutePolicyMulticastSubRouteTest 
extends AbstractMicromet
                     break;
                 case 
DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_SUCCEEDED_METER_NAME: {
                     Counter counter = (Counter) meter;
-                    assertEquals(count, counter.count(), 0.01D,
+                    int expectedCount;
+                    String routeId = counter.getId().getTag("routeId");
+                    if (routeId.equals("failure")) {
+                        expectedCount = 0;
+                    } else {
+                        expectedCount = count;
+                    }
+                    assertEquals(expectedCount, counter.count(), 0.01D,
                             "Counter " + counter.getId() + " should have count 
of " + count);
                     break;
                 }
                 case DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_FAILED_METER_NAME: {
                     Counter counter = (Counter) meter;
-                    assertEquals(0, counter.count(), 0.01D, "Counter " + 
counter.getId() + " should have count of " + 0);
+                    int expectedCount;
+                    String routeId = counter.getId().getTag("routeId");
+                    if (routeId.equals("failure")) {
+                        expectedCount = count;
+                    } else {
+                        expectedCount = 0;
+                    }
+                    assertEquals(expectedCount, counter.count(), 0.01D,
+                            "Counter " + counter.getId() + " should have count 
of " + 0);
+                    break;
+                }
+                case DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_TOTAL_METER_NAME: {
+                    Counter counter = (Counter) meter;
+                    assertEquals(count, counter.count(), 0.01D,
+                            "Counter " + counter.getId() + " should have count 
of " + count);
+                    break;
+                }
+                case 
DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_EXTERNAL_REDELIVERIES_METER_NAME: {
+                    Counter counter = (Counter) meter;
+                    assertEquals(0, counter.count(), 0.01D,
+                            "Counter " + counter.getId() + " should have count 
of " + count);
+                    break;
+                }
+                case 
DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_FAILURES_HANDLED_METER_NAME: {
+                    Counter counter = (Counter) meter;
+                    int expectedCount;
+                    String routeId = counter.getId().getTag("routeId");
+                    if (routeId.equals("failureHandled") || 
routeId.equals("multicast")) {
+                        expectedCount = count;
+                    } else {
+                        expectedCount = 0;
+                    }
+                    assertEquals(expectedCount, counter.count(), 0.01D,
+                            "Counter " + counter.getId() + " should have count 
of " + count);
                     break;
                 }
                 default: {
@@ -84,12 +128,19 @@ public class MicrometerRoutePolicyMulticastSubRouteTest 
extends AbstractMicromet
         return new RouteBuilder() {
             @Override
             public void configure() {
+                onException(IllegalStateException.class)
+                        .handled(true);
+
                 from("direct:foo").routeId("foo").to("mock:foo");
 
                 from("direct:bar").routeId("bar").multicast().to("mock:bar1", 
"mock:bar2");
 
-                
from("direct:multicast").routeId("multicast").multicast().to("direct:foo", 
"direct:bar");
+                
from("direct:multicast").routeId("multicast").multicast().to("direct:foo", 
"direct:bar",
+                        "direct:failureHandled");
+
+                from("direct:failure").routeId("failure").throwException(new 
Exception("forced"));
 
+                
from("direct:failureHandled").routeId("failureHandled").throwException(new 
IllegalStateException("forced"));
             }
         };
     }
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 4f1f9be..effa16a 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
@@ -41,9 +41,9 @@ public class MicrometerRoutePolicySubRouteTest extends 
AbstractMicrometerRoutePo
 
         assertMockEndpointsSatisfied();
 
-        // there should be 6 names
+        // there should be 6 metrics per route
         List<Meter> meters = meterRegistry.getMeters();
-        assertEquals(6, meters.size());
+        assertEquals(6 * context.getRouteDefinitions().size(), meters.size());
         meters.forEach(meter -> assertTrue(meter instanceof Timer || meter 
instanceof Counter));
     }
 

Reply via email to