From 7d053beed91398627584253cb6e93ca10de6c204 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Mon, 2 Mar 2020 18:30:26 +0800 Subject: [PATCH] Attempts to align feign code with master (#1577) This tries to pick in the relevant changes made in 3813cf9dd47f98db0e075412abbffbd9d6742974 Notably, there's one glitch, `TraceFeignAspect` still passes bean, not wrappedBean. The latter trips out `ManuallyCreatedLoadBalancerFeignClientTests` as the nonexistenturl raises a hard error in Ribbon. I *think* this is a bug and tests need to just adjust for that, but need a second opinion. Also, I'm not entirely sure the intent of using the broken url then asserting against a success result.. --- .../instrument/web/client/feign/TraceFeignAspect.java | 2 ++ .../web/client/feign/TraceFeignObjectWrapper.java | 5 +++-- .../instrument/web/client/feign/TracingFeignClient.java | 7 +++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignAspect.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignAspect.java index ba1044917..5f3467a02 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignAspect.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignAspect.java @@ -53,6 +53,8 @@ class TraceFeignAspect { log.debug("Executing feign client via TraceFeignAspect"); } if (bean != wrappedBean) { + // NOTE: in master(3813cf9dd47f98db0e075412abbffbd9d6742974), + // this is executeTraceFeignClient(wrappedBean, pjp) return executeTraceFeignClient(bean, pjp); } return pjp.proceed(); diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignObjectWrapper.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignObjectWrapper.java index a5c3c15f1..11a54e745 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignObjectWrapper.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignObjectWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2019 the original author or authors. + * Copyright 2013-2020 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. @@ -29,6 +29,7 @@ import org.springframework.cloud.netflix.ribbon.SpringClientFactory; import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient; import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory; import org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient; +import org.springframework.cloud.util.ProxyUtils; import org.springframework.util.ClassUtils; /** @@ -100,7 +101,7 @@ final class TraceFeignObjectWrapper { private Object instrumentedFeignLoadBalancerClient(Object bean) { if (AopUtils.getTargetClass(bean).equals(FeignBlockingLoadBalancerClient.class)) { - FeignBlockingLoadBalancerClient client = ((FeignBlockingLoadBalancerClient) bean); + FeignBlockingLoadBalancerClient client = ProxyUtils.getTargetObject(bean); return new TraceFeignBlockingLoadBalancerClient( (Client) new TraceFeignObjectWrapper(this.beanFactory) .wrap(client.getDelegate()), diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignClient.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignClient.java index a551829fb..ac6d69442 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignClient.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignClient.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2019 the original author or authors. + * Copyright 2013-2020 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. @@ -37,6 +37,7 @@ import feign.Response; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.cloud.util.ProxyUtils; import org.springframework.lang.Nullable; /** @@ -58,7 +59,9 @@ final class TracingFeignClient implements Client { TracingFeignClient(HttpTracing httpTracing, Client delegate) { this.currentTraceContext = httpTracing.tracing().currentTraceContext(); this.handler = HttpClientHandler.create(httpTracing); - this.delegate = delegate; + Client delegateTarget = ProxyUtils.getTargetObject(delegate); + this.delegate = delegateTarget instanceof TracingFeignClient + ? ((TracingFeignClient) delegateTarget).delegate : delegateTarget; } static Client create(HttpTracing httpTracing, Client delegate) {