From dbe0801ef490cea7b9c5ebff940802c0fd080856 Mon Sep 17 00:00:00 2001 From: pandaapo <1052156701@qq.com> Date: Thu, 15 Sep 2022 20:57:49 +0800 Subject: [PATCH] Fix issue 579:Report the labels in request when report the result of invocation by RestTemplate --- .../PolarisLoadBalancerCompositeRule.java | 1 + .../feign/PolarisFeignLoadBalancer.java | 2 +- .../MetadataRouterRequestInterceptor.java | 2 +- .../NearbyRouterRequestInterceptor.java | 2 +- .../RuleBasedRouterRequestInterceptor.java | 2 +- .../PolarisLoadBalancerInterceptor.java | 22 +++++++++++++--- .../scg/PolarisLoadBalancerClientFilter.java | 2 +- .../router/spi/RouterRequestInterceptor.java | 2 +- .../router/spi/RouterResponseInterceptor.java | 2 +- .../zuul/PolarisRibbonRoutingFilter.java | 2 +- .../PolarisLoadBalancerCompositeRuleTest.java | 1 + .../router/PolarisRouterContextTest.java | 1 + .../feign/PolarisFeignLoadBalancerTest.java | 2 +- .../PolarisLoadBalancerInterceptorTest.java | 25 ++++++++++++++++++- .../PolarisLoadBalancerClientFilterTest.java | 2 +- .../zuul/PolarisRibbonRoutingFilterTest.java | 2 +- .../constant}/PolarisRouterContext.java | 2 +- .../discovery-caller-service/pom.xml | 5 ++++ .../src/main/resources/bootstrap.yml | 5 ++++ .../FeatureEnvRouterRequestInterceptor.java | 2 +- ...eatureEnvRouterRequestInterceptorTest.java | 2 +- .../EnhancedRestTemplateReporter.java | 25 +++++++++++++++++++ .../EnhancedRestTemplateReporterTest.java | 14 ++++++++++- 23 files changed, 108 insertions(+), 19 deletions(-) rename {spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router => spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant}/PolarisRouterContext.java (98%) diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisLoadBalancerCompositeRule.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisLoadBalancerCompositeRule.java index eeb84afd3..f4148a5c0 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisLoadBalancerCompositeRule.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisLoadBalancerCompositeRule.java @@ -32,6 +32,7 @@ import com.netflix.loadbalancer.RoundRobinRule; import com.netflix.loadbalancer.Server; import com.netflix.loadbalancer.WeightedResponseTimeRule; import com.netflix.loadbalancer.ZoneAvoidanceRule; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.pojo.PolarisServer; import com.tencent.cloud.polaris.loadbalancer.LoadBalancerUtils; diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/feign/PolarisFeignLoadBalancer.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/feign/PolarisFeignLoadBalancer.java index 78117eeb1..cb81ae576 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/feign/PolarisFeignLoadBalancer.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/feign/PolarisFeignLoadBalancer.java @@ -28,11 +28,11 @@ import java.util.Optional; import com.netflix.client.config.IClientConfig; import com.netflix.loadbalancer.ILoadBalancer; import com.netflix.loadbalancer.reactive.LoadBalancerCommand; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.cloud.common.constant.RouterConstants; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.util.JacksonUtils; -import com.tencent.cloud.polaris.router.PolarisRouterContext; import org.springframework.cloud.netflix.ribbon.ServerIntrospector; import org.springframework.cloud.openfeign.ribbon.FeignLoadBalancer; diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/interceptor/MetadataRouterRequestInterceptor.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/interceptor/MetadataRouterRequestInterceptor.java index 9b9a78f2b..964ad1752 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/interceptor/MetadataRouterRequestInterceptor.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/interceptor/MetadataRouterRequestInterceptor.java @@ -21,7 +21,7 @@ package com.tencent.cloud.polaris.router.interceptor; import java.util.Map; import java.util.Set; -import com.tencent.cloud.polaris.router.PolarisRouterContext; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.cloud.polaris.router.config.properties.PolarisMetadataRouterProperties; import com.tencent.cloud.polaris.router.spi.RouterRequestInterceptor; import com.tencent.polaris.plugins.router.metadata.MetadataRouter; diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/interceptor/NearbyRouterRequestInterceptor.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/interceptor/NearbyRouterRequestInterceptor.java index 86efcd62e..3015fe527 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/interceptor/NearbyRouterRequestInterceptor.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/interceptor/NearbyRouterRequestInterceptor.java @@ -21,7 +21,7 @@ package com.tencent.cloud.polaris.router.interceptor; import java.util.HashMap; import java.util.Map; -import com.tencent.cloud.polaris.router.PolarisRouterContext; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.cloud.polaris.router.config.properties.PolarisNearByRouterProperties; import com.tencent.cloud.polaris.router.spi.RouterRequestInterceptor; import com.tencent.polaris.plugins.router.nearby.NearbyRouter; diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/interceptor/RuleBasedRouterRequestInterceptor.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/interceptor/RuleBasedRouterRequestInterceptor.java index 9abba566f..38b061a39 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/interceptor/RuleBasedRouterRequestInterceptor.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/interceptor/RuleBasedRouterRequestInterceptor.java @@ -21,7 +21,7 @@ package com.tencent.cloud.polaris.router.interceptor; import java.util.HashMap; import java.util.Map; -import com.tencent.cloud.polaris.router.PolarisRouterContext; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.cloud.polaris.router.config.properties.PolarisRuleBasedRouterProperties; import com.tencent.cloud.polaris.router.spi.RouterRequestInterceptor; import com.tencent.polaris.plugins.router.rule.RuleBasedRouter; diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/resttemplate/PolarisLoadBalancerInterceptor.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/resttemplate/PolarisLoadBalancerInterceptor.java index 92a91ad3e..96950d728 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/resttemplate/PolarisLoadBalancerInterceptor.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/resttemplate/PolarisLoadBalancerInterceptor.java @@ -19,7 +19,9 @@ package com.tencent.cloud.polaris.router.resttemplate; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.net.URI; +import java.net.URLEncoder; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -27,11 +29,12 @@ import java.util.List; import java.util.Map; import java.util.Set; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.metadata.StaticMetadataManager; +import com.tencent.cloud.common.util.JacksonUtils; import com.tencent.cloud.common.util.expresstion.SpringWebExpressionLabelUtils; -import com.tencent.cloud.polaris.router.PolarisRouterContext; import com.tencent.cloud.polaris.router.RouterRuleLabelResolver; import com.tencent.cloud.polaris.router.spi.SpringWebRouterLabelResolver; import org.slf4j.Logger; @@ -48,6 +51,8 @@ import org.springframework.http.client.ClientHttpResponse; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; +import static com.tencent.cloud.common.constant.ContextConstant.UTF_8; + /** * PolarisLoadBalancerInterceptor extends LoadBalancerInterceptor capabilities. * Parses the label from the request and puts it into the RouterContext for routing. @@ -96,9 +101,20 @@ public class PolarisLoadBalancerInterceptor extends LoadBalancerInterceptor { if (isRibbonLoadBalanceClient) { PolarisRouterContext routerContext = genRouterContext(request, body, peerServiceName); - - return ((RibbonLoadBalancerClient) loadBalancer).execute(peerServiceName, + ClientHttpResponse response = ((RibbonLoadBalancerClient) loadBalancer).execute(peerServiceName, this.requestFactory.createRequest(request, body, execution), routerContext); + Map labels = routerContext.getLabels(PolarisRouterContext.ROUTER_LABELS); + + // put labels in header + String encodedLabelsContent; + try { + encodedLabelsContent = URLEncoder.encode(JacksonUtils.serialize2Json(labels), UTF_8); + } + catch (UnsupportedEncodingException e) { + throw new RuntimeException("unsupported charset exception " + UTF_8); + } + response.getHeaders().add(PolarisRouterContext.ROUTER_LABELS, encodedLabelsContent); + return response; } return this.loadBalancer.execute(peerServiceName, diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/scg/PolarisLoadBalancerClientFilter.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/scg/PolarisLoadBalancerClientFilter.java index c8f0350ac..040484905 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/scg/PolarisLoadBalancerClientFilter.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/scg/PolarisLoadBalancerClientFilter.java @@ -26,11 +26,11 @@ import java.util.List; import java.util.Map; import java.util.Set; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.metadata.StaticMetadataManager; import com.tencent.cloud.common.util.expresstion.SpringWebExpressionLabelUtils; -import com.tencent.cloud.polaris.router.PolarisRouterContext; import com.tencent.cloud.polaris.router.RouterRuleLabelResolver; import com.tencent.cloud.polaris.router.spi.SpringWebRouterLabelResolver; import org.slf4j.Logger; diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/spi/RouterRequestInterceptor.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/spi/RouterRequestInterceptor.java index 6e515d9c2..00adb5d5f 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/spi/RouterRequestInterceptor.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/spi/RouterRequestInterceptor.java @@ -18,7 +18,7 @@ package com.tencent.cloud.polaris.router.spi; -import com.tencent.cloud.polaris.router.PolarisRouterContext; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.polaris.router.api.rpc.ProcessRoutersRequest; /** diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/spi/RouterResponseInterceptor.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/spi/RouterResponseInterceptor.java index 5d80d0c25..c3bc3da77 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/spi/RouterResponseInterceptor.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/spi/RouterResponseInterceptor.java @@ -18,7 +18,7 @@ package com.tencent.cloud.polaris.router.spi; -import com.tencent.cloud.polaris.router.PolarisRouterContext; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.polaris.router.api.rpc.ProcessRoutersResponse; /** diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilter.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilter.java index ab3bea69c..cefd404b2 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilter.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilter.java @@ -29,12 +29,12 @@ import java.util.Set; import javax.servlet.http.HttpServletRequest; import com.netflix.zuul.context.RequestContext; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.metadata.StaticMetadataManager; import com.tencent.cloud.common.util.BeanFactoryUtils; import com.tencent.cloud.common.util.expresstion.ServletExpressionLabelUtils; -import com.tencent.cloud.polaris.router.PolarisRouterContext; import com.tencent.cloud.polaris.router.RouterRuleLabelResolver; import com.tencent.cloud.polaris.router.spi.ServletRouterLabelResolver; import org.slf4j.Logger; diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/PolarisLoadBalancerCompositeRuleTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/PolarisLoadBalancerCompositeRuleTest.java index ffc7123c2..0e642b52d 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/PolarisLoadBalancerCompositeRuleTest.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/PolarisLoadBalancerCompositeRuleTest.java @@ -35,6 +35,7 @@ import com.netflix.loadbalancer.RetryRule; import com.netflix.loadbalancer.RoundRobinRule; import com.netflix.loadbalancer.Server; import com.netflix.loadbalancer.WeightedResponseTimeRule; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.pojo.PolarisServer; diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/PolarisRouterContextTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/PolarisRouterContextTest.java index ced54a597..4f906458b 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/PolarisRouterContextTest.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/PolarisRouterContextTest.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.Set; import com.google.common.collect.Sets; +import com.tencent.cloud.common.constant.PolarisRouterContext; import org.junit.Assert; import org.junit.Test; diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/feign/PolarisFeignLoadBalancerTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/feign/PolarisFeignLoadBalancerTest.java index 29745a1a8..6f800259e 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/feign/PolarisFeignLoadBalancerTest.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/feign/PolarisFeignLoadBalancerTest.java @@ -26,12 +26,12 @@ import java.util.Map; import com.netflix.client.config.DefaultClientConfigImpl; import com.netflix.loadbalancer.ILoadBalancer; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.cloud.common.constant.RouterConstants; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.util.ApplicationContextAwareUtils; import com.tencent.cloud.common.util.JacksonUtils; -import com.tencent.cloud.polaris.router.PolarisRouterContext; import com.tencent.cloud.polaris.router.SimpleLoadBalancer; import org.junit.Assert; import org.junit.Test; diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/resttemplate/PolarisLoadBalancerInterceptorTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/resttemplate/PolarisLoadBalancerInterceptorTest.java index 229a252df..df988ac36 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/resttemplate/PolarisLoadBalancerInterceptorTest.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/resttemplate/PolarisLoadBalancerInterceptorTest.java @@ -19,18 +19,22 @@ package com.tencent.cloud.polaris.router.resttemplate; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.net.URI; +import java.net.URLEncoder; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.metadata.StaticMetadataManager; import com.tencent.cloud.common.util.ApplicationContextAwareUtils; -import com.tencent.cloud.polaris.router.PolarisRouterContext; +import com.tencent.cloud.common.util.JacksonUtils; +import com.tencent.cloud.common.util.expresstion.SpringWebExpressionLabelUtils; import com.tencent.cloud.polaris.router.RouterRuleLabelResolver; import com.tencent.cloud.polaris.router.spi.SpringWebRouterLabelResolver; import org.junit.Assert; @@ -53,7 +57,10 @@ import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; import org.springframework.mock.http.client.MockClientHttpResponse; +import static com.tencent.cloud.common.constant.ContextConstant.UTF_8; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -82,23 +89,27 @@ public class PolarisLoadBalancerInterceptorTest { String calleeService = "calleeService"; HttpRequest request = new MockedHttpRequest("http://" + calleeService + "/user/get"); + Map routerLabels = new HashMap<>(); // mock local metadata Map localMetadata = new HashMap<>(); localMetadata.put("k1", "v1"); localMetadata.put("k2", "v2"); when(staticMetadataManager.getMergedStaticMetadata()).thenReturn(localMetadata); + routerLabels.putAll(localMetadata); // mock expression rule labels Set expressionKeys = new HashSet<>(); expressionKeys.add("${http.method}"); expressionKeys.add("${http.uri}"); when(routerRuleLabelResolver.getExpressionLabelKeys(callerService, callerService, calleeService)).thenReturn(expressionKeys); + routerLabels.putAll(SpringWebExpressionLabelUtils.resolve(request, expressionKeys)); // mock custom resolved from request Map customResolvedLabels = new HashMap<>(); customResolvedLabels.put("k3", "v3"); customResolvedLabels.put("k4", "v4"); when(routerLabelResolver.resolve(request, null, expressionKeys)).thenReturn(customResolvedLabels); + routerLabels.putAll(customResolvedLabels); try (MockedStatic mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class)) { @@ -112,6 +123,7 @@ public class PolarisLoadBalancerInterceptorTest { transitiveLabels.put("k1", "v1"); transitiveLabels.put("k2", "v22"); when(metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE)).thenReturn(transitiveLabels); + routerLabels.putAll(transitiveLabels); try (MockedStatic mockedMetadataContextHolder = Mockito.mockStatic(MetadataContextHolder.class)) { mockedMetadataContextHolder.when(MetadataContextHolder::get).thenReturn(metadataContext); @@ -122,11 +134,22 @@ public class PolarisLoadBalancerInterceptorTest { PolarisLoadBalancerInterceptor polarisLoadBalancerInterceptor = new PolarisLoadBalancerInterceptor(loadBalancerClient, loadBalancerRequestFactory, Collections.singletonList(routerLabelResolver), staticMetadataManager, routerRuleLabelResolver); + ClientHttpResponse mockedResponse = new MockClientHttpResponse(new byte[] {}, HttpStatus.OK); + when(loadBalancerClient.execute(eq(calleeService), eq(loadBalancerRequest), any(PolarisRouterContext.class))).thenReturn(mockedResponse); + polarisLoadBalancerInterceptor.intercept(request, null, null); verify(staticMetadataManager).getMergedStaticMetadata(); verify(routerRuleLabelResolver).getExpressionLabelKeys(callerService, callerService, calleeService); verify(routerLabelResolver).resolve(request, null, expressionKeys); + String encodedLabelsContent; + try { + encodedLabelsContent = URLEncoder.encode(JacksonUtils.serialize2Json(routerLabels), UTF_8); + } + catch (UnsupportedEncodingException e) { + throw new RuntimeException("unsupported charset exception " + UTF_8); + } + Assert.assertEquals(mockedResponse.getHeaders().get(PolarisRouterContext.ROUTER_LABELS).get(0), encodedLabelsContent); } } } diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/scg/PolarisLoadBalancerClientFilterTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/scg/PolarisLoadBalancerClientFilterTest.java index 05ec107f1..6e0b23f3d 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/scg/PolarisLoadBalancerClientFilterTest.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/scg/PolarisLoadBalancerClientFilterTest.java @@ -25,11 +25,11 @@ import java.util.Set; import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.metadata.StaticMetadataManager; import com.tencent.cloud.common.util.ApplicationContextAwareUtils; -import com.tencent.cloud.polaris.router.PolarisRouterContext; import com.tencent.cloud.polaris.router.RouterRuleLabelResolver; import com.tencent.cloud.polaris.router.spi.SpringWebRouterLabelResolver; import org.junit.AfterClass; diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilterTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilterTest.java index ca3bd4e36..7003b04f8 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilterTest.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilterTest.java @@ -29,12 +29,12 @@ import com.netflix.client.config.IClientConfig; import com.netflix.hystrix.HystrixCommandProperties; import com.netflix.niws.client.http.RestClient; import com.netflix.zuul.context.RequestContext; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.metadata.StaticMetadataManager; import com.tencent.cloud.common.util.ApplicationContextAwareUtils; import com.tencent.cloud.polaris.loadbalancer.PolarisLoadBalancer; -import com.tencent.cloud.polaris.router.PolarisRouterContext; import com.tencent.cloud.polaris.router.RouterRuleLabelResolver; import com.tencent.cloud.polaris.router.spi.ServletRouterLabelResolver; import okhttp3.OkHttpClient; diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterContext.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/PolarisRouterContext.java similarity index 98% rename from spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterContext.java rename to spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/PolarisRouterContext.java index b2569bd19..947366f58 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterContext.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/PolarisRouterContext.java @@ -16,7 +16,7 @@ * */ -package com.tencent.cloud.polaris.router; +package com.tencent.cloud.common.constant; import java.util.Arrays; import java.util.Collections; diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml index f31856e6c..f4da8b427 100644 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml +++ b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml @@ -27,6 +27,11 @@ com.tencent.cloud spring-cloud-tencent-pushgateway-plugin + + + com.tencent.cloud + spring-cloud-starter-tencent-polaris-router + diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/bootstrap.yml index c1fed673f..26f39b0d2 100644 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/bootstrap.yml @@ -22,6 +22,11 @@ spring: rpc-enhancement: reporter: enabled: true + series: successful, informational, client_error, server_error, redirection + metadata: + content: + k1: v1 + k2: v2 # pushgateway: # enabled: true # address: 127.0.0.1:9091 diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-featureenv-plugin/src/main/java/com/tencent/cloud/plugin/featureenv/FeatureEnvRouterRequestInterceptor.java b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-featureenv-plugin/src/main/java/com/tencent/cloud/plugin/featureenv/FeatureEnvRouterRequestInterceptor.java index 05bbdaf40..c4be21f4a 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-featureenv-plugin/src/main/java/com/tencent/cloud/plugin/featureenv/FeatureEnvRouterRequestInterceptor.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-featureenv-plugin/src/main/java/com/tencent/cloud/plugin/featureenv/FeatureEnvRouterRequestInterceptor.java @@ -21,7 +21,7 @@ package com.tencent.cloud.plugin.featureenv; import java.util.HashMap; import java.util.Map; -import com.tencent.cloud.polaris.router.PolarisRouterContext; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.cloud.polaris.router.spi.RouterRequestInterceptor; import com.tencent.polaris.api.rpc.MetadataFailoverType; import com.tencent.polaris.plugins.router.metadata.MetadataRouter; diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-featureenv-plugin/src/test/java/com/tencent/cloud/plugin/featureenv/FeatureEnvRouterRequestInterceptorTest.java b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-featureenv-plugin/src/test/java/com/tencent/cloud/plugin/featureenv/FeatureEnvRouterRequestInterceptorTest.java index 8a5a6f35a..a7a331192 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-featureenv-plugin/src/test/java/com/tencent/cloud/plugin/featureenv/FeatureEnvRouterRequestInterceptorTest.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-featureenv-plugin/src/test/java/com/tencent/cloud/plugin/featureenv/FeatureEnvRouterRequestInterceptorTest.java @@ -22,7 +22,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Map; -import com.tencent.cloud.polaris.router.PolarisRouterContext; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.polaris.api.pojo.DefaultServiceInstances; import com.tencent.polaris.api.pojo.ServiceInstances; import com.tencent.polaris.api.pojo.ServiceKey; diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporter.java index 06379a8c5..2b40b78c1 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporter.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporter.java @@ -18,9 +18,13 @@ package com.tencent.cloud.rpc.enhancement.resttemplate; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.net.URI; +import java.net.URLDecoder; +import java.util.List; import java.util.Map; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.rpc.enhancement.AbstractPolarisReporterAdapter; @@ -29,6 +33,7 @@ import com.tencent.polaris.api.core.ConsumerAPI; import com.tencent.polaris.api.pojo.RetStatus; import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.rpc.ServiceCallResult; +import com.tencent.polaris.api.utils.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,6 +46,8 @@ import org.springframework.http.client.ClientHttpResponse; import org.springframework.lang.NonNull; import org.springframework.web.client.ResponseErrorHandler; +import static com.tencent.cloud.common.constant.ContextConstant.UTF_8; + /** * Extend ResponseErrorHandler to get request information. * @@ -129,6 +136,18 @@ public class EnhancedRestTemplateReporter extends AbstractPolarisReporterAdapter resultRequest.setRetStatus(RetStatus.RetFail); } + List labels = response.getHeaders().get(PolarisRouterContext.ROUTER_LABELS); + if (CollectionUtils.isNotEmpty(labels) && labels.size() > 0) { + String label = labels.get(0); + try { + label = URLDecoder.decode(label, UTF_8); + } + catch (UnsupportedEncodingException e) { + LOGGER.error("unsupported charset exception " + UTF_8, e); + } + resultRequest.setLabels(convertLabel(label)); + } + // processing report with consumerAPI . LOGGER.debug("Will report result of {}. URL=[{}]. Response=[{}].", resultRequest.getRetStatus().name(), url, response); @@ -142,6 +161,12 @@ public class EnhancedRestTemplateReporter extends AbstractPolarisReporterAdapter } } + private String convertLabel(String label) { + label = label.replaceAll("\"|\\{|\\}", "") + .replaceAll(",", "|"); + return label; + } + private void invokeDelegateHandler(URI url, HttpMethod method, ClientHttpResponse response) throws IOException { if (realHasError(response)) { delegateHandler.handleError(url, method, response); diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporterTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporterTest.java index 099f266d8..5d7ffd4ab 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporterTest.java +++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporterTest.java @@ -20,20 +20,25 @@ package com.tencent.cloud.rpc.enhancement.resttemplate; import java.io.IOException; import java.io.InputStream; import java.net.URI; +import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; +import com.tencent.cloud.common.constant.PolarisRouterContext; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.util.ApplicationContextAwareUtils; import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties; import com.tencent.polaris.api.core.ConsumerAPI; +import com.tencent.polaris.api.rpc.ServiceCallResult; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockedStatic; @@ -46,6 +51,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.client.AbstractClientHttpResponse; import org.springframework.web.client.ResponseErrorHandler; +import static com.tencent.cloud.common.constant.ContextConstant.UTF_8; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; @@ -70,6 +76,8 @@ public class EnhancedRestTemplateReporterTest { private ResponseErrorHandler delegate; @InjectMocks private EnhancedRestTemplateReporter enhancedRestTemplateReporter; + @Captor + private ArgumentCaptor captor; @BeforeClass public static void beforeClass() { @@ -119,9 +127,13 @@ public class EnhancedRestTemplateReporterTest { enhancedRestTemplateReporter.hasError(response); URI uri = mock(URI.class); + String labels = URLEncoder.encode("{\"k1\":\"v1\",\"k2\":\"v2\"}", UTF_8); + response.getHeaders().set(PolarisRouterContext.ROUTER_LABELS, labels); enhancedRestTemplateReporter.handleError(uri, HttpMethod.GET, response); - verify(consumerAPI, times(2)).updateServiceCallResult(any()); + verify(consumerAPI, times(2)).updateServiceCallResult((ServiceCallResult) captor.capture()); + ServiceCallResult value = (ServiceCallResult) captor.getValue(); + Assert.assertEquals(value.getLabels(), "k1:v1|k2:v2"); verify(delegate).handleError(uri, HttpMethod.GET, response); }