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
The following commit(s) were added to refs/heads/main by this push:
new bbc44b0f217 CAMEL-19168: camel-micrometer-starter - Make it possible
to capture static uri path as tag
bbc44b0f217 is described below
commit bbc44b0f217d73b3e94d52dc5ca2054a7169b788
Author: Claus Ibsen <[email protected]>
AuthorDate: Sun Mar 19 11:57:21 2023 +0100
CAMEL-19168: camel-micrometer-starter - Make it possible to capture static
uri path as tag
---
.../camel-micrometer-starter/pom.xml | 5 +++
.../src/main/docs/micrometer.json | 11 +++++--
.../MicrometerTagsAutoConfiguration.java | 36 +++++++++++++++++-----
.../metrics/CamelMetricsConfiguration.java | 22 +++++++++++--
.../ServletMappingAutoConfiguration.java | 17 ++++++++--
5 files changed, 77 insertions(+), 14 deletions(-)
diff --git a/components-starter/camel-micrometer-starter/pom.xml
b/components-starter/camel-micrometer-starter/pom.xml
index fe13dc2d265..6907b19a425 100644
--- a/components-starter/camel-micrometer-starter/pom.xml
+++ b/components-starter/camel-micrometer-starter/pom.xml
@@ -49,6 +49,11 @@
<artifactId>camel-micrometer</artifactId>
<version>${camel-version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-http-common</artifactId>
+ <version>${camel-version}</version>
+ </dependency>
<!--START OF GENERATED CODE-->
<dependency>
<groupId>org.apache.camel.springboot</groupId>
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 523d6e9ca2d..d11fc1b7bed 100644
--- a/components-starter/camel-micrometer-starter/src/main/docs/micrometer.json
+++ b/components-starter/camel-micrometer-starter/src/main/docs/micrometer.json
@@ -78,11 +78,18 @@
"defaultValue": true
},
{
- "name": "camel.metrics.uri-tag-enabled",
+ "name": "camel.metrics.uri-tag-dynamic",
"type": "java.lang.Boolean",
- "description": "Whether HTTP uri tags should be enabled or not. For
example a REST service defined with base URL: \/users\/{id} will capture
metrics with uri tag with actual dynamic value such as: \/users\/123. However,
this can lead to many tags as the URI is dynamic, so use this with care.",
+ "description": "Whether to use static or dynamic values for URI tags in
captured metrics. When using dynamic tags, then a REST service with base URL:
\/users\/{id} will capture metrics with uri tag with the actual dynamic value
such as: \/users\/123. However, this can lead to many tags as the URI is
dynamic, so use this with care.",
"sourceType":
"org.apache.camel.component.micrometer.springboot.metrics.CamelMetricsConfiguration",
"defaultValue": false
+ },
+ {
+ "name": "camel.metrics.uri-tag-enabled",
+ "type": "java.lang.Boolean",
+ "description": "Whether HTTP uri tags should be enabled or not in
captured metrics. If disabled then the uri tag, is likely not able to be
resolved and will be marked as UNKNOWN.",
+ "sourceType":
"org.apache.camel.component.micrometer.springboot.metrics.CamelMetricsConfiguration",
+ "defaultValue": true
}
],
"hints": []
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
index 43c1a8fe342..55b4f6608d2 100644
---
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
@@ -21,17 +21,23 @@ import io.micrometer.core.instrument.Tags;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.camel.CamelContext;
+import
org.apache.camel.component.micrometer.springboot.metrics.CamelMetricsConfiguration;
+import org.apache.camel.http.common.CamelServlet;
+import org.apache.camel.http.common.HttpConsumer;
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.actuate.metrics.web.servlet.DefaultWebMvcTagsProvider;
import org.springframework.boot.actuate.metrics.web.servlet.WebMvcTagsProvider;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
+import java.util.Optional;
+
@Configuration(proxyBeanMethods = false)
@Conditional({ConditionalOnCamelContextAndAutoConfigurationBeans.class})
@ConditionalOnProperty(prefix = "camel.metrics", name = "uriTagEnabled",
havingValue = "true")
@@ -46,20 +52,36 @@ public class MicrometerTagsAutoConfiguration {
* camel rest-dsl with servlet.
*/
@Bean
- WebMvcTagsProvider webMvcTagsProvider() {
+ WebMvcTagsProvider webMvcTagsProvider(Optional<CamelServlet> servlet,
CamelMetricsConfiguration configuration) {
return new DefaultWebMvcTagsProvider() {
@Override
public Iterable<Tag> getTags(HttpServletRequest request,
HttpServletResponse response,
Object handler, Throwable exception) {
- String uri = request.getServletPath();
+
+ String uri = null;
+ if (servlet.isPresent() && !configuration.isUriTagDynamic()) {
+ HttpConsumer consumer =
servlet.get().getServletResolveConsumerStrategy().resolve(request,
servlet.get().getConsumers());
+ if (consumer != null) {
+ uri = consumer.getPath();
+ }
+ }
+
+ // the request may not be for camel servlet, so we need to
capture uri from request
if (uri == null || uri.isEmpty()) {
- uri = request.getPathInfo();
- } else {
- String p = request.getPathInfo();
- if (p != null) {
- uri = uri + p;
+ // dynamic uri with the actual value from the http request
+ uri = request.getServletPath();
+ if (uri == null || uri.isEmpty()) {
+ uri = request.getPathInfo();
+ } else {
+ String p = request.getPathInfo();
+ if (p != null) {
+ uri = uri + p;
+ }
}
}
+ if (uri == null) {
+ uri = "";
+ }
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/metrics/CamelMetricsConfiguration.java
b/components-starter/camel-micrometer-starter/src/main/java/org/apache/camel/component/micrometer/springboot/metrics/CamelMetricsConfiguration.java
index 154a721618e..f31b115191a 100644
---
a/components-starter/camel-micrometer-starter/src/main/java/org/apache/camel/component/micrometer/springboot/metrics/CamelMetricsConfiguration.java
+++
b/components-starter/camel-micrometer-starter/src/main/java/org/apache/camel/component/micrometer/springboot/metrics/CamelMetricsConfiguration.java
@@ -22,11 +22,19 @@ import
org.springframework.boot.context.properties.ConfigurationProperties;
public class CamelMetricsConfiguration {
/**
- * Whether HTTP uri tags should be enabled or not. For example a REST
service defined with
- * base URL: /users/{id} will capture metrics with uri tag with actual
dynamic value such as: /users/123.
+ * Whether HTTP uri tags should be enabled or not in captured metrics.
+ * If disabled then the uri tag, is likely not able to be resolved and
will be marked as UNKNOWN.
+ */
+ private boolean uriTagEnabled = true;
+
+ /**
+ * Whether to use static or dynamic values for URI tags in captured
metrics.
+ *
+ * When using dynamic tags, then a REST service with base URL: /users/{id}
will capture metrics
+ * with uri tag with the actual dynamic value such as: /users/123.
* However, this can lead to many tags as the URI is dynamic, so use this
with care.
*/
- private boolean uriTagEnabled;
+ private boolean uriTagDynamic;
/**
* Set whether to enable the MicrometerRoutePolicyFactory for capturing
metrics
@@ -63,6 +71,14 @@ public class CamelMetricsConfiguration {
this.uriTagEnabled = uriTagEnabled;
}
+ public boolean isUriTagDynamic() {
+ return uriTagDynamic;
+ }
+
+ public void setUriTagDynamic(boolean uriTagDynamic) {
+ this.uriTagDynamic = uriTagDynamic;
+ }
+
public boolean isEnableRoutePolicy() {
return enableRoutePolicy;
}
diff --git
a/components-starter/camel-servlet-starter/src/main/java/org/apache/camel/component/servlet/springboot/ServletMappingAutoConfiguration.java
b/components-starter/camel-servlet-starter/src/main/java/org/apache/camel/component/servlet/springboot/ServletMappingAutoConfiguration.java
index 08b1d78bdb7..6107a3380b3 100644
---
a/components-starter/camel-servlet-starter/src/main/java/org/apache/camel/component/servlet/springboot/ServletMappingAutoConfiguration.java
+++
b/components-starter/camel-servlet-starter/src/main/java/org/apache/camel/component/servlet/springboot/ServletMappingAutoConfiguration.java
@@ -42,10 +42,23 @@ import org.springframework.context.annotation.Lazy;
@EnableConfigurationProperties({ServletMappingConfiguration.class,
MultipartProperties.class})
public class ServletMappingAutoConfiguration {
+ /**
+ * Camel servlet
+ */
+ @Bean
+ CamelHttpTransportServlet camelHttpTransportServlet() {
+ CamelHttpTransportServlet servlet = new CamelHttpTransportServlet();
+ return servlet;
+ }
+
+ /**
+ * Spring Boot servlet registration with the Camel server
+ */
@Bean
- ServletRegistrationBean
camelServletRegistrationBean(ServletMappingConfiguration config,
MultipartProperties multipartProperties) {
+ ServletRegistrationBean
camelServletRegistrationBean(CamelHttpTransportServlet servlet,
+
ServletMappingConfiguration config, MultipartProperties multipartProperties) {
ServletRegistrationBean mapping = new ServletRegistrationBean();
- mapping.setServlet(new CamelHttpTransportServlet());
+ mapping.setServlet(servlet);
mapping.addUrlMappings(config.getContextPath());
mapping.setName(config.getServletName());
mapping.setLoadOnStartup(1);