feat:gateway支持上报调用数据

pull/924/head
chuntaojun 3 years ago
parent 9a65474244
commit f0b2279efb

@ -10,4 +10,4 @@
- [fix:fix nacos and consul registration.](https://github.com/Tencent/spring-cloud-tencent/pull/921)
- [Documentation content changes: add circuitbreaker readme.](https://github.com/Tencent/spring-cloud-tencent/pull/930)
- [fix: fix PolarisRouterServiceInstanceListSupplier npe with reactive feign.](https://github.com/Tencent/spring-cloud-tencent/pull/926)
- - [feat:support webclient and gateway report call metrics](https://github.com/Tencent/spring-cloud-tencent/pull/924)
- [feat:support webclient and gateway report call metrics](https://github.com/Tencent/spring-cloud-tencent/pull/924)

@ -21,7 +21,7 @@
1. 添加环境变量
- 北极星服务端地址polaris_address=grpc://183.47.111.80:8091
- 北极星服务端地址polaris_address=grpc://127.0.0.1:8091
- 可观测性PushGateway地址prometheus_address=127.0.0.1:9091
2. 启动router-grayrelease-gateway应用
@ -134,7 +134,7 @@
1. 添加环境变量
- 北极星服务端地址polaris_address=grpc://183.47.111.80:8091
- 北极星服务端地址polaris_address=grpc://127.0.0.1:8091
- 可观测性PushGateway地址prometheus_address=127.0.0.1:9091
- 环境标识SCT_METADATA_CONTENT_env=blue
- 透传环境标识SCT_METADATA_CONTENT_TRANSITIVE=env
@ -148,7 +148,7 @@
1. 添加环境变量
- 北极星服务端地址polaris_address=grpc://183.47.111.80:8091
- 北极星服务端地址polaris_address=grpc://127.0.0.1:8091
- 可观测性PushGateway地址prometheus_address=127.0.0.1:9091
- 环境标识SCT_METADATA_CONTENT_env=green
- 透传环境标识SCT_METADATA_CONTENT_TRANSITIVE=env
@ -161,7 +161,7 @@
1. 添加环境变量
- 北极星服务端地址polaris_address=grpc://183.47.111.80:8091
- 北极星服务端地址polaris_address=grpc://127.0.0.1:8091
- 可观测性PushGateway地址prometheus_address=127.0.0.1:9091
- 环境标识SCT_METADATA_CONTENT_env=purple
- 透传环境标识SCT_METADATA_CONTENT_TRANSITIVE=env
@ -180,7 +180,7 @@
1. 添加环境变量
- 北极星服务端地址polaris_address=grpc://183.47.111.80:8091
- 北极星服务端地址polaris_address=grpc://127.0.0.1:8091
- 可观测性PushGateway地址prometheus_address=127.0.0.1:9091
- 环境标识SCT_METADATA_CONTENT_env=blue
- 透传环境标识SCT_METADATA_CONTENT_TRANSITIVE=env
@ -195,7 +195,7 @@
1. 添加环境变量
- 北极星服务端地址polaris_address=grpc://183.47.111.80:8091
- 北极星服务端地址polaris_address=grpc://127.0.0.1:8091
- 可观测性PushGateway地址prometheus_address=127.0.0.1:9091
- 环境标识SCT_METADATA_CONTENT_env=purple
- 透传环境标识SCT_METADATA_CONTENT_TRANSITIVE=env
@ -208,7 +208,7 @@
1. 添加环境变量
- 北极星服务端地址polaris_address=grpc://183.47.111.80:8091
- 北极星服务端地址polaris_address=grpc://127.0.0.1:8091
- 可观测性PushGateway地址prometheus_address=127.0.0.1:9091
- 环境标识SCT_METADATA_CONTENT_env=blue
- 透传环境标识SCT_METADATA_CONTENT_TRANSITIVE=env
@ -222,7 +222,7 @@
1. 添加环境变量
- 北极星服务端地址polaris_address=grpc://183.47.111.80:8091
- 北极星服务端地址polaris_address=grpc://127.0.0.1:8091
- 可观测性PushGateway地址prometheus_address=127.0.0.1:9091
- 环境标识SCT_METADATA_CONTENT_env=green
- 透传环境标识SCT_METADATA_CONTENT_TRANSITIVE=env

@ -2,7 +2,7 @@ spring:
cloud:
polaris:
local-ip-address: 192.168.1.1
address: grpc://183.47.111.80:8091
address: grpc://127.0.0.1:8091
namespace: dev
service: TestApp
enabled: true

@ -30,8 +30,8 @@ import com.tencent.cloud.rpc.enhancement.feign.plugin.reporter.ExceptionPolarisR
import com.tencent.cloud.rpc.enhancement.feign.plugin.reporter.SuccessPolarisReporter;
import com.tencent.cloud.rpc.enhancement.resttemplate.BlockingLoadBalancerClientAspect;
import com.tencent.cloud.rpc.enhancement.resttemplate.EnhancedRestTemplateReporter;
import com.tencent.cloud.rpc.enhancement.scg.EnhancedPolarisHttpHeadersFilter;
import com.tencent.cloud.rpc.enhancement.scg.EnhancedPolarisHttpClientCustomizer;
import com.tencent.cloud.rpc.enhancement.scg.EnhancedPolarisHttpHeadersFilter;
import com.tencent.cloud.rpc.enhancement.webclient.EnhancedWebClientReporter;
import com.tencent.polaris.api.core.ConsumerAPI;
import com.tencent.polaris.client.api.SDKContext;
@ -172,11 +172,13 @@ public class RpcEnhancementAutoConfiguration {
protected static class PolarisGatewayAutoConfiguration {
@Bean
@ConditionalOnClass(name = {"org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter"})
public HttpHeadersFilter enhancedPolarisHttpHeadersFilter() {
return new EnhancedPolarisHttpHeadersFilter();
}
@Bean
@ConditionalOnClass(name = {"org.springframework.cloud.gateway.config.HttpClientCustomizer"})
public HttpClientCustomizer httpClientCustomizer(
RpcEnhancementReporterProperties properties, SDKContext context, ConsumerAPI consumerAPI) {
return new EnhancedPolarisHttpClientCustomizer(properties, context, consumerAPI);

@ -88,12 +88,13 @@ public class ExceptionPolarisReporter extends AbstractPolarisReporterAdapter imp
}
LOG.debug("Will report result of {}. Request=[{} {}]. Response=[{}]. Delay=[{}]ms.", retStatus.name(), request.httpMethod()
.name(), request.url(), response.status(), delay);
ServiceCallResult resultRequest = ReporterUtils.createServiceCallResult(this.context, request, response, delay, retStatus);
HttpHeaders headers = new HttpHeaders();
response.headers().forEach((s, strings) -> headers.addAll(s, new ArrayList<>(strings)));
resultRequest.setRetStatus(getRetStatusFromRequest(headers, resultRequest.getRetStatus()));
resultRequest.setRuleName(getActiveRuleNameFromRequest(headers));
ServiceCallResult resultRequest = ReporterUtils.createServiceCallResult(this.context, request, response,
delay, retStatus, serviceCallResult -> {
HttpHeaders headers = new HttpHeaders();
response.headers().forEach((s, strings) -> headers.addAll(s, new ArrayList<>(strings)));
serviceCallResult.setRetStatus(getRetStatusFromRequest(headers, serviceCallResult.getRetStatus()));
serviceCallResult.setRuleName(getActiveRuleNameFromRequest(headers));
});
consumerAPI.updateServiceCallResult(resultRequest);
}
}

@ -22,6 +22,7 @@ import java.net.URI;
import java.net.URLDecoder;
import java.util.Collection;
import java.util.Objects;
import java.util.function.Consumer;
import com.tencent.cloud.common.constant.RouterConstant;
import com.tencent.cloud.common.metadata.MetadataContext;
@ -52,7 +53,8 @@ public final class ReporterUtils {
private ReporterUtils() {
}
public static ServiceCallResult createServiceCallResult(final SDKContext context, final Request request, final Response response, long delay, RetStatus retStatus) {
public static ServiceCallResult createServiceCallResult(final SDKContext context, final Request request,
final Response response, long delay, RetStatus retStatus, final Consumer<ServiceCallResult> consumer) {
ServiceCallResult resultRequest = new ServiceCallResult();
resultRequest.setNamespace(MetadataContext.LOCAL_NAMESPACE);
@ -86,7 +88,7 @@ public final class ReporterUtils {
resultRequest.setHost(uri.getHost());
// -1 means access directly by url, and use http default port number 80
resultRequest.setPort(uri.getPort() == -1 ? 80 : uri.getPort());
consumer.accept(resultRequest);
return resultRequest;
}

@ -82,11 +82,13 @@ public class SuccessPolarisReporter extends AbstractPolarisReporterAdapter imple
}
LOG.debug("Will report result of {}. Request=[{} {}]. Response=[{}]. Delay=[{}]ms.", retStatus.name(), request.httpMethod()
.name(), request.url(), response.status(), delay);
ServiceCallResult resultRequest = ReporterUtils.createServiceCallResult(this.context, request, response, delay, retStatus);
HttpHeaders headers = new HttpHeaders();
response.headers().forEach((s, strings) -> headers.addAll(s, new ArrayList<>(strings)));
resultRequest.setRetStatus(getRetStatusFromRequest(headers, resultRequest.getRetStatus()));
resultRequest.setRuleName(getActiveRuleNameFromRequest(headers));
ServiceCallResult resultRequest = ReporterUtils.createServiceCallResult(this.context, request, response,
delay, retStatus, serviceCallResult -> {
HttpHeaders headers = new HttpHeaders();
response.headers().forEach((s, strings) -> headers.addAll(s, new ArrayList<>(strings)));
serviceCallResult.setRetStatus(getRetStatusFromRequest(headers, serviceCallResult.getRetStatus()));
serviceCallResult.setRuleName(getActiveRuleNameFromRequest(headers));
});
consumerAPI.updateServiceCallResult(resultRequest);
}
}

@ -50,7 +50,7 @@ public class RpcEnhancementAutoConfigurationTest {
RpcEnhancementAutoConfiguration.class,
PolarisRestTemplateAutoConfigurationTester.class,
FeignLoadBalancerAutoConfiguration.class))
.withPropertyValues("spring.cloud.polaris.circuitbreaker.enabled=true", "spring.application.name=test");
.withPropertyValues("spring.cloud.polaris.circuitbreaker.enabled=true", "spring.application.name=test", "spring.cloud.gateway.enabled=false");
@Test
public void testDefaultInitialization() {

@ -38,7 +38,10 @@ import static org.springframework.http.HttpStatus.Series.SERVER_ERROR;
* @author Haotian Zhang
*/
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = RpcEnhancementReporterPropertiesTest.TestApplication.class, properties = "spring.application.name=test")
@SpringBootTest(classes = RpcEnhancementReporterPropertiesTest.TestApplication.class, properties = {
"spring.application.name=test",
"spring.cloud.gateway.enabled=false"
})
@ActiveProfiles("test")
public class RpcEnhancementReporterPropertiesTest {

@ -51,7 +51,7 @@ import static org.mockito.Mockito.mock;
*/
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = EnhancedFeignClientTest.TestApplication.class,
properties = {"spring.cloud.polaris.namespace=Test", "spring.cloud.polaris.service=TestApp"})
properties = {"spring.cloud.polaris.namespace=Test", "spring.cloud.polaris.service=TestApp", "spring.cloud.gateway.enabled=false"})
public class EnhancedFeignClientTest {
@Test

@ -18,6 +18,7 @@
package com.tencent.cloud.rpc.enhancement.feign.plugin.reporter;
import java.util.HashMap;
import java.util.function.Consumer;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties;
import com.tencent.cloud.rpc.enhancement.feign.plugin.EnhancedFeignContext;
@ -65,8 +66,9 @@ public class ExceptionPolarisReporterTest {
@BeforeAll
static void beforeAll() {
mockedReporterUtils = Mockito.mockStatic(ReporterUtils.class);
mockedReporterUtils.when(() -> ReporterUtils.createServiceCallResult(any(SDKContext.class), any(Request.class), any(Response.class), anyLong(), any(RetStatus.class)))
.thenReturn(mock(ServiceCallResult.class));
mockedReporterUtils.when(() -> ReporterUtils.createServiceCallResult(any(SDKContext.class), any(Request.class),
any(Response.class), anyLong(), any(RetStatus.class), any(Consumer.class)))
.thenReturn(new ServiceCallResult());
}
@AfterAll

@ -103,7 +103,9 @@ public class ReporterUtilsTest {
Response response = mock(Response.class);
doReturn(502).when(response).status();
ServiceCallResult serviceCallResult = ReporterUtils.createServiceCallResult(mockSDKContext(), request, response, 10L, RetStatus.RetSuccess);
ServiceCallResult serviceCallResult = ReporterUtils.createServiceCallResult(mockSDKContext(), request, response, 10L, RetStatus.RetSuccess, result -> {
});
assertThat(serviceCallResult.getNamespace()).isEqualTo(NAMESPACE_TEST);
assertThat(serviceCallResult.getService()).isEqualTo(SERVICE_PROVIDER);
assertThat(serviceCallResult.getHost()).isEqualTo("1.1.1.1");

@ -18,6 +18,7 @@
package com.tencent.cloud.rpc.enhancement.feign.plugin.reporter;
import java.util.HashMap;
import java.util.function.Consumer;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties;
import com.tencent.cloud.rpc.enhancement.feign.plugin.EnhancedFeignContext;
@ -65,8 +66,9 @@ public class SuccessPolarisReporterTest {
@BeforeAll
static void beforeAll() {
mockedReporterUtils = Mockito.mockStatic(ReporterUtils.class);
mockedReporterUtils.when(() -> ReporterUtils.createServiceCallResult(any(SDKContext.class), any(Request.class), any(Response.class), anyLong(), any(RetStatus.class)))
.thenReturn(mock(ServiceCallResult.class));
mockedReporterUtils.when(() -> ReporterUtils.createServiceCallResult(any(SDKContext.class), any(Request.class),
any(Response.class), anyLong(), any(RetStatus.class), any(Consumer.class)))
.thenReturn(new ServiceCallResult());
}
@AfterAll

@ -40,7 +40,8 @@ public class PolarisStatPropertiesTest {
.withPropertyValues("spring.cloud.polaris.stat.path=/xxx")
.withPropertyValues("spring.cloud.polaris.stat.pushgateway.enabled=true")
.withPropertyValues("spring.cloud.polaris.stat.pushgateway.address=127.0.0.1:9091")
.withPropertyValues("spring.cloud.polaris.stat.pushgateway.push-interval=1000");
.withPropertyValues("spring.cloud.polaris.stat.pushgateway.push-interval=1000")
.withPropertyValues("spring.cloud.gateway.enabled=false");
@Test
public void testDefaultInitialization() {

@ -42,7 +42,8 @@ public class StatConfigModifierTest {
.withPropertyValues("spring.cloud.polaris.stat.host=127.0.0.1")
.withPropertyValues("spring.cloud.polaris.stat.port=20000")
.withPropertyValues("spring.cloud.polaris.stat.path=/xxx")
.withPropertyValues("spring.application.name=test");
.withPropertyValues("spring.application.name=test")
.withPropertyValues("spring.cloud.gateway.enabled=false");
private final ApplicationContextRunner pushContextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(TestApplication.class))
@ -51,13 +52,15 @@ public class StatConfigModifierTest {
.withPropertyValues("spring.cloud.polaris.stat.pushgateway.enabled=true")
.withPropertyValues("spring.cloud.polaris.stat.pushgateway.address=127.0.0.1:9091")
.withPropertyValues("spring.cloud.polaris.stat.pushgateway.push-interval=1000")
.withPropertyValues("spring.application.name=test");
.withPropertyValues("spring.application.name=test")
.withPropertyValues("spring.cloud.gateway.enabled=false");
private final ApplicationContextRunner disabledContextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(TestApplication.class))
.withPropertyValues("spring.cloud.polaris.enabled=true")
.withPropertyValues("spring.cloud.polaris.stat.enabled=false")
.withPropertyValues("spring.application.name=test");
.withPropertyValues("spring.application.name=test")
.withPropertyValues("spring.cloud.gateway.enabled=false");
@Test
void testPull() {

Loading…
Cancel
Save