diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/MetricsClientHttpRequestInterceptor.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/MetricsClientHttpRequestInterceptor.java index a533e64f..6afe6385 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/MetricsClientHttpRequestInterceptor.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/MetricsClientHttpRequestInterceptor.java @@ -18,8 +18,6 @@ import java.util.Collection; import java.util.Map; import java.util.concurrent.TimeUnit; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.netflix.metrics.servo.ServoMonitorCache; import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpRequestExecution; @@ -43,17 +41,22 @@ public class MetricsClientHttpRequestInterceptor implements ClientHttpRequestInt * Boot (Actuator) provides a more general purpose abstraction for dimensional metrics * systems, this can be moved there and rewritten against that abstraction. */ - @Autowired - MonitorRegistry registry; + private final MonitorRegistry registry; - @Autowired - Collection tagProviders; + private final Collection tagProviders; - @Autowired - ServoMonitorCache servoMonitorCache; + private final ServoMonitorCache servoMonitorCache; - @Value("${netflix.metrics.restClient.metricName:restclient}") - String metricName; + private final String metricName; + + public MetricsClientHttpRequestInterceptor(MonitorRegistry registry, + Collection tagProviders, + ServoMonitorCache servoMonitorCache, String metricName) { + this.registry = registry; + this.tagProviders = tagProviders; + this.servoMonitorCache = servoMonitorCache; + this.metricName = metricName; + } @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, @@ -68,8 +71,8 @@ public class MetricsClientHttpRequestInterceptor implements ClientHttpRequestInt finally { SmallTagMap.Builder builder = SmallTagMap.builder(); for (MetricsTagProvider tagProvider : tagProviders) { - for (Map.Entry tag : tagProvider.clientHttpRequestTags( - request, response).entrySet()) { + for (Map.Entry tag : tagProvider + .clientHttpRequestTags(request, response).entrySet()) { builder.add(Tags.newTag(tag.getKey(), tag.getValue())); } } @@ -78,8 +81,8 @@ public class MetricsClientHttpRequestInterceptor implements ClientHttpRequestInt .builder(metricName); monitorConfigBuilder.withTags(builder); - servoMonitorCache.getTimer(monitorConfigBuilder.build()).record( - System.nanoTime() - startTime, TimeUnit.NANOSECONDS); + servoMonitorCache.getTimer(monitorConfigBuilder.build()) + .record(System.nanoTime() - startTime, TimeUnit.NANOSECONDS); } } } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/MetricsInterceptorConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/MetricsInterceptorConfiguration.java index e48f68b3..48455cff 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/MetricsInterceptorConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/MetricsInterceptorConfiguration.java @@ -15,14 +15,17 @@ package org.springframework.cloud.netflix.metrics; import java.util.ArrayList; +import com.netflix.servo.MonitorRegistry; import org.aspectj.lang.JoinPoint; import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.boot.actuate.metrics.reader.MetricReader; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.cloud.netflix.metrics.servo.ServoMonitorCache; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; @@ -34,6 +37,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter import com.netflix.servo.monitor.Monitors; +import java.util.Collection; + /** * @author Jon Schneider */ @@ -71,11 +76,18 @@ public class MetricsInterceptorConfiguration { @Configuration @ConditionalOnBean({ RestTemplate.class }) + @ConditionalOnClass(name = "javax.servlet.http.HttpServletRequest") static class MetricsRestTemplateConfiguration { + @Value("${netflix.metrics.restClient.metricName:restclient}") + String metricName; + @Bean - MetricsClientHttpRequestInterceptor spectatorLoggingClientHttpRequestInterceptor() { - return new MetricsClientHttpRequestInterceptor(); + MetricsClientHttpRequestInterceptor spectatorLoggingClientHttpRequestInterceptor( + MonitorRegistry registry, Collection tagProviders, + ServoMonitorCache servoMonitorCache) { + return new MetricsClientHttpRequestInterceptor(registry, tagProviders, + servoMonitorCache, this.metricName); } @Bean diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/servo/ServoMetricsAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/servo/ServoMetricsAutoConfiguration.java index 1dfd7cd4..bfebada0 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/servo/ServoMetricsAutoConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/servo/ServoMetricsAutoConfiguration.java @@ -95,8 +95,12 @@ public class ServoMetricsAutoConfiguration { return new ServoMetricServices(monitorRegistry); } - @Bean - public MetricsTagProvider defaultMetricsTagProvider() { - return new DefaultMetricsTagProvider(); + @Configuration + @ConditionalOnClass(name = "javax.servlet.http.HttpServletRequest") + protected static class MetricsTagConfiguration { + @Bean + public MetricsTagProvider defaultMetricsTagProvider() { + return new DefaultMetricsTagProvider(); + } } }