From 36e4c7cf9307720dfca3758e796ee7521cab5d67 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Thu, 12 Nov 2015 13:52:56 +0000 Subject: [PATCH] Make metrics aspect conditional on Spring AOP Also changes pointcut to use the interface so you don't need proxyTargetClass=true. Fixes gh-636 --- .../MetricsInterceptorConfiguration.java | 22 +++++++++++++++---- ...estTemplateUrlTemplateCapturingAspect.java | 8 +++---- 2 files changed, 22 insertions(+), 8 deletions(-) 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 d73c1e8a..8914f3a7 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 @@ -13,10 +13,12 @@ package org.springframework.cloud.netflix.metrics; +import org.aspectj.lang.JoinPoint; 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.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -47,13 +49,22 @@ public class MetricsInterceptorConfiguration { } @Configuration + @ConditionalOnClass(JoinPoint.class) + @ConditionalOnProperty(value = "spring.aop.enabled", havingValue = "true", matchIfMissing = true) @ConditionalOnBean({ RestTemplate.class }) - static class MetricsRestTemplateConfiguration { + static class MetricsRestTemplateAspectConfiguration { + @Bean RestTemplateUrlTemplateCapturingAspect restTemplateUrlTemplateCapturingAspect() { return new RestTemplateUrlTemplateCapturingAspect(); } + } + + @Configuration + @ConditionalOnBean({ RestTemplate.class }) + static class MetricsRestTemplateConfiguration { + @Bean MetricsClientHttpRequestInterceptor spectatorLoggingClientHttpRequestInterceptor() { return new MetricsClientHttpRequestInterceptor(); @@ -64,14 +75,17 @@ public class MetricsInterceptorConfiguration { final MetricsClientHttpRequestInterceptor interceptor) { return new BeanPostProcessor() { @Override - public Object postProcessBeforeInitialization(Object bean, String beanName) { + public Object postProcessBeforeInitialization(Object bean, + String beanName) { return bean; } @Override - public Object postProcessAfterInitialization(Object bean, String beanName) { - if (bean instanceof RestTemplate) + public Object postProcessAfterInitialization(Object bean, + String beanName) { + if (bean instanceof RestTemplate) { ((RestTemplate) bean).getInterceptors().add(interceptor); + } return bean; } }; diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/RestTemplateUrlTemplateCapturingAspect.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/RestTemplateUrlTemplateCapturingAspect.java index 7c044edf..37aa60d2 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/RestTemplateUrlTemplateCapturingAspect.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/metrics/RestTemplateUrlTemplateCapturingAspect.java @@ -1,11 +1,11 @@ /* * Copyright 2013-2015 the original author or authors. - * + * * Licensed 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. @@ -25,7 +25,7 @@ import org.aspectj.lang.annotation.Aspect; */ @Aspect public class RestTemplateUrlTemplateCapturingAspect { - @Around("execution(* org.springframework.web.client.RestTemplate.*(String, ..))") + @Around("execution(* org.springframework.web.client.RestOperations+.*(String, ..))") void captureUrlTemplate(ProceedingJoinPoint joinPoint) throws Throwable { try { String urlTemplate = (String) joinPoint.getArgs()[0];