This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch skip in repository https://gitbox.apache.org/repos/asf/camel.git
commit 910d2ff33b8a6f87de680a2d90efd2d4064a77b7 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Fri Nov 29 11:10:47 2024 +0100 CAMEL-21489: camel-micrometer - Add option to exclude routes in capturing metrics --- .../src/main/docs/micrometer-component.adoc | 1 + .../routepolicy/MicrometerRoutePolicy.java | 9 +++ .../MicrometerRoutePolicyConfiguration.java | 9 +++ .../AbstractMicrometerRoutePolicyTest.java | 1 + ...=> MicrometerRoutePolicyConfigurationTest.java} | 2 +- .../ZMicrometerRoutePolicyExcludePatternTest.java | 77 ++++++++++++++++++++++ 6 files changed, 98 insertions(+), 1 deletion(-) diff --git a/components/camel-micrometer/src/main/docs/micrometer-component.adoc b/components/camel-micrometer/src/main/docs/micrometer-component.adoc index 7e92000a3f4..761e96b3e70 100644 --- a/components/camel-micrometer/src/main/docs/micrometer-component.adoc +++ b/components/camel-micrometer/src/main/docs/micrometer-component.adoc @@ -411,6 +411,7 @@ following options: |Name |Default |Description |contextEnabled | true | whether to include counter for context level metrics |routeEnabled | true | whether to include counter for route level metrics +|excludePattern | | Optional pattern to exclude routes matched by route ids. Multiple ids can be separated by comma. |additionalCounters | true | activates all additional counters |exchangesSucceeded | true | activates counter for succeeded exchanges |exchangesFailed | true | activates counter for failed exchanges 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 5ccac1cc877..6ac25046be0 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 @@ -34,9 +34,12 @@ import org.apache.camel.RuntimeCamelException; import org.apache.camel.component.micrometer.MicrometerUtils; import org.apache.camel.spi.ManagementStrategy; import org.apache.camel.support.ExchangeHelper; +import org.apache.camel.support.PatternHelper; import org.apache.camel.support.RoutePolicySupport; import org.apache.camel.support.service.ServiceHelper; import org.apache.camel.util.ObjectHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import static org.apache.camel.component.micrometer.MicrometerConstants.DEFAULT_CAMEL_ROUTE_POLICY_METER_NAME; import static org.apache.camel.component.micrometer.MicrometerConstants.KIND; @@ -50,6 +53,8 @@ import static org.apache.camel.component.micrometer.MicrometerConstants.METRICS_ */ public class MicrometerRoutePolicy extends RoutePolicySupport implements NonManagedService { + private static final Logger LOG = LoggerFactory.getLogger(MicrometerRoutePolicy.class); + private final MicrometerRoutePolicyFactory factory; private MeterRegistry meterRegistry; private boolean prettyPrint; @@ -321,6 +326,10 @@ public class MicrometerRoutePolicy extends RoutePolicySupport implements NonMana skip = (it.isCreatedByKamelet() && !registerKamelets) || (it.isCreatedByRouteTemplate() && !registerTemplates); } + if (!skip && configuration.getExcludePattern() != null) { + skip = PatternHelper.matchPattern(route.getRouteId(), configuration.getExcludePattern()); + } + LOG.debug("Capturing metrics for route: {} -> {}", route.getRouteId(), skip); if (skip) { return null; } 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 index 6b1f9eca8be..01bbc88367e 100644 --- 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 @@ -25,6 +25,7 @@ public class MicrometerRoutePolicyConfiguration { public static final MicrometerRoutePolicyConfiguration DEFAULT = new MicrometerRoutePolicyConfiguration(); private boolean contextEnabled = true; private boolean routeEnabled = true; + private String excludePattern; private boolean additionalCounters = true; private boolean exchangesSucceeded = true; private boolean exchangesFailed = true; @@ -51,6 +52,14 @@ public class MicrometerRoutePolicyConfiguration { this.routeEnabled = routeEnabled; } + public String getExcludePattern() { + return excludePattern; + } + + public void setExcludePattern(String excludePattern) { + this.excludePattern = excludePattern; + } + public boolean isAdditionalCounters() { return additionalCounters; } 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 287a19c19c8..bbe5e13ab25 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 @@ -33,6 +33,7 @@ public abstract class AbstractMicrometerRoutePolicyTest extends CamelTestSupport protected MicrometerRoutePolicyFactory createMicrometerRoutePolicyFactory() { MicrometerRoutePolicyFactory factory = new MicrometerRoutePolicyFactory(); factory.getPolicyConfiguration().setContextEnabled(false); + factory.getPolicyConfiguration().setExcludePattern(null); return factory; } 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/MicrometerRoutePolicyConfigurationTest.java similarity index 97% rename from components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyConfigrationTest.java rename to components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/MicrometerRoutePolicyConfigurationTest.java index a408b84862d..dc8b935fab7 100644 --- 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/MicrometerRoutePolicyConfigurationTest.java @@ -26,7 +26,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; -public class MicrometerRoutePolicyConfigrationTest extends AbstractMicrometerRoutePolicyTest { +public class MicrometerRoutePolicyConfigurationTest extends AbstractMicrometerRoutePolicyTest { @Override protected MicrometerRoutePolicyFactory createMicrometerRoutePolicyFactory() { diff --git a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/ZMicrometerRoutePolicyExcludePatternTest.java b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/ZMicrometerRoutePolicyExcludePatternTest.java new file mode 100644 index 00000000000..abb3a396dc5 --- /dev/null +++ b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/routepolicy/ZMicrometerRoutePolicyExcludePatternTest.java @@ -0,0 +1,77 @@ +/* + * 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.Counter; +import io.micrometer.core.instrument.Meter; +import io.micrometer.core.instrument.Timer; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Must run last + */ +public class ZMicrometerRoutePolicyExcludePatternTest extends AbstractMicrometerRoutePolicyTest { + + @Override + protected MicrometerRoutePolicyFactory createMicrometerRoutePolicyFactory() { + MicrometerRoutePolicyFactory factory = super.createMicrometerRoutePolicyFactory(); + factory.getPolicyConfiguration().setContextEnabled(false); + factory.getPolicyConfiguration().setRouteEnabled(true); + factory.getPolicyConfiguration().setExcludePattern("bar"); + return factory; + } + + @Test + public void testMetricsRoutePolicy() throws Exception { + int count = 10; + getMockEndpoint("mock:foo").expectedMessageCount(count); + getMockEndpoint("mock:bar").expectedMessageCount(count); + + for (int i = 0; i < count; i++) { + template.sendBody("direct:foo", "Hello World"); + } + + MockEndpoint.assertIsSatisfied(context); + + // there should be 6 metrics per route (only 1 route as bar is excluded) + List<Meter> meters = meterRegistry.getMeters(); + assertEquals(6, meters.size()); + meters.forEach(meter -> assertTrue(meter instanceof Timer || meter instanceof Counter)); + } + + @Override + protected RouteBuilder createRouteBuilder() { + return new RouteBuilder() { + @Override + public void configure() { + from("direct:foo").routeId("foo") + .to("direct:bar") + .to("mock:foo"); + + from("direct:bar").routeId("bar") + .to("mock:bar"); + } + }; + } +}