diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/util/PolarisCircuitBreakerUtils.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/util/PolarisCircuitBreakerUtils.java index 961c30802..d99b30448 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/util/PolarisCircuitBreakerUtils.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/util/PolarisCircuitBreakerUtils.java @@ -77,7 +77,7 @@ public final class PolarisCircuitBreakerUtils { if (Objects.nonNull(e.getFallbackInfo())) { result.setRetCode(e.getFallbackInfo().getCode()); } - consumerAPI.updateServiceCallResult(result); +// consumerAPI.updateServiceCallResult(result); } catch (Throwable ex) { LOG.error("[CircuitBreaker] report circuitbreaker call result fail ", ex); diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/HeaderConstant.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/HeaderConstant.java index 0f8b96e03..feffd0f49 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/HeaderConstant.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/HeaderConstant.java @@ -47,8 +47,6 @@ public final class HeaderConstant { */ public static final String INTERNAL_CALLEE_INSTANCE_PORT = "internal-callee-instance-port"; - public static final String INTERNAL_CALL_START_TIME = "internal-call-start-time"; - private HeaderConstant() { } } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementAutoConfiguration.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementAutoConfiguration.java index 304e86a76..0d751299e 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementAutoConfiguration.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementAutoConfiguration.java @@ -29,6 +29,7 @@ import com.tencent.cloud.rpc.enhancement.feign.plugin.EnhancedFeignPlugin; import com.tencent.cloud.rpc.enhancement.feign.plugin.reporter.ExceptionPolarisReporter; import com.tencent.cloud.rpc.enhancement.feign.plugin.reporter.SuccessPolarisReporter; import com.tencent.cloud.rpc.enhancement.resttemplate.BlockingLoadBalancerClientAspect; +import com.tencent.cloud.rpc.enhancement.scg.RecordRequestStartTimeGlobalFilter; import com.tencent.cloud.rpc.enhancement.webclient.PolarisLoadBalancerClientRequestTransformer; import com.tencent.cloud.rpc.enhancement.scg.EnhancedPolarisGatewayReporter; import com.tencent.cloud.rpc.enhancement.resttemplate.EnhancedPolarisRestTemplateReporter; @@ -209,5 +210,11 @@ public class RpcEnhancementAutoConfiguration { return new EnhancedPolarisGatewayReporter(properties, context, consumerAPI, circuitBreakAPI); } + @Bean + @ConditionalOnClass(name = "org.springframework.cloud.gateway.filter.GlobalFilter") + public RecordRequestStartTimeGlobalFilter recordRequestStartTimeGlobalFilter() { + return new RecordRequestStartTimeGlobalFilter(); + } + } } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/scg/EnhancedPolarisGatewayReporter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/scg/EnhancedPolarisGatewayReporter.java index b00077c0c..d81ef34b6 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/scg/EnhancedPolarisGatewayReporter.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/scg/EnhancedPolarisGatewayReporter.java @@ -36,6 +36,7 @@ import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.web.server.ServerWebExchange; +import static com.tencent.cloud.rpc.enhancement.scg.RecordRequestStartTimeGlobalFilter.START_TIME; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_LOADBALANCER_RESPONSE_ATTR; /** @@ -70,17 +71,20 @@ public class EnhancedPolarisGatewayReporter extends AbstractPolarisReporterAdapt if (!reportProperties.isEnabled()) { return chain.filter(exchange); } - long startTime = System.currentTimeMillis(); return chain.filter(exchange) - .doOnSuccess(v -> instrumentResponse(exchange, null, startTime)) - .doOnError(t -> instrumentResponse(exchange, t, startTime)); + .doOnSuccess(v -> instrumentResponse(exchange, null)) + .doOnError(t -> instrumentResponse(exchange, t)); } - private void instrumentResponse(ServerWebExchange exchange, Throwable t, long startTime) { + private void instrumentResponse(ServerWebExchange exchange, Throwable t) { ServerHttpResponse response = exchange.getResponse(); ServerHttpRequest request = exchange.getRequest(); - long delay = System.currentTimeMillis() - startTime; + long delay = 0L; + Long startTime = exchange.getAttribute(START_TIME); + if (startTime != null) { + delay = System.currentTimeMillis() - startTime; + } String serviceId = null; String targetHost = null; Integer targetPort = null; diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/scg/RecordRequestStartTimeGlobalFilter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/scg/RecordRequestStartTimeGlobalFilter.java new file mode 100644 index 000000000..9db3a4c07 --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/scg/RecordRequestStartTimeGlobalFilter.java @@ -0,0 +1,46 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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. + */ + +package com.tencent.cloud.rpc.enhancement.scg; + +import reactor.core.publisher.Mono; + +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.Ordered; +import org.springframework.web.server.ServerWebExchange; + +/** + * RecordRequestStartTimeGlobalFilter. + * + * @author sean yu + */ +public class RecordRequestStartTimeGlobalFilter implements GlobalFilter, Ordered { + + public static final String START_TIME = "START_TIME"; + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + exchange.getAttributes().put(START_TIME, System.currentTimeMillis()); + return chain.filter(exchange); + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE; + } +}