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 2022/11/26 18:39:19 UTC

[camel-spring-boot] 04/04: CAMEL-18754: camel-micrometer - Add auto configuration for capturing metrics.

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

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-spring-boot.git

commit ac318f0418e55c56d0fb426607c67a5ceb1f6742
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Nov 26 15:08:14 2022 +0100

    CAMEL-18754: camel-micrometer - Add auto configuration for capturing metrics.
---
 .../camel-micrometer-starter/pom.xml               | 10 +++++
 .../src/main/docs/micrometer.json                  | 12 +++---
 .../MicrometerTagsAutoConfiguration.java           | 48 ++++++++++++++++++++++
 .../CamelMetricsAutoConfiguration.java}            | 44 +++++++++-----------
 .../CamelMetricsConfiguration.java}                |  4 +-
 .../src/main/resources/META-INF/spring.factories   |  3 +-
 6 files changed, 88 insertions(+), 33 deletions(-)

diff --git a/components-starter/camel-micrometer-starter/pom.xml b/components-starter/camel-micrometer-starter/pom.xml
index 9821efd078b..42c632a242e 100644
--- a/components-starter/camel-micrometer-starter/pom.xml
+++ b/components-starter/camel-micrometer-starter/pom.xml
@@ -34,6 +34,16 @@
       <artifactId>spring-boot-starter</artifactId>
       <version>${spring-boot-version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+      <version>${spring-boot-version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-actuator</artifactId>
+      <version>${spring-boot-version}</version>
+    </dependency>
     <dependency>
       <groupId>org.apache.camel</groupId>
       <artifactId>camel-micrometer</artifactId>
diff --git a/components-starter/camel-micrometer-starter/src/main/docs/micrometer.json b/components-starter/camel-micrometer-starter/src/main/docs/micrometer.json
index 3872996642d..e6c174b84c0 100644
--- a/components-starter/camel-micrometer-starter/src/main/docs/micrometer.json
+++ b/components-starter/camel-micrometer-starter/src/main/docs/micrometer.json
@@ -13,8 +13,8 @@
     },
     {
       "name": "camel.metrics",
-      "type": "org.apache.camel.component.micrometer.springboot.CamelMicrometerConfiguration",
-      "sourceType": "org.apache.camel.component.micrometer.springboot.CamelMicrometerConfiguration"
+      "type": "org.apache.camel.component.micrometer.springboot.metrics.CamelMetricsConfiguration",
+      "sourceType": "org.apache.camel.component.micrometer.springboot.metrics.CamelMetricsConfiguration"
     }
   ],
   "properties": [
@@ -53,28 +53,28 @@
       "name": "camel.metrics.enable-exchange-event-notifier",
       "type": "java.lang.Boolean",
       "description": "Set whether to enable the MicrometerExchangeEventNotifier for capturing metrics on exchange processing times.",
-      "sourceType": "org.apache.camel.component.micrometer.springboot.CamelMicrometerConfiguration",
+      "sourceType": "org.apache.camel.component.micrometer.springboot.metrics.CamelMetricsConfiguration",
       "defaultValue": true
     },
     {
       "name": "camel.metrics.enable-message-history",
       "type": "java.lang.Boolean",
       "description": "Set whether to enable the MicrometerMessageHistoryFactory for capturing metrics on individual route node processing times. Depending on the number of configured route nodes, there is the potential to create a large volume of metrics. Therefore, this option is disabled by default.",
-      "sourceType": "org.apache.camel.component.micrometer.springboot.CamelMicrometerConfiguration",
+      "sourceType": "org.apache.camel.component.micrometer.springboot.metrics.CamelMetricsConfiguration",
       "defaultValue": false
     },
     {
       "name": "camel.metrics.enable-route-event-notifier",
       "type": "java.lang.Boolean",
       "description": "Set whether to enable the MicrometerRouteEventNotifier for capturing metrics on the total number of routes and total number of routes running.",
-      "sourceType": "org.apache.camel.component.micrometer.springboot.CamelMicrometerConfiguration",
+      "sourceType": "org.apache.camel.component.micrometer.springboot.metrics.CamelMetricsConfiguration",
       "defaultValue": true
     },
     {
       "name": "camel.metrics.enable-route-policy",
       "type": "java.lang.Boolean",
       "description": "Set whether to enable the MicrometerRoutePolicyFactory for capturing metrics on route processing times.",
-      "sourceType": "org.apache.camel.component.micrometer.springboot.CamelMicrometerConfiguration",
+      "sourceType": "org.apache.camel.component.micrometer.springboot.metrics.CamelMetricsConfiguration",
       "defaultValue": true
     }
   ],
diff --git a/components-starter/camel-micrometer-starter/src/main/java/org/apache/camel/component/micrometer/springboot/MicrometerTagsAutoConfiguration.java b/components-starter/camel-micrometer-starter/src/main/java/org/apache/camel/component/micrometer/springboot/MicrometerTagsAutoConfiguration.java
new file mode 100644
index 00000000000..5745cc72aee
--- /dev/null
+++ b/components-starter/camel-micrometer-starter/src/main/java/org/apache/camel/component/micrometer/springboot/MicrometerTagsAutoConfiguration.java
@@ -0,0 +1,48 @@
+package org.apache.camel.component.micrometer.springboot;
+
+import io.micrometer.core.instrument.Tag;
+import io.micrometer.core.instrument.Tags;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.spring.boot.util.ConditionalOnCamelContextAndAutoConfigurationBeans;
+import org.springframework.boot.actuate.metrics.web.servlet.DefaultWebMvcTagsProvider;
+import org.springframework.boot.actuate.metrics.web.servlet.WebMvcTagsProvider;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.context.annotation.Configuration;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Configuration(proxyBeanMethods = false)
+@Conditional(ConditionalOnCamelContextAndAutoConfigurationBeans.class)
+@AutoConfigureAfter({CamelAutoConfiguration.class})
+public class MicrometerTagsAutoConfiguration {
+
+    /**
+     * To integrate with micrometer to include uri in tags when for example using
+     * camel rest-dsl with servlet.
+     */
+    @Bean
+    WebMvcTagsProvider webMvcTagsProvider() {
+        return new DefaultWebMvcTagsProvider() {
+            @Override
+            public Iterable<Tag> getTags(HttpServletRequest request, HttpServletResponse response,
+                                         Object handler, Throwable exception) {
+                String uri = request.getServletPath();
+                if (uri == null || uri.isEmpty()) {
+                    uri = request.getPathInfo();
+                } else {
+                    String p = request.getPathInfo();
+                    if (p != null) {
+                        uri = uri + p;
+                    }
+                }
+                return Tags.concat(
+                        super.getTags(request, response, handler, exception),
+                        Tags.of(Tag.of("uri", uri))
+                );
+            }
+        };
+    }
+}
diff --git a/components-starter/camel-micrometer-starter/src/main/java/org/apache/camel/component/micrometer/springboot/CamelMicrometerAutoConfiguration.java b/components-starter/camel-micrometer-starter/src/main/java/org/apache/camel/component/micrometer/springboot/metrics/CamelMetricsAutoConfiguration.java
similarity index 61%
rename from components-starter/camel-micrometer-starter/src/main/java/org/apache/camel/component/micrometer/springboot/CamelMicrometerAutoConfiguration.java
rename to components-starter/camel-micrometer-starter/src/main/java/org/apache/camel/component/micrometer/springboot/metrics/CamelMetricsAutoConfiguration.java
index 69cec7f101c..c654ee34e97 100644
--- a/components-starter/camel-micrometer-starter/src/main/java/org/apache/camel/component/micrometer/springboot/CamelMicrometerAutoConfiguration.java
+++ b/components-starter/camel-micrometer-starter/src/main/java/org/apache/camel/component/micrometer/springboot/metrics/CamelMetricsAutoConfiguration.java
@@ -14,62 +14,58 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.micrometer.springboot;
+package org.apache.camel.component.micrometer.springboot.metrics;
 
+import io.micrometer.core.instrument.MeterRegistry;
 import org.apache.camel.CamelContext;
 import org.apache.camel.component.micrometer.eventnotifier.MicrometerExchangeEventNotifier;
 import org.apache.camel.component.micrometer.eventnotifier.MicrometerRouteEventNotifier;
 import org.apache.camel.component.micrometer.messagehistory.MicrometerMessageHistoryFactory;
 import org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyFactory;
-import org.apache.camel.spi.CamelContextCustomizer;
 import org.apache.camel.spi.ManagementStrategy;
 import org.apache.camel.spring.boot.CamelAutoConfiguration;
 import org.apache.camel.spring.boot.util.ConditionalOnCamelContextAndAutoConfigurationBeans;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.AutoConfigureAfter;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Conditional;
 
 @Conditional(ConditionalOnCamelContextAndAutoConfigurationBeans.class)
-@EnableConfigurationProperties({CamelMicrometerConfiguration.class})
+@EnableConfigurationProperties({CamelMetricsConfiguration.class})
 @AutoConfigureAfter({CamelAutoConfiguration.class})
-public class CamelMicrometerAutoConfiguration {
+public class CamelMetricsAutoConfiguration {
 
-    @Autowired
-    private ApplicationContext applicationContext;
-    private final CamelContext camelContext;
-    @Autowired
-    private CamelMicrometerConfiguration configuration;
-
-    public CamelMicrometerAutoConfiguration(
-            CamelContext camelContext) {
-        this.camelContext = camelContext;
+    public CamelMetricsAutoConfiguration(
+            CamelContext camelContext, CamelMetricsConfiguration configuration, MeterRegistry meterRegistry) {
+        configureMicrometer(camelContext, configuration, meterRegistry);
     }
 
-    @Bean
-    public CamelContextCustomizer configureMicrometer() {
+    private void configureMicrometer(CamelContext camelContext, CamelMetricsConfiguration configuration, MeterRegistry meterRegistry) {
         if (configuration.isEnableRoutePolicy()) {
-            camelContext.addRoutePolicyFactory(new MicrometerRoutePolicyFactory());
+            MicrometerRoutePolicyFactory factory = new MicrometerRoutePolicyFactory();
+            factory.setMeterRegistry(meterRegistry);
+            camelContext.addRoutePolicyFactory(factory);
         }
 
         ManagementStrategy managementStrategy = camelContext.getManagementStrategy();
         if (configuration.isEnableExchangeEventNotifier()) {
-            managementStrategy.addEventNotifier(new MicrometerExchangeEventNotifier());
+            MicrometerExchangeEventNotifier notifier = new MicrometerExchangeEventNotifier();
+            notifier.setMeterRegistry(meterRegistry);
+            managementStrategy.addEventNotifier(notifier);
         }
 
         if (configuration.isEnableRouteEventNotifier()) {
-            managementStrategy.addEventNotifier(new MicrometerRouteEventNotifier());
+            MicrometerRouteEventNotifier notifier = new MicrometerRouteEventNotifier();
+            notifier.setMeterRegistry(meterRegistry);
+            managementStrategy.addEventNotifier(notifier);
         }
 
         if (configuration.isEnableMessageHistory()) {
             if (!camelContext.isMessageHistory()) {
                 camelContext.setMessageHistory(true);
             }
-            camelContext.setMessageHistoryFactory(new MicrometerMessageHistoryFactory());
+            MicrometerMessageHistoryFactory factory = new MicrometerMessageHistoryFactory();
+            factory.setMeterRegistry(meterRegistry);
+            camelContext.setMessageHistoryFactory(factory);
         }
-
-        return null;
     }
 }
\ No newline at end of file
diff --git a/components-starter/camel-micrometer-starter/src/main/java/org/apache/camel/component/micrometer/springboot/CamelMicrometerConfiguration.java b/components-starter/camel-micrometer-starter/src/main/java/org/apache/camel/component/micrometer/springboot/metrics/CamelMetricsConfiguration.java
similarity index 96%
rename from components-starter/camel-micrometer-starter/src/main/java/org/apache/camel/component/micrometer/springboot/CamelMicrometerConfiguration.java
rename to components-starter/camel-micrometer-starter/src/main/java/org/apache/camel/component/micrometer/springboot/metrics/CamelMetricsConfiguration.java
index a1eced0e87c..5bdeae53ab0 100644
--- a/components-starter/camel-micrometer-starter/src/main/java/org/apache/camel/component/micrometer/springboot/CamelMicrometerConfiguration.java
+++ b/components-starter/camel-micrometer-starter/src/main/java/org/apache/camel/component/micrometer/springboot/metrics/CamelMetricsConfiguration.java
@@ -14,12 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.micrometer.springboot;
+package org.apache.camel.component.micrometer.springboot.metrics;
 
 import org.springframework.boot.context.properties.ConfigurationProperties;
 
 @ConfigurationProperties(prefix = "camel.metrics")
-public class CamelMicrometerConfiguration {
+public class CamelMetricsConfiguration {
 
     /**
      * Set whether to enable the MicrometerRoutePolicyFactory for capturing metrics
diff --git a/components-starter/camel-micrometer-starter/src/main/resources/META-INF/spring.factories b/components-starter/camel-micrometer-starter/src/main/resources/META-INF/spring.factories
index 74503547d6a..01c9d88aa55 100644
--- a/components-starter/camel-micrometer-starter/src/main/resources/META-INF/spring.factories
+++ b/components-starter/camel-micrometer-starter/src/main/resources/META-INF/spring.factories
@@ -18,5 +18,6 @@
 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
 org.apache.camel.component.micrometer.springboot.MicrometerComponentAutoConfiguration,\
 org.apache.camel.component.micrometer.springboot.MicrometerComponentConverter,\
-org.apache.camel.component.micrometer.springboot.CamelMicrometerAutoConfiguration
+org.apache.camel.component.micrometer.springboot.MicrometerTagsAutoConfiguration,\
+org.apache.camel.component.micrometer.springboot.metrics.CamelMetricsAutoConfiguration