fix scg start time err

pull/962/head
seanyu 2 years ago
parent 0ea490bd83
commit e931e3a859

@ -77,7 +77,7 @@ public final class PolarisCircuitBreakerUtils {
if (Objects.nonNull(e.getFallbackInfo())) { if (Objects.nonNull(e.getFallbackInfo())) {
result.setRetCode(e.getFallbackInfo().getCode()); result.setRetCode(e.getFallbackInfo().getCode());
} }
consumerAPI.updateServiceCallResult(result); // consumerAPI.updateServiceCallResult(result);
} }
catch (Throwable ex) { catch (Throwable ex) {
LOG.error("[CircuitBreaker] report circuitbreaker call result fail ", ex); LOG.error("[CircuitBreaker] report circuitbreaker call result fail ", ex);

@ -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_CALLEE_INSTANCE_PORT = "internal-callee-instance-port";
public static final String INTERNAL_CALL_START_TIME = "internal-call-start-time";
private HeaderConstant() { private HeaderConstant() {
} }
} }

@ -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.ExceptionPolarisReporter;
import com.tencent.cloud.rpc.enhancement.feign.plugin.reporter.SuccessPolarisReporter; 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.BlockingLoadBalancerClientAspect;
import com.tencent.cloud.rpc.enhancement.scg.RecordRequestStartTimeGlobalFilter;
import com.tencent.cloud.rpc.enhancement.webclient.PolarisLoadBalancerClientRequestTransformer; import com.tencent.cloud.rpc.enhancement.webclient.PolarisLoadBalancerClientRequestTransformer;
import com.tencent.cloud.rpc.enhancement.scg.EnhancedPolarisGatewayReporter; import com.tencent.cloud.rpc.enhancement.scg.EnhancedPolarisGatewayReporter;
import com.tencent.cloud.rpc.enhancement.resttemplate.EnhancedPolarisRestTemplateReporter; import com.tencent.cloud.rpc.enhancement.resttemplate.EnhancedPolarisRestTemplateReporter;
@ -209,5 +210,11 @@ public class RpcEnhancementAutoConfiguration {
return new EnhancedPolarisGatewayReporter(properties, context, consumerAPI, circuitBreakAPI); return new EnhancedPolarisGatewayReporter(properties, context, consumerAPI, circuitBreakAPI);
} }
@Bean
@ConditionalOnClass(name = "org.springframework.cloud.gateway.filter.GlobalFilter")
public RecordRequestStartTimeGlobalFilter recordRequestStartTimeGlobalFilter() {
return new RecordRequestStartTimeGlobalFilter();
}
} }
} }

@ -36,6 +36,7 @@ import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ServerWebExchange; 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; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_LOADBALANCER_RESPONSE_ATTR;
/** /**
@ -70,17 +71,20 @@ public class EnhancedPolarisGatewayReporter extends AbstractPolarisReporterAdapt
if (!reportProperties.isEnabled()) { if (!reportProperties.isEnabled()) {
return chain.filter(exchange); return chain.filter(exchange);
} }
long startTime = System.currentTimeMillis();
return chain.filter(exchange) return chain.filter(exchange)
.doOnSuccess(v -> instrumentResponse(exchange, null, startTime)) .doOnSuccess(v -> instrumentResponse(exchange, null))
.doOnError(t -> instrumentResponse(exchange, t, startTime)); .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(); ServerHttpResponse response = exchange.getResponse();
ServerHttpRequest request = exchange.getRequest(); 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 serviceId = null;
String targetHost = null; String targetHost = null;
Integer targetPort = null; Integer targetPort = null;

@ -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<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
exchange.getAttributes().put(START_TIME, System.currentTimeMillis());
return chain.filter(exchange);
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}
Loading…
Cancel
Save