feat:gateway支持上报调用数据

pull/924/head
chuntaojun 3 years ago
parent 542f6a4c03
commit 45b011948f

@ -9,4 +9,5 @@
- [feature: improve circuit breaker usage.](https://github.com/Tencent/spring-cloud-tencent/pull/913) - [feature: improve circuit breaker usage.](https://github.com/Tencent/spring-cloud-tencent/pull/913)
- [fix:fix nacos and consul registration.](https://github.com/Tencent/spring-cloud-tencent/pull/921) - [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) - [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) - [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)

@ -89,7 +89,7 @@ public final class PolarisCircuitBreakerUtils {
consumerAPI.updateServiceCallResult(result); consumerAPI.updateServiceCallResult(result);
} }
catch (Throwable ex) { catch (Throwable ex) {
LOG.error("[CircuitBreaker]"); LOG.error("[CircuitBreaker] report circuitbreaker call result fail ", ex);
} }
} }

@ -5,7 +5,7 @@ spring:
name: polaris-circuitbreaker-callee-service name: polaris-circuitbreaker-callee-service
cloud: cloud:
polaris: polaris:
address: grpc://127.0.0.1:8091 address: grpc://183.47.111.80:8091
namespace: default namespace: default
enabled: true enabled: true
stat: stat:

@ -5,7 +5,7 @@ spring:
name: polaris-circuitbreaker-feign-example name: polaris-circuitbreaker-feign-example
cloud: cloud:
polaris: polaris:
address: grpc://127.0.0.1:8091 address: grpc://183.47.111.80:8091
namespace: default namespace: default
enabled: true enabled: true
loadbalancer: loadbalancer:

@ -16,7 +16,7 @@ spring:
feature-env: feature-env:
enabled: true enabled: true
polaris: polaris:
address: grpc://127.0.0.1:8091 address: grpc://183.47.111.80:8091
namespace: default namespace: default
enabled: true enabled: true
gateway: gateway:

@ -5,7 +5,7 @@ spring:
name: polaris-circuitbreaker-resttemplate-example name: polaris-circuitbreaker-resttemplate-example
cloud: cloud:
polaris: polaris:
address: grpc://127.0.0.1:8091 address: grpc://183.47.111.80:8091
namespace: default namespace: default
enabled: true enabled: true
loadbalancer: loadbalancer:

@ -5,7 +5,7 @@ spring:
name: polaris-circuitbreaker-webclient-example name: polaris-circuitbreaker-webclient-example
cloud: cloud:
polaris: polaris:
address: grpc://127.0.0.1:8091 address: grpc://183.47.111.80:8091
namespace: default namespace: default
enabled: true enabled: true
loadbalancer: loadbalancer:

@ -10,5 +10,5 @@ spring:
content: content:
env: blue env: blue
polaris: polaris:
address: grpc://127.0.0.1:8091 address: grpc://183.47.111.80:8091
namespace: default namespace: default

@ -10,5 +10,5 @@ spring:
content: content:
env: green env: green
polaris: polaris:
address: grpc://127.0.0.1:8091 address: grpc://183.47.111.80:8091
namespace: default namespace: default

@ -21,7 +21,7 @@ spring:
transitive: transitive:
- a - a
polaris: polaris:
address: grpc://127.0.0.1:8091 address: grpc://183.47.111.80:8091
namespace: default namespace: default
enabled: true enabled: true
gateway: gateway:

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

@ -21,7 +21,7 @@ Incoming requests dispatched from Gateway service to 3 environments:
1. add environment variables 1. add environment variables
- polaris server address: polaris_address=grpc://127.0.0.1:8091 - polaris server address: polaris_address=grpc://183.47.111.80:8091
- pushgateway address: prometheus_address=127.0.0.1:9091 - pushgateway address: prometheus_address=127.0.0.1:9091
2. start router-grayrelease-gateway application 2. start router-grayrelease-gateway application
@ -134,7 +134,7 @@ Incoming requests dispatched from Gateway service to 3 environments:
1. add environment variables 1. add environment variables
- polaris server address: polaris_address=grpc://127.0.0.1:8091 - polaris server address: polaris_address=grpc://183.47.111.80:8091
- pushgateway address: prometheus_address=127.0.0.1:9091 - pushgateway address: prometheus_address=127.0.0.1:9091
- env tag: SCT_METADATA_CONTENT_env=blue - env tag: SCT_METADATA_CONTENT_env=blue
- transitive tag: SCT_METADATA_CONTENT_TRANSITIVE=env - transitive tag: SCT_METADATA_CONTENT_TRANSITIVE=env
@ -148,7 +148,7 @@ Incoming requests dispatched from Gateway service to 3 environments:
1. add environment variables 1. add environment variables
- polaris server address: polaris_address=grpc://127.0.0.1:8091 - polaris server address: polaris_address=grpc://183.47.111.80:8091
- pushgateway address: prometheus_address=127.0.0.1:9091 - pushgateway address: prometheus_address=127.0.0.1:9091
- env tag: SCT_METADATA_CONTENT_env=green - env tag: SCT_METADATA_CONTENT_env=green
- transitive tag: SCT_METADATA_CONTENT_TRANSITIVE=env - transitive tag: SCT_METADATA_CONTENT_TRANSITIVE=env
@ -161,7 +161,7 @@ Incoming requests dispatched from Gateway service to 3 environments:
1. add environment variables 1. add environment variables
- polaris server address: polaris_address=grpc://127.0.0.1:8091 - polaris server address: polaris_address=grpc://183.47.111.80:8091
- pushgateway address: prometheus_address=127.0.0.1:9091 - pushgateway address: prometheus_address=127.0.0.1:9091
- env tag: SCT_METADATA_CONTENT_env=purple - env tag: SCT_METADATA_CONTENT_env=purple
- transitive tag: SCT_METADATA_CONTENT_TRANSITIVE=env - transitive tag: SCT_METADATA_CONTENT_TRANSITIVE=env
@ -180,7 +180,7 @@ You can find the instances with different tags in polaris console.
1. add environment variables 1. add environment variables
- polaris server address: polaris_address=grpc://127.0.0.1:8091 - polaris server address: polaris_address=grpc://183.47.111.80:8091
- pushgateway address: prometheus_address=127.0.0.1:9091 - pushgateway address: prometheus_address=127.0.0.1:9091
- env tag: SCT_METADATA_CONTENT_env=blue - env tag: SCT_METADATA_CONTENT_env=blue
- transitive tag: SCT_METADATA_CONTENT_TRANSITIVE=env - transitive tag: SCT_METADATA_CONTENT_TRANSITIVE=env
@ -194,7 +194,7 @@ You can find the instances with different tags in polaris console.
1. add environment variables 1. add environment variables
- polaris server address: polaris_address=grpc://127.0.0.1:8091 - polaris server address: polaris_address=grpc://183.47.111.80:8091
- pushgateway address: prometheus_address=127.0.0.1:9091 - pushgateway address: prometheus_address=127.0.0.1:9091
- env tag: SCT_METADATA_CONTENT_env=purple - env tag: SCT_METADATA_CONTENT_env=purple
- transitive tag: SCT_METADATA_CONTENT_TRANSITIVE=env - transitive tag: SCT_METADATA_CONTENT_TRANSITIVE=env
@ -207,7 +207,7 @@ You can find the instances with different tags in polaris console.
1. add environment variables 1. add environment variables
- polaris server address: polaris_address=grpc://127.0.0.1:8091 - polaris server address: polaris_address=grpc://183.47.111.80:8091
- pushgateway address: prometheus_address=127.0.0.1:9091 - pushgateway address: prometheus_address=127.0.0.1:9091
- env tag: SCT_METADATA_CONTENT_env=blue - env tag: SCT_METADATA_CONTENT_env=blue
- transitive tag: SCT_METADATA_CONTENT_TRANSITIVE=env - transitive tag: SCT_METADATA_CONTENT_TRANSITIVE=env
@ -221,7 +221,7 @@ You can find the instances with different tags in polaris console.
1. add environment variables 1. add environment variables
- polaris server address: polaris_address=grpc://127.0.0.1:8091 - polaris server address: polaris_address=grpc://183.47.111.80:8091
- pushgateway address: prometheus_address=127.0.0.1:9091 - pushgateway address: prometheus_address=127.0.0.1:9091
- env tag: SCT_METADATA_CONTENT_env=green - env tag: SCT_METADATA_CONTENT_env=green
- transitive tag: SCT_METADATA_CONTENT_TRANSITIVE=env - transitive tag: SCT_METADATA_CONTENT_TRANSITIVE=env

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

@ -19,13 +19,18 @@ package com.tencent.cloud.rpc.enhancement;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import com.tencent.cloud.common.constant.HeaderConstant;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties; import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties;
import com.tencent.polaris.api.pojo.RetStatus;
import com.tencent.polaris.api.utils.CollectionUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
@ -76,6 +81,12 @@ public abstract class AbstractPolarisReporterAdapter {
return new ArrayList<>(Arrays.asList(items)); return new ArrayList<>(Arrays.asList(items));
} }
public static String convertLabel(String label) {
label = label.replaceAll("\"|\\{|\\}", "")
.replaceAll(",", "|");
return label;
}
/** /**
* Callback after completion of request processing, Check if business meltdown reporting is required. * Callback after completion of request processing, Check if business meltdown reporting is required.
* *
@ -117,9 +128,30 @@ public abstract class AbstractPolarisReporterAdapter {
return false; return false;
} }
public static String convertLabel(String label) { protected RetStatus getRetStatusFromRequest(HttpHeaders headers, RetStatus defaultVal) {
label = label.replaceAll("\"|\\{|\\}", "") if (headers.containsKey(HeaderConstant.INTERNAL_CALLEE_RET_STATUS)) {
.replaceAll(",", "|"); List<String> values = headers.get(HeaderConstant.INTERNAL_CALLEE_RET_STATUS);
return label; if (CollectionUtils.isNotEmpty(values)) {
String retStatusVal = com.tencent.polaris.api.utils.StringUtils.defaultString(values.get(0));
if (Objects.equals(retStatusVal, RetStatus.RetFlowControl.getDesc())) {
return RetStatus.RetFlowControl;
}
if (Objects.equals(retStatusVal, RetStatus.RetReject.getDesc())) {
return RetStatus.RetReject;
}
}
}
return defaultVal;
}
protected String getActiveRuleNameFromRequest(HttpHeaders headers) {
if (headers.containsKey(HeaderConstant.INTERNAL_ACTIVE_RULE_NAME)) {
Collection<String> values = headers.get(HeaderConstant.INTERNAL_ACTIVE_RULE_NAME);
if (CollectionUtils.isNotEmpty(values)) {
String val = com.tencent.polaris.api.utils.StringUtils.defaultString(new ArrayList<>(values).get(0));
return val;
}
}
return "";
} }
} }

@ -18,7 +18,9 @@
package com.tencent.cloud.rpc.enhancement.feign.plugin.reporter; package com.tencent.cloud.rpc.enhancement.feign.plugin.reporter;
import java.net.SocketTimeoutException; import java.net.SocketTimeoutException;
import java.util.ArrayList;
import com.tencent.cloud.rpc.enhancement.AbstractPolarisReporterAdapter;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties; import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties;
import com.tencent.cloud.rpc.enhancement.feign.plugin.EnhancedFeignContext; import com.tencent.cloud.rpc.enhancement.feign.plugin.EnhancedFeignContext;
import com.tencent.cloud.rpc.enhancement.feign.plugin.EnhancedFeignPlugin; import com.tencent.cloud.rpc.enhancement.feign.plugin.EnhancedFeignPlugin;
@ -33,13 +35,14 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
/** /**
* Polaris reporter when feign call fails. * Polaris reporter when feign call fails.
* *
* @author Haotian Zhang * @author Haotian Zhang
*/ */
public class ExceptionPolarisReporter implements EnhancedFeignPlugin { public class ExceptionPolarisReporter extends AbstractPolarisReporterAdapter implements EnhancedFeignPlugin {
private static final Logger LOG = LoggerFactory.getLogger(ExceptionPolarisReporter.class); private static final Logger LOG = LoggerFactory.getLogger(ExceptionPolarisReporter.class);
private final RpcEnhancementReporterProperties reporterProperties; private final RpcEnhancementReporterProperties reporterProperties;
@ -48,9 +51,11 @@ public class ExceptionPolarisReporter implements EnhancedFeignPlugin {
private final SDKContext context; private final SDKContext context;
public ExceptionPolarisReporter(RpcEnhancementReporterProperties reporterProperties, public ExceptionPolarisReporter(RpcEnhancementReporterProperties reporterProperties,
SDKContext context, SDKContext context,
ConsumerAPI consumerAPI) { ConsumerAPI consumerAPI) {
super(reporterProperties);
this.reporterProperties = reporterProperties; this.reporterProperties = reporterProperties;
this.context = context; this.context = context;
this.consumerAPI = consumerAPI; this.consumerAPI = consumerAPI;
@ -84,6 +89,11 @@ public class ExceptionPolarisReporter implements EnhancedFeignPlugin {
LOG.debug("Will report result of {}. Request=[{} {}]. Response=[{}]. Delay=[{}]ms.", retStatus.name(), request.httpMethod() LOG.debug("Will report result of {}. Request=[{} {}]. Response=[{}]. Delay=[{}]ms.", retStatus.name(), request.httpMethod()
.name(), request.url(), response.status(), delay); .name(), request.url(), response.status(), delay);
ServiceCallResult resultRequest = ReporterUtils.createServiceCallResult(this.context, request, response, delay, retStatus); 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));
consumerAPI.updateServiceCallResult(resultRequest); consumerAPI.updateServiceCallResult(resultRequest);
} }
} }

@ -20,11 +20,9 @@ package com.tencent.cloud.rpc.enhancement.feign.plugin.reporter;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.URI; import java.net.URI;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Objects; import java.util.Objects;
import com.tencent.cloud.common.constant.HeaderConstant;
import com.tencent.cloud.common.constant.RouterConstant; import com.tencent.cloud.common.constant.RouterConstant;
import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContext;
import com.tencent.cloud.rpc.enhancement.AbstractPolarisReporterAdapter; import com.tencent.cloud.rpc.enhancement.AbstractPolarisReporterAdapter;
@ -75,7 +73,7 @@ public final class ReporterUtils {
URI uri = URI.create(request.url()); URI uri = URI.create(request.url());
resultRequest.setMethod(uri.getPath()); resultRequest.setMethod(uri.getPath());
resultRequest.setRetCode(response.status()); resultRequest.setRetCode(response.status());
resultRequest.setRetStatus(getRetStatusFromRequest(response, retStatus)); resultRequest.setRetStatus(retStatus);
resultRequest.setDelay(delay); resultRequest.setDelay(delay);
String sourceNamespace = MetadataContext.LOCAL_NAMESPACE; String sourceNamespace = MetadataContext.LOCAL_NAMESPACE;
String sourceService = MetadataContext.LOCAL_SERVICE; String sourceService = MetadataContext.LOCAL_SERVICE;
@ -85,10 +83,6 @@ public final class ReporterUtils {
if (Objects.nonNull(context)) { if (Objects.nonNull(context)) {
resultRequest.setCallerIp(context.getConfig().getGlobal().getAPI().getBindIP()); resultRequest.setCallerIp(context.getConfig().getGlobal().getAPI().getBindIP());
} }
String ruleName = getActiveRuleNameFromRequest(response);
if (StringUtils.isNotBlank(ruleName)) {
resultRequest.setRuleName(ruleName);
}
resultRequest.setHost(uri.getHost()); resultRequest.setHost(uri.getHost());
// -1 means access directly by url, and use http default port number 80 // -1 means access directly by url, and use http default port number 80
resultRequest.setPort(uri.getPort() == -1 ? 80 : uri.getPort()); resultRequest.setPort(uri.getPort() == -1 ? 80 : uri.getPort());
@ -96,30 +90,4 @@ public final class ReporterUtils {
return resultRequest; return resultRequest;
} }
private static RetStatus getRetStatusFromRequest(Response response, RetStatus defaultVal) {
if (response.headers().containsKey(HeaderConstant.INTERNAL_CALLEE_RET_STATUS)) {
Collection<String> values = response.headers().get(HeaderConstant.INTERNAL_CALLEE_RET_STATUS);
if (CollectionUtils.isNotEmpty(values)) {
String retStatusVal = com.tencent.polaris.api.utils.StringUtils.defaultString(new ArrayList<>(values).get(0));
if (Objects.equals(retStatusVal, RetStatus.RetFlowControl.getDesc())) {
return RetStatus.RetFlowControl;
}
if (Objects.equals(retStatusVal, RetStatus.RetReject.getDesc())) {
return RetStatus.RetReject;
}
}
}
return defaultVal;
}
private static String getActiveRuleNameFromRequest(Response response) {
if (response.headers().containsKey(HeaderConstant.INTERNAL_ACTIVE_RULE_NAME)) {
Collection<String> values = response.headers().get(HeaderConstant.INTERNAL_ACTIVE_RULE_NAME);
if (CollectionUtils.isNotEmpty(values)) {
String val = com.tencent.polaris.api.utils.StringUtils.defaultString(new ArrayList<>(values).get(0));
return val;
}
}
return "";
}
} }

@ -17,6 +17,8 @@
package com.tencent.cloud.rpc.enhancement.feign.plugin.reporter; package com.tencent.cloud.rpc.enhancement.feign.plugin.reporter;
import java.util.ArrayList;
import com.tencent.cloud.rpc.enhancement.AbstractPolarisReporterAdapter; import com.tencent.cloud.rpc.enhancement.AbstractPolarisReporterAdapter;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties; import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties;
import com.tencent.cloud.rpc.enhancement.feign.plugin.EnhancedFeignContext; import com.tencent.cloud.rpc.enhancement.feign.plugin.EnhancedFeignContext;
@ -32,6 +34,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
/** /**
@ -80,6 +83,10 @@ public class SuccessPolarisReporter extends AbstractPolarisReporterAdapter imple
LOG.debug("Will report result of {}. Request=[{} {}]. Response=[{}]. Delay=[{}]ms.", retStatus.name(), request.httpMethod() LOG.debug("Will report result of {}. Request=[{} {}]. Response=[{}]. Delay=[{}]ms.", retStatus.name(), request.httpMethod()
.name(), request.url(), response.status(), delay); .name(), request.url(), response.status(), delay);
ServiceCallResult resultRequest = ReporterUtils.createServiceCallResult(this.context, request, response, delay, retStatus); 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));
consumerAPI.updateServiceCallResult(resultRequest); consumerAPI.updateServiceCallResult(resultRequest);
} }
} }

@ -21,13 +21,10 @@ import java.io.IOException;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.URI; import java.net.URI;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import com.tencent.cloud.common.constant.HeaderConstant;
import com.tencent.cloud.common.constant.RouterConstant; import com.tencent.cloud.common.constant.RouterConstant;
import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContext;
import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.metadata.MetadataContextHolder;
@ -156,8 +153,8 @@ public class EnhancedRestTemplateReporter extends AbstractPolarisReporterAdapter
if (apply(response.getStatusCode())) { if (apply(response.getStatusCode())) {
resultRequest.setRetStatus(RetStatus.RetFail); resultRequest.setRetStatus(RetStatus.RetFail);
} }
resultRequest.setRetStatus(getRetStatusFromRequest(response, resultRequest.getRetStatus())); resultRequest.setRetStatus(getRetStatusFromRequest(response.getHeaders(), resultRequest.getRetStatus()));
resultRequest.setRuleName(getActiveRuleNameFromRequest(response)); resultRequest.setRuleName(getActiveRuleNameFromRequest(response.getHeaders()));
if (Objects.nonNull(context)) { if (Objects.nonNull(context)) {
resultRequest.setCallerIp(context.getConfig().getGlobal().getAPI().getBindIP()); resultRequest.setCallerIp(context.getConfig().getGlobal().getAPI().getBindIP());
} }
@ -234,30 +231,4 @@ public class EnhancedRestTemplateReporter extends AbstractPolarisReporterAdapter
this.delegateHandler = delegateHandler; this.delegateHandler = delegateHandler;
} }
private static RetStatus getRetStatusFromRequest(ClientHttpResponse response, RetStatus defaultVal) {
if (response.getHeaders().containsKey(HeaderConstant.INTERNAL_CALLEE_RET_STATUS)) {
List<String> values = response.getHeaders().get(HeaderConstant.INTERNAL_CALLEE_RET_STATUS);
if (CollectionUtils.isNotEmpty(values)) {
String retStatusVal = com.tencent.polaris.api.utils.StringUtils.defaultString(values.get(0));
if (Objects.equals(retStatusVal, RetStatus.RetFlowControl.getDesc())) {
return RetStatus.RetFlowControl;
}
if (Objects.equals(retStatusVal, RetStatus.RetReject.getDesc())) {
return RetStatus.RetReject;
}
}
}
return defaultVal;
}
private static String getActiveRuleNameFromRequest(ClientHttpResponse response) {
if (response.getHeaders().containsKey(HeaderConstant.INTERNAL_ACTIVE_RULE_NAME)) {
Collection<String> values = response.getHeaders().get(HeaderConstant.INTERNAL_ACTIVE_RULE_NAME);
if (CollectionUtils.isNotEmpty(values)) {
String val = com.tencent.polaris.api.utils.StringUtils.defaultString(new ArrayList<>(values).get(0));
return val;
}
}
return "";
}
} }

@ -71,7 +71,10 @@ public class EnhancedPolarisHttpClient extends HttpClient {
.code()))) { .code()))) {
status = RetStatus.RetFail; status = RetStatus.RetFail;
} }
status = getRetStatusFromRequest(responseHeaders, status); org.springframework.http.HttpHeaders headers = new org.springframework.http.HttpHeaders();
responseHeaders.forEach(entry -> headers.add(entry.getKey(), entry.getValue()));
status = adapter.getRetStatusFromRequest(headers, status);
result.setRuleName(adapter.getActiveRuleNameFromRequest(headers));
} }
else { else {
if (throwable instanceof SocketTimeoutException) { if (throwable instanceof SocketTimeoutException) {
@ -80,7 +83,6 @@ public class EnhancedPolarisHttpClient extends HttpClient {
} }
result.setMethod(httpClientResponse.uri()); result.setMethod(httpClientResponse.uri());
result.setRetCode(httpClientResponse.status().code()); result.setRetCode(httpClientResponse.status().code());
result.setRuleName(getActiveRuleNameFromRequest(responseHeaders));
result.setRetStatus(status); result.setRetStatus(status);
if (Objects.nonNull(context)) { if (Objects.nonNull(context)) {
result.setCallerIp(context.getConfig().getGlobal().getAPI().getBindIP()); result.setCallerIp(context.getConfig().getGlobal().getAPI().getBindIP());
@ -103,27 +105,6 @@ public class EnhancedPolarisHttpClient extends HttpClient {
this.registerReportHandler(); this.registerReportHandler();
} }
private static RetStatus getRetStatusFromRequest(HttpHeaders headers, RetStatus defaultVal) {
if (headers.contains(HeaderConstant.INTERNAL_CALLEE_RET_STATUS)) {
String retStatusVal = headers.get(HeaderConstant.INTERNAL_CALLEE_RET_STATUS);
if (Objects.equals(retStatusVal, RetStatus.RetFlowControl.getDesc())) {
return RetStatus.RetFlowControl;
}
if (Objects.equals(retStatusVal, RetStatus.RetReject.getDesc())) {
return RetStatus.RetReject;
}
}
return defaultVal;
}
private static String getActiveRuleNameFromRequest(HttpHeaders headers) {
if (headers.contains(HeaderConstant.INTERNAL_ACTIVE_RULE_NAME)) {
String val = headers.get(HeaderConstant.INTERNAL_ACTIVE_RULE_NAME);
return val;
}
return "";
}
@Override @Override
public HttpClientConfig configuration() { public HttpClientConfig configuration() {
return target.configuration(); return target.configuration();
@ -173,6 +154,16 @@ public class EnhancedPolarisHttpClient extends HttpClient {
public boolean apply(HttpStatus httpStatus) { public boolean apply(HttpStatus httpStatus) {
return super.apply(httpStatus); return super.apply(httpStatus);
} }
@Override
public RetStatus getRetStatusFromRequest(org.springframework.http.HttpHeaders headers, RetStatus defaultVal) {
return super.getRetStatusFromRequest(headers, defaultVal);
}
@Override
public String getActiveRuleNameFromRequest(org.springframework.http.HttpHeaders headers) {
return super.getActiveRuleNameFromRequest(headers);
}
} }
} }

@ -22,7 +22,6 @@ import java.net.SocketTimeoutException;
import java.net.URI; import java.net.URI;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import java.util.Objects; import java.util.Objects;
import com.tencent.cloud.common.constant.HeaderConstant; import com.tencent.cloud.common.constant.HeaderConstant;
@ -69,35 +68,6 @@ public class EnhancedWebClientReporter extends AbstractPolarisReporterAdapter im
this.consumerAPI = consumerAPI; this.consumerAPI = consumerAPI;
} }
private static RetStatus getRetStatusFromRequest(ClientResponse response, RetStatus defaultVal) {
HttpHeaders headers = response.headers().asHttpHeaders();
if (headers.containsKey(HeaderConstant.INTERNAL_CALLEE_RET_STATUS)) {
List<String> values = headers.get(HeaderConstant.INTERNAL_CALLEE_RET_STATUS);
if (CollectionUtils.isNotEmpty(values)) {
String retStatusVal = com.tencent.polaris.api.utils.StringUtils.defaultString(values.get(0));
if (Objects.equals(retStatusVal, RetStatus.RetFlowControl.getDesc())) {
return RetStatus.RetFlowControl;
}
if (Objects.equals(retStatusVal, RetStatus.RetReject.getDesc())) {
return RetStatus.RetReject;
}
}
}
return defaultVal;
}
private static String getActiveRuleNameFromRequest(ClientResponse response) {
HttpHeaders headers = response.headers().asHttpHeaders();
if (headers.containsKey(HeaderConstant.INTERNAL_ACTIVE_RULE_NAME)) {
List<String> values = headers.get(HeaderConstant.INTERNAL_ACTIVE_RULE_NAME);
if (CollectionUtils.isNotEmpty(values)) {
String val = com.tencent.polaris.api.utils.StringUtils.defaultString(values.get(0));
return val;
}
}
return "";
}
@Override @Override
public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) { public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) {
return next.exchange(request).as((responseMono) -> instrumentResponse(request, responseMono)) return next.exchange(request).as((responseMono) -> instrumentResponse(request, responseMono))
@ -144,11 +114,13 @@ public class EnhancedWebClientReporter extends AbstractPolarisReporterAdapter im
RetStatus retStatus = RetStatus.RetSuccess; RetStatus retStatus = RetStatus.RetSuccess;
ClientResponse response = signal.get(); ClientResponse response = signal.get();
if (Objects.nonNull(response)) { if (Objects.nonNull(response)) {
callResult.setRuleName(getActiveRuleNameFromRequest(response)); HttpHeaders headers = response.headers().asHttpHeaders();
callResult.setRuleName(getActiveRuleNameFromRequest(headers));
if (apply(response.statusCode())) { if (apply(response.statusCode())) {
retStatus = RetStatus.RetFail; retStatus = RetStatus.RetFail;
} }
retStatus = getRetStatusFromRequest(response, retStatus); retStatus = getRetStatusFromRequest(headers, retStatus);
} }
if (signal.isOnError()) { if (signal.isOnError()) {
Throwable throwable = signal.getThrowable(); Throwable throwable = signal.getThrowable();

Loading…
Cancel
Save