From 7ad631d32d943122c8300f4345b2b4f61415369f Mon Sep 17 00:00:00 2001 From: Haotian Zhang Date: Fri, 26 Apr 2024 12:48:06 +0800 Subject: [PATCH] fix:fix wrong report when using Zuul with instance not found exception. (#1283) --- CHANGELOG.md | 1 + .../reporter/SuccessPolarisReporter.java | 7 +++ .../zuul/EnhancedErrorZuulFilter.java | 57 +++++++++++++------ 3 files changed, 47 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa0568c3..d0f43caa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,3 +8,4 @@ - [feat: lane router rule support caller ip](https://github.com/Tencent/spring-cloud-tencent/pull/1253) - [feat:add polaris ThreadLocal plugin.](https://github.com/Tencent/spring-cloud-tencent/pull/1255) - [feat:upgrade jackson version.](https://github.com/Tencent/spring-cloud-tencent/pull/1257) +- [fix:fix wrong report when using Zuul with instance not found exception.](https://github.com/Tencent/spring-cloud-tencent/pull/1283) diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/reporter/SuccessPolarisReporter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/reporter/SuccessPolarisReporter.java index d4c7d6a1..96d37fe1 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/reporter/SuccessPolarisReporter.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/reporter/SuccessPolarisReporter.java @@ -71,6 +71,13 @@ public class SuccessPolarisReporter implements EnhancedPlugin { return; } + if (context.getThrowable() != null) { + if (LOG.isDebugEnabled()) { + LOG.debug("Success report with throwable. Don't report. {}", context, context.getThrowable()); + } + return; + } + EnhancedRequestContext request = context.getRequest(); EnhancedResponseContext response = context.getResponse(); ServiceInstance callerServiceInstance = Optional.ofNullable(context.getLocalServiceInstance()).orElse(new DefaultServiceInstance()); diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/zuul/EnhancedErrorZuulFilter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/zuul/EnhancedErrorZuulFilter.java index ed981432..d858261d 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/zuul/EnhancedErrorZuulFilter.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/zuul/EnhancedErrorZuulFilter.java @@ -20,6 +20,7 @@ package com.tencent.cloud.rpc.enhancement.zuul; import java.util.ArrayList; import java.util.Collection; +import com.netflix.client.ClientException; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; @@ -30,6 +31,7 @@ import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedResponseContext; +import org.springframework.cloud.netflix.zuul.util.ZuulRuntimeException; import org.springframework.core.env.Environment; import org.springframework.http.HttpHeaders; import org.springframework.util.StringUtils; @@ -86,26 +88,45 @@ public class EnhancedErrorZuulFilter extends ZuulFilter { Object startTimeMilliObject = context.get(POLARIS_PRE_ROUTE_TIME); Throwable throwable = context.getThrowable(); if (throwable != null && startTimeMilliObject != null && startTimeMilliObject instanceof Long) { - HttpHeaders responseHeaders = new HttpHeaders(); - Collection names = context.getResponse().getHeaderNames(); - for (String name : names) { - responseHeaders.put(name, new ArrayList<>(context.getResponse().getHeaders(name))); + if (checkNoInstanceException(throwable)) { + enhancedPluginContext.setThrowable(throwable); + } + else { + HttpHeaders responseHeaders = new HttpHeaders(); + Collection names = context.getResponse().getHeaderNames(); + for (String name : names) { + responseHeaders.put(name, new ArrayList<>(context.getResponse().getHeaders(name))); + } + EnhancedResponseContext enhancedResponseContext = EnhancedResponseContext.builder() + .httpStatus(context.getResponse().getStatus()) + .httpHeaders(responseHeaders) + .build(); + enhancedPluginContext.setResponse(enhancedResponseContext); + Long startTimeMilli = (Long) startTimeMilliObject; + enhancedPluginContext.setDelay(System.currentTimeMillis() - startTimeMilli); + enhancedPluginContext.setThrowable(throwable); + + // Run post enhanced plugins. + pluginRunner.run(EnhancedPluginType.Client.EXCEPTION, enhancedPluginContext); + + // Run finally enhanced plugins. + pluginRunner.run(EnhancedPluginType.Client.FINALLY, enhancedPluginContext); } - EnhancedResponseContext enhancedResponseContext = EnhancedResponseContext.builder() - .httpStatus(context.getResponse().getStatus()) - .httpHeaders(responseHeaders) - .build(); - enhancedPluginContext.setResponse(enhancedResponseContext); - Long startTimeMilli = (Long) startTimeMilliObject; - enhancedPluginContext.setDelay(System.currentTimeMillis() - startTimeMilli); - enhancedPluginContext.setThrowable(throwable); - - // Run post enhanced plugins. - pluginRunner.run(EnhancedPluginType.Client.EXCEPTION, enhancedPluginContext); - - // Run finally enhanced plugins. - pluginRunner.run(EnhancedPluginType.Client.FINALLY, enhancedPluginContext); } return null; } + + protected boolean checkNoInstanceException(Throwable throwable) { + if (throwable.getCause() instanceof ZuulRuntimeException) { + Throwable cause = null; + if (throwable.getCause().getCause() != null) { + cause = throwable.getCause().getCause().getCause(); + } + if (cause instanceof ClientException && StringUtils.hasText(cause.getMessage()) && + cause.getMessage().contains("Load balancer does not have available server for client")) { + return true; + } + } + return false; + } }