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

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


The following commit(s) were added to refs/heads/camel-3.x by this push:
     new ebc59c3e7b3 CAMEL-19101: Features for Camel-Micrometer (#9454)
ebc59c3e7b3 is described below

commit ebc59c3e7b3a8197c2a7d01580e595a720c0494e
Author: Shmakov Alexey <year2...@gmail.com>
AuthorDate: Fri Mar 3 18:33:50 2023 +0500

    CAMEL-19101: Features for Camel-Micrometer (#9454)
    
    * repair micrometer test
    
    * CAMEL-19101 Features for Camel-Micrometer
    
    * CAMEL-19101 code formatted passed
---
 .../src/main/docs/micrometer-component.adoc        |  18 +++
 .../DistributionStatisticConfigFilter.java         |   7 +-
 .../component/micrometer/MicrometerConstants.java  |   1 +
 .../routepolicy/MicrometerRoutePolicy.java         | 134 +++++++++++++++------
 .../MicrometerRoutePolicyConfiguration.java        | 107 ++++++++++++++++
 .../routepolicy/MicrometerRoutePolicyFactory.java  |  10 ++
 .../MicrometerRoutePolicyNamingStrategy.java       |  14 +--
 .../messagehistory/ManagedMessageHistoryTest.java  |  15 ++-
 .../AbstractMicrometerRoutePolicyTest.java         |   7 +-
 .../MicrometerRoutePolicyConfigrationTest.java     |  80 ++++++++++++
 .../SharedMicrometerRoutePolicyTest.java           |  70 +++++++++++
 11 files changed, 413 insertions(+), 50 deletions(-)

diff --git 
a/components/camel-micrometer/src/main/docs/micrometer-component.adoc 
b/components/camel-micrometer/src/main/docs/micrometer-component.adoc
index 04fd78d6521..12e5fcbfbca 100644
--- a/components/camel-micrometer/src/main/docs/micrometer-component.adoc
+++ b/components/camel-micrometer/src/main/docs/micrometer-component.adoc
@@ -403,6 +403,24 @@ following options:
 |prettyPrint |false |Whether to use pretty print when outputting statistics in 
json format
 |meterRegistry |  |Allow to use a shared `MeterRegistry`. If none is provided 
then Camel will create a shared instance used by the this CamelContext.
 |durationUnit |TimeUnit.MILLISECONDS |The unit to use for duration in when 
dumping the statistics as json.
+|configuration | see below |MicrometerRoutePolicyConfiguration.class
+|=======================================================================
+
+The `MicrometerRoutePolicyConfiguration` supports the
+following options:
+
+[width="100%",options="header"]
+|=======================================================================
+|Name |Default |Description
+|additionalCounters | true | activates all additional counters
+|exchangesSucceeded | true | activates counter for succeeded exchanges
+|exchangesFailed | true | activates counter for failed exchanges
+|exchangesTotal | true | activates counter for total count of exchanges
+|externalRedeliveries | true | activates counter for redeliveries of exchanges
+|failuresHandled | true | activates counter for handled failures
+|longTask | false | activates long task timer (current processing time for 
micrometer)
+|timerInitiator |  null | Consumer<Timer.Builder> for custom initialize Timer
+|longTaskInitiator |  null | Consumer<LongTaskTimer.Builder> for custom 
initialize LongTaskTimer
 |=======================================================================
 
 If JMX is enabled in the CamelContext, the MBean is registered in the 
`type=services` tree
diff --git 
a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/DistributionStatisticConfigFilter.java
 
b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/DistributionStatisticConfigFilter.java
index 33040940924..721a4339b0b 100644
--- 
a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/DistributionStatisticConfigFilter.java
+++ 
b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/DistributionStatisticConfigFilter.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.micrometer;
 
 import java.time.Duration;
 import java.util.function.Predicate;
+import java.util.stream.LongStream;
 
 import io.micrometer.core.instrument.Meter;
 import io.micrometer.core.instrument.config.MeterFilter;
@@ -55,9 +56,9 @@ public class DistributionStatisticConfigFilter implements 
MeterFilter {
                     .percentilesHistogram(publishPercentileHistogram)
                     .percentiles(percentiles)
                     .percentilePrecision(percentilePrecision)
-                    .maximumExpectedValue(maximumExpectedValue)
-                    .minimumExpectedValue(minimumExpectedValue)
-                    .sla(slas)
+                    .maximumExpectedValue((double) maximumExpectedValue)
+                    .minimumExpectedValue((double) minimumExpectedValue)
+                    
.serviceLevelObjectives(LongStream.of(slas).asDoubleStream().toArray())
                     .bufferLength(bufferLength)
                     .expiry(expiry)
                     .build()
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 929fcd4627f..26aa6d189dd 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
@@ -49,6 +49,7 @@ public final class MicrometerConstants {
     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_ROUTE_POLICY_LONGMETER_NAME = 
"CamelRoutePolicyLongTask";
     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";
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 e199b6b2e87..a53dc85753f 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
@@ -16,9 +16,13 @@
  */
 package org.apache.camel.component.micrometer.routepolicy;
 
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 
 import io.micrometer.core.instrument.Counter;
+import io.micrometer.core.instrument.LongTaskTimer;
 import io.micrometer.core.instrument.MeterRegistry;
 import io.micrometer.core.instrument.Tags;
 import io.micrometer.core.instrument.Timer;
@@ -46,61 +50,116 @@ public class MicrometerRoutePolicy extends 
RoutePolicySupport implements NonMana
     private MeterRegistry meterRegistry;
     private boolean prettyPrint;
     private TimeUnit durationUnit = TimeUnit.MILLISECONDS;
-    private MetricsStatistics statistics;
     private MicrometerRoutePolicyNamingStrategy namingStrategy = 
MicrometerRoutePolicyNamingStrategy.DEFAULT;
+    private MicrometerRoutePolicyConfiguration configuration = 
MicrometerRoutePolicyConfiguration.DEFAULT;
+
+    private final Map<Route, MetricsStatistics> statisticsMap = new 
HashMap<>();
 
     private static final class MetricsStatistics {
         private final MeterRegistry meterRegistry;
         private final Route route;
         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 final MicrometerRoutePolicyConfiguration configuration;
+        private Counter exchangesSucceeded;
+        private Counter exchangesFailed;
+        private Counter exchangesTotal;
+        private Counter externalRedeliveries;
+        private Counter failuresHandled;
+        private Timer timer;
+        private LongTaskTimer longTaskTimer;
 
         private MetricsStatistics(MeterRegistry meterRegistry, Route route,
-                                  MicrometerRoutePolicyNamingStrategy 
namingStrategy) {
+                                  MicrometerRoutePolicyNamingStrategy 
namingStrategy,
+                                  MicrometerRoutePolicyConfiguration 
configuration) {
+            this.configuration = ObjectHelper.notNull(configuration, 
"MicrometerRoutePolicyConfiguration", this);
             this.meterRegistry = ObjectHelper.notNull(meterRegistry, 
"MeterRegistry", this);
             this.namingStrategy = ObjectHelper.notNull(namingStrategy, 
"MicrometerRoutePolicyNamingStrategy", this);
             this.route = route;
-            this.exchangesSucceeded = 
createCounter(namingStrategy.getExchangesSucceededName(route),
-                    "Number of successfully completed exchanges");
-            this.exchangesFailed = 
createCounter(namingStrategy.getExchangesFailedName(route), "Number of failed 
exchanges");
-            this.exchangesTotal
-                    = 
createCounter(namingStrategy.getExchangesTotalName(route), "Total number of 
processed exchanges");
-            this.externalRedeliveries = 
createCounter(namingStrategy.getExternalRedeliveriesName(route),
-                    "Number of external initiated redeliveries (such as from 
JMS broker)");
-            this.failuresHandled = 
createCounter(namingStrategy.getFailuresHandledName(route), "Number of failures 
handled");
+            if (configuration.isAdditionalCounters()) {
+                initAdditionalCounters();
+            }
+        }
+
+        private void initAdditionalCounters() {
+            if (configuration.isExchangesSucceeded()) {
+                this.exchangesSucceeded = 
createCounter(namingStrategy.getExchangesSucceededName(route),
+                        "Number of successfully completed exchanges");
+            }
+            if (configuration.isExchangesFailed()) {
+                this.exchangesFailed
+                        = 
createCounter(namingStrategy.getExchangesFailedName(route), "Number of failed 
exchanges");
+            }
+            if (configuration.isExchangesTotal()) {
+                this.exchangesTotal
+                        = 
createCounter(namingStrategy.getExchangesTotalName(route), "Total number of 
processed exchanges");
+            }
+            if (configuration.isExternalRedeliveries()) {
+                this.externalRedeliveries = 
createCounter(namingStrategy.getExternalRedeliveriesName(route),
+                        "Number of external initiated redeliveries (such as 
from JMS broker)");
+            }
+            if (configuration.isFailuresHandled()) {
+                this.failuresHandled
+                        = 
createCounter(namingStrategy.getFailuresHandledName(route), "Number of failures 
handled");
+            }
+            if (configuration.isLongTask()) {
+                LongTaskTimer.Builder builder = 
LongTaskTimer.builder(namingStrategy.getLongTaskName(route))
+                        .tags(namingStrategy.getTags(route))
+                        .description("Route long task metric");
+                if (configuration.getLongTaskInitiator() != null) {
+                    configuration.getLongTaskInitiator().accept(builder);
+                }
+                longTaskTimer = builder.register(meterRegistry);
+            }
         }
 
         public void onExchangeBegin(Exchange exchange) {
             Timer.Sample sample = Timer.start(meterRegistry);
             exchange.setProperty(propertyName(exchange), sample);
+            if (longTaskTimer != null) {
+                exchange.setProperty(propertyName(exchange) + "_long_task", 
longTaskTimer.start());
+            }
         }
 
         public void onExchangeDone(Exchange exchange) {
             Timer.Sample sample = (Timer.Sample) 
exchange.removeProperty(propertyName(exchange));
             if (sample != null) {
-                Timer timer = Timer.builder(namingStrategy.getName(route))
-                        .tags(namingStrategy.getTags(route))
-                        .description("Route performance metrics")
-                        .register(meterRegistry);
+                if (timer == null) {
+                    Timer.Builder builder = 
Timer.builder(namingStrategy.getName(route))
+                            .tags(namingStrategy.getTags(route))
+                            .description("Route performance metrics");
+                    if (configuration.getTimerInitiator() != null) {
+                        configuration.getTimerInitiator().accept(builder);
+                    }
+                    timer = builder.register(meterRegistry);
+                }
                 sample.stop(timer);
             }
+            LongTaskTimer.Sample ltSampler
+                    = (LongTaskTimer.Sample) 
exchange.removeProperty(propertyName(exchange) + "_long_task");
+            if (ltSampler != null) {
+                ltSampler.stop();
+            }
+            if (configuration.isAdditionalCounters()) {
+                updateAdditionalCounters(exchange);
+            }
+        }
 
-            exchangesTotal.increment();
-
+        private void updateAdditionalCounters(Exchange exchange) {
+            if (exchangesTotal != null) {
+                exchangesTotal.increment();
+            }
             if (exchange.isFailed()) {
-                exchangesFailed.increment();
+                if (exchangesFailed != null) {
+                    exchangesFailed.increment();
+                }
             } else {
-                exchangesSucceeded.increment();
-
-                if (ExchangeHelper.isFailureHandled(exchange)) {
+                if (exchangesSucceeded != null) {
+                    exchangesSucceeded.increment();
+                }
+                if (failuresHandled != null && 
ExchangeHelper.isFailureHandled(exchange)) {
                     failuresHandled.increment();
                 }
-
-                if (exchange.isExternalRedelivered()) {
+                if (externalRedeliveries != null && 
exchange.isExternalRedelivered()) {
                     externalRedeliveries.increment();
                 }
             }
@@ -150,6 +209,14 @@ public class MicrometerRoutePolicy extends 
RoutePolicySupport implements NonMana
         this.namingStrategy = namingStrategy;
     }
 
+    public MicrometerRoutePolicyConfiguration getConfiguration() {
+        return configuration;
+    }
+
+    public void setConfiguration(MicrometerRoutePolicyConfiguration 
configuration) {
+        this.configuration = configuration;
+    }
+
     @Override
     public void onInit(Route route) {
         super.onInit(route);
@@ -176,21 +243,20 @@ public class MicrometerRoutePolicy extends 
RoutePolicySupport implements NonMana
         // create statistics holder
         // for now we record only all the timings of a complete exchange 
(responses)
         // we have in-flight / total statistics already from camel-core
-        statistics = new MetricsStatistics(getMeterRegistry(), route, 
getNamingStrategy());
+        statisticsMap.computeIfAbsent(route,
+                it -> new MetricsStatistics(getMeterRegistry(), it, 
getNamingStrategy(), configuration));
     }
 
     @Override
     public void onExchangeBegin(Route route, Exchange exchange) {
-        if (statistics != null) {
-            statistics.onExchangeBegin(exchange);
-        }
+        Optional.ofNullable(statisticsMap.get(route))
+                .ifPresent(statistics -> statistics.onExchangeBegin(exchange));
     }
 
     @Override
     public void onExchangeDone(Route route, Exchange exchange) {
-        if (statistics != null) {
-            statistics.onExchangeDone(exchange);
-        }
+        Optional.ofNullable(statisticsMap.get(route))
+                .ifPresent(statistics -> statistics.onExchangeDone(exchange));
     }
 
 }
diff --git 
a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyConfiguration.java
 
b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyConfiguration.java
new file mode 100644
index 00000000000..1c1f57966e5
--- /dev/null
+++ 
b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyConfiguration.java
@@ -0,0 +1,107 @@
+/*
+ * 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 java.util.function.Consumer;
+
+import io.micrometer.core.instrument.LongTaskTimer;
+import io.micrometer.core.instrument.Timer;
+
+public class MicrometerRoutePolicyConfiguration {
+    public static final MicrometerRoutePolicyConfiguration DEFAULT = new 
MicrometerRoutePolicyConfiguration();
+    private boolean additionalCounters = true;
+    private boolean exchangesSucceeded = true;
+    private boolean exchangesFailed = true;
+    private boolean exchangesTotal = true;
+    private boolean externalRedeliveries = true;
+    private boolean failuresHandled = true;
+    private boolean longTask;
+    private Consumer<Timer.Builder> timerInitiator;
+    private Consumer<LongTaskTimer.Builder> longTaskInitiator;
+
+    public boolean isAdditionalCounters() {
+        return additionalCounters;
+    }
+
+    public void setAdditionalCounters(boolean additionalCounters) {
+        this.additionalCounters = additionalCounters;
+    }
+
+    public boolean isExchangesSucceeded() {
+        return exchangesSucceeded;
+    }
+
+    public void setExchangesSucceeded(boolean exchangesSucceeded) {
+        this.exchangesSucceeded = exchangesSucceeded;
+    }
+
+    public boolean isExchangesFailed() {
+        return exchangesFailed;
+    }
+
+    public void setExchangesFailed(boolean exchangesFailed) {
+        this.exchangesFailed = exchangesFailed;
+    }
+
+    public boolean isExchangesTotal() {
+        return exchangesTotal;
+    }
+
+    public void setExchangesTotal(boolean exchangesTotal) {
+        this.exchangesTotal = exchangesTotal;
+    }
+
+    public boolean isExternalRedeliveries() {
+        return externalRedeliveries;
+    }
+
+    public void setExternalRedeliveries(boolean externalRedeliveries) {
+        this.externalRedeliveries = externalRedeliveries;
+    }
+
+    public boolean isFailuresHandled() {
+        return failuresHandled;
+    }
+
+    public void setFailuresHandled(boolean failuresHandled) {
+        this.failuresHandled = failuresHandled;
+    }
+
+    public boolean isLongTask() {
+        return longTask;
+    }
+
+    public void setLongTask(boolean longTask) {
+        this.longTask = longTask;
+    }
+
+    public Consumer<Timer.Builder> getTimerInitiator() {
+        return timerInitiator;
+    }
+
+    public void setTimerInitiator(Consumer<Timer.Builder> timerInitiator) {
+        this.timerInitiator = timerInitiator;
+    }
+
+    public Consumer<LongTaskTimer.Builder> getLongTaskInitiator() {
+        return longTaskInitiator;
+    }
+
+    public void setLongTaskInitiator(Consumer<LongTaskTimer.Builder> 
longTaskInitiator) {
+        this.longTaskInitiator = longTaskInitiator;
+    }
+}
diff --git 
a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyFactory.java
 
b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyFactory.java
index c636ca0477f..dde82239a9f 100644
--- 
a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyFactory.java
+++ 
b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyFactory.java
@@ -34,6 +34,7 @@ public class MicrometerRoutePolicyFactory implements 
RoutePolicyFactory {
     private boolean prettyPrint = true;
     private TimeUnit durationUnit = TimeUnit.MILLISECONDS;
     private MicrometerRoutePolicyNamingStrategy namingStrategy = 
MicrometerRoutePolicyNamingStrategy.DEFAULT;
+    private MicrometerRoutePolicyConfiguration policyConfiguration = 
MicrometerRoutePolicyConfiguration.DEFAULT;
 
     /**
      * To use a specific {@link io.micrometer.core.instrument.MeterRegistry} 
instance.
@@ -81,6 +82,14 @@ public class MicrometerRoutePolicyFactory implements 
RoutePolicyFactory {
         this.namingStrategy = namingStrategy;
     }
 
+    public MicrometerRoutePolicyConfiguration getPolicyConfiguration() {
+        return policyConfiguration;
+    }
+
+    public void setPolicyConfiguration(MicrometerRoutePolicyConfiguration 
policyConfiguration) {
+        this.policyConfiguration = policyConfiguration;
+    }
+
     @Override
     public RoutePolicy createRoutePolicy(CamelContext camelContext, String 
routeId, NamedNode routeDefinition) {
         MicrometerRoutePolicy answer = new MicrometerRoutePolicy();
@@ -88,6 +97,7 @@ public class MicrometerRoutePolicyFactory implements 
RoutePolicyFactory {
         answer.setPrettyPrint(isPrettyPrint());
         answer.setDurationUnit(getDurationUnit());
         answer.setNamingStrategy(getNamingStrategy());
+        answer.setConfiguration(getPolicyConfiguration());
         return answer;
     }
 
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 846f1937b5e..1b51c687965 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
@@ -22,15 +22,7 @@ import io.micrometer.core.instrument.Meter;
 import io.micrometer.core.instrument.Tags;
 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.ROUTE_ID_TAG;
-import static 
org.apache.camel.component.micrometer.MicrometerConstants.SERVICE_NAME;
+import static org.apache.camel.component.micrometer.MicrometerConstants.*;
 
 /**
  * Provides a strategy to derive a meter name and tags
@@ -64,6 +56,10 @@ public interface MicrometerRoutePolicyNamingStrategy {
         return 
DEFAULT_CAMEL_ROUTE_POLICY_EXCHANGES_EXTERNAL_REDELIVERIES_METER_NAME;
     }
 
+    default String getLongTaskName(Route route) {
+        return DEFAULT_CAMEL_ROUTE_POLICY_LONGMETER_NAME;
+    }
+
     default Tags getTags(Route route) {
         return Tags.of(
                 CAMEL_CONTEXT_TAG, route.getCamelContext().getName(),
diff --git 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/messagehistory/ManagedMessageHistoryTest.java
 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/messagehistory/ManagedMessageHistoryTest.java
index ce1e0bd1993..7125f9d5ab8 100644
--- 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/messagehistory/ManagedMessageHistoryTest.java
+++ 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/messagehistory/ManagedMessageHistoryTest.java
@@ -75,8 +75,20 @@ public class ManagedMessageHistoryTest extends 
CamelTestSupport {
         return context;
     }
 
+    private void cleanMbeanServer() throws Exception {
+        //Deleting data from other tests
+        for (ObjectName it : timerNames()) {
+            getMBeanServer().unregisterMBean(it);
+        }
+    }
+
+    private Set<ObjectName> timerNames() throws Exception {
+        return getMBeanServer().queryNames(new 
ObjectName("org.apache.camel.micrometer:type=timers,name=*"), null);
+    }
+
     @Test
     public void testMessageHistory() throws Exception {
+        cleanMbeanServer();
         int count = 10;
 
         getMockEndpoint("mock:foo").expectedMessageCount(count / 2);
@@ -97,8 +109,7 @@ public class ManagedMessageHistoryTest extends 
CamelTestSupport {
         assertEquals(3, meterRegistry.getMeters().size());
 
         // there should be 3 mbeans
-        Set<ObjectName> set
-                = getMBeanServer().queryNames(new 
ObjectName("org.apache.camel.micrometer:type=timers,name=*"), null);
+        Set<ObjectName> set = timerNames();
         assertEquals(3, set.size());
 
         ObjectName fooMBean = set.stream().filter(on -> 
on.getCanonicalName().contains("foo")).findFirst()
diff --git 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/AbstractMicrometerRoutePolicyTest.java
 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/AbstractMicrometerRoutePolicyTest.java
index a198d650683..b2aa93976b3 100644
--- 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/AbstractMicrometerRoutePolicyTest.java
+++ 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/AbstractMicrometerRoutePolicyTest.java
@@ -47,13 +47,16 @@ public abstract class AbstractMicrometerRoutePolicyTest 
extends CamelTestSupport
         return meterRegistry;
     }
 
+    protected MicrometerRoutePolicyFactory 
createMicrometerRoutePolicyFactory() {
+        return new MicrometerRoutePolicyFactory();
+    }
+
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        MicrometerRoutePolicyFactory factory = new 
MicrometerRoutePolicyFactory();
+        MicrometerRoutePolicyFactory factory = 
createMicrometerRoutePolicyFactory();
         factory.setMeterRegistry(meterRegistry);
         context.addRoutePolicyFactory(factory);
-
         return context;
     }
 
diff --git 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyConfigrationTest.java
 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyConfigrationTest.java
new file mode 100644
index 00000000000..db6d8d05aeb
--- /dev/null
+++ 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyConfigrationTest.java
@@ -0,0 +1,80 @@
+/*
+ * 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 java.util.List;
+
+import io.micrometer.core.instrument.LongTaskTimer;
+import io.micrometer.core.instrument.Meter;
+import io.micrometer.core.instrument.Timer;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class MicrometerRoutePolicyConfigrationTest extends 
AbstractMicrometerRoutePolicyTest {
+
+    @Override
+    protected MicrometerRoutePolicyFactory 
createMicrometerRoutePolicyFactory() {
+        MicrometerRoutePolicyFactory factory = new 
MicrometerRoutePolicyFactory();
+        MicrometerRoutePolicyConfiguration policyConfiguration = new 
MicrometerRoutePolicyConfiguration();
+        policyConfiguration.setExchangesSucceeded(false);
+        policyConfiguration.setExchangesFailed(false);
+        policyConfiguration.setExchangesTotal(false);
+        policyConfiguration.setExternalRedeliveries(false);
+        policyConfiguration.setFailuresHandled(false);
+        policyConfiguration.setTimerInitiator(builder -> 
builder.tags("firstTag", "hello", "secondTag", "world")
+                .description("Test Description"));
+        policyConfiguration.setLongTask(true);
+        policyConfiguration.setLongTaskInitiator(builder -> 
builder.description("Test long task"));
+        factory.setPolicyConfiguration(policyConfiguration);
+        return factory;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:foo").routeId("foo").delay(1);
+            }
+        };
+    }
+
+    @Test
+    public void testConfigurationPolicy() throws Exception {
+        template.request("direct:foo", x -> {
+        });
+        List<Meter> meters = meterRegistry.getMeters();
+        assertEquals(2, meters.size(), "additional counters does not disable");
+        Timer timer = (Timer) meters.stream().filter(it -> it instanceof Timer)
+                .findFirst().orElse(null);
+
+        assertNotNull(timer, "timer is null");
+        Meter.Id id = timer.getId();
+        assertEquals("Test Description", id.getDescription(), "incorrect 
description");
+        assertEquals("hello", id.getTag("firstTag"), "firstTag not setted");
+        assertEquals("world", id.getTag("secondTag"), "secondTag not setted");
+
+        LongTaskTimer longTaskTimer = (LongTaskTimer) 
meters.stream().filter(it -> it instanceof LongTaskTimer)
+                .findFirst().orElse(null);
+        assertNotNull(longTaskTimer, "LongTaskTimer is null");
+        id = longTaskTimer.getId();
+        assertEquals("Test long task", id.getDescription(), "incorrect long 
task description");
+    }
+
+}
diff --git 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/SharedMicrometerRoutePolicyTest.java
 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/SharedMicrometerRoutePolicyTest.java
new file mode 100644
index 00000000000..966382beb48
--- /dev/null
+++ 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/SharedMicrometerRoutePolicyTest.java
@@ -0,0 +1,70 @@
+/*
+ * 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 java.util.List;
+
+import io.micrometer.core.instrument.Meter;
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Timer;
+import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.micrometer.MicrometerConstants;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class SharedMicrometerRoutePolicyTest extends CamelTestSupport {
+
+    protected MeterRegistry meterRegistry = new SimpleMeterRegistry();
+
+    protected MicrometerRoutePolicy singletonPolicy = new 
MicrometerRoutePolicy();
+
+    @Test
+    public void testSharedPolicy() throws Exception {
+        template.request("direct:foo", x -> {
+        });
+        template.request("direct:bar", x -> {
+        });
+        List<Meter> meters = meterRegistry.getMeters();
+        long timers = meters.stream()
+                .filter(it -> it instanceof Timer)
+                .count();
+        assertEquals(2L, timers, "timers count incorrect");
+    }
+
+    @BindToRegistry(MicrometerConstants.METRICS_REGISTRY_NAME)
+    public MeterRegistry addRegistry() {
+        return meterRegistry;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:foo").routeId("foo").routePolicy(singletonPolicy)
+                        .to("mock:result");
+
+                from("direct:bar").routeId("bar").routePolicy(singletonPolicy)
+                        .to("mock:result");
+            }
+        };
+    }
+}


Reply via email to