From c53a3ce23ea7d97f64fd04781a0b38e1377f0c9c Mon Sep 17 00:00:00 2001
From: lepdou <ledouzhang@tencent.com>
Date: Wed, 31 Aug 2022 15:59:46 +0800
Subject: [PATCH] add switch for report call result and default false (#549)

---
 CHANGELOG.md                                     |  1 +
 .../PolarisCircuitBreakerAutoConfiguration.java  | 16 ++++++++++++++--
 ...larisCircuitBreakerAutoConfigurationTest.java | 10 +++++++++-
 ...CircuitBreakerBootstrapConfigurationTest.java |  9 ++++++++-
 .../config/RpcEnhancementAutoConfiguration.java  |  4 ++--
 .../RpcEnhancementBootstrapConfiguration.java    | 15 +++++++++++++++
 .../config/RpcEnhancementReporterProperties.java | 13 +++++++++++++
 .../reporter/ExceptionPolarisReporter.java       | 11 +++++++++++
 .../plugin/reporter/SuccessPolarisReporter.java  |  4 ++++
 .../EnhancedRestTemplateReporter.java            |  8 +++++---
 ...additional-spring-configuration-metadata.json |  6 ++++++
 .../src/main/resources/META-INF/spring.factories |  3 ++-
 .../reporter/ExceptionPolarisReporterTest.java   |  3 +++
 .../reporter/SuccessPolarisReporterTest.java     |  3 +++
 14 files changed, 96 insertions(+), 10 deletions(-)
 create mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementBootstrapConfiguration.java

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2378e7698..8653c61d9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -27,3 +27,4 @@
 - [add feature-env plugin & add spring cloud gateway staining plugin](https://github.com/Tencent/spring-cloud-tencent/pull/532)
 - [feature:add @ConditionalOnConfigReflectEnabled annotation](https://github.com/Tencent/spring-cloud-tencent/pull/538)
 - [fix:set error handler named EnhancedRestTemplateReporter for RestTemplate](https://github.com/Tencent/spring-cloud-tencent/pull/544)
+- [Optimize: add switch for report call result and default false](https://github.com/Tencent/spring-cloud-tencent/pull/549)
diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java
index cd3f5373f..ef13caa31 100644
--- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java
+++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java
@@ -20,10 +20,13 @@ package com.tencent.cloud.polaris.circuitbreaker.config;
 import com.tencent.cloud.common.constant.ContextConstant;
 import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled;
 import com.tencent.cloud.polaris.context.PolarisConfigModifier;
+import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementAutoConfiguration;
+import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties;
 import com.tencent.polaris.api.config.consumer.ServiceRouterConfig;
 import com.tencent.polaris.factory.config.ConfigurationImpl;
 import com.tencent.polaris.plugins.router.healthy.RecoverRouterConfig;
 
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -36,17 +39,26 @@ import org.springframework.context.annotation.Configuration;
 @Configuration(proxyBeanMethods = false)
 @ConditionalOnPolarisEnabled
 @ConditionalOnProperty(value = "spring.cloud.polaris.circuitbreaker.enabled", havingValue = "true", matchIfMissing = true)
+@AutoConfigureAfter(RpcEnhancementAutoConfiguration.class)
 public class PolarisCircuitBreakerAutoConfiguration {
 
 	@Bean
-	public CircuitBreakerConfigModifier circuitBreakerConfigModifier() {
-		return new CircuitBreakerConfigModifier();
+	public CircuitBreakerConfigModifier circuitBreakerConfigModifier(RpcEnhancementReporterProperties properties) {
+		return new CircuitBreakerConfigModifier(properties);
 	}
 
 	public static class CircuitBreakerConfigModifier implements PolarisConfigModifier {
 
+		private final RpcEnhancementReporterProperties properties;
+
+		public CircuitBreakerConfigModifier(RpcEnhancementReporterProperties properties) {
+			this.properties = properties;
+		}
+
 		@Override
 		public void modify(ConfigurationImpl configuration) {
+			properties.setEnabled(true);
+
 			// Turn on circuitbreaker configuration
 			configuration.getConsumer().getCircuitBreaker().setEnable(true);
 
diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfigurationTest.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfigurationTest.java
index 433e0bb03..9b6006316 100644
--- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfigurationTest.java
+++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfigurationTest.java
@@ -17,10 +17,13 @@
 
 package com.tencent.cloud.polaris.circuitbreaker.config;
 
+import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration;
+import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementAutoConfiguration;
 import org.junit.Test;
 
 import org.springframework.boot.autoconfigure.AutoConfigurations;
 import org.springframework.boot.test.context.runner.ApplicationContextRunner;
+import org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -31,7 +34,12 @@ import static org.assertj.core.api.Assertions.assertThat;
  */
 public class PolarisCircuitBreakerAutoConfigurationTest {
 	private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
-			.withConfiguration(AutoConfigurations.of(PolarisCircuitBreakerAutoConfiguration.class))
+			.withConfiguration(AutoConfigurations.of(
+					PolarisContextAutoConfiguration.class,
+					RpcEnhancementAutoConfiguration.class,
+					LoadBalancerAutoConfiguration.class,
+					RpcEnhancementAutoConfiguration.class,
+					PolarisCircuitBreakerAutoConfiguration.class))
 			.withPropertyValues("spring.cloud.polaris.circuitbreaker.enabled=true");
 
 	@Test
diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerBootstrapConfigurationTest.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerBootstrapConfigurationTest.java
index a4430c1da..221249978 100644
--- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerBootstrapConfigurationTest.java
+++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerBootstrapConfigurationTest.java
@@ -17,10 +17,13 @@
 
 package com.tencent.cloud.polaris.circuitbreaker.config;
 
+import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration;
+import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementAutoConfiguration;
 import org.junit.Test;
 
 import org.springframework.boot.autoconfigure.AutoConfigurations;
 import org.springframework.boot.test.context.runner.ApplicationContextRunner;
+import org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -31,7 +34,11 @@ import static org.assertj.core.api.Assertions.assertThat;
  */
 public class PolarisCircuitBreakerBootstrapConfigurationTest {
 	private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
-			.withConfiguration(AutoConfigurations.of(PolarisCircuitBreakerBootstrapConfiguration.class))
+			.withConfiguration(AutoConfigurations.of(PolarisContextAutoConfiguration.class,
+					RpcEnhancementAutoConfiguration.class,
+					LoadBalancerAutoConfiguration.class,
+					RpcEnhancementAutoConfiguration.class,
+					PolarisCircuitBreakerBootstrapConfiguration.class))
 			.withPropertyValues("spring.cloud.polaris.enabled=true")
 			.withPropertyValues("spring.cloud.polaris.circuitbreaker.enabled=true");
 
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 d015a15e7..e7b0f4fb5 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
@@ -86,8 +86,8 @@ public class RpcEnhancementAutoConfiguration {
 			}
 
 			@Bean
-			public ExceptionPolarisReporter exceptionPolarisReporter() {
-				return new ExceptionPolarisReporter();
+			public ExceptionPolarisReporter exceptionPolarisReporter(RpcEnhancementReporterProperties properties) {
+				return new ExceptionPolarisReporter(properties);
 			}
 		}
 	}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementBootstrapConfiguration.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementBootstrapConfiguration.java
new file mode 100644
index 000000000..d2d6d47b7
--- /dev/null
+++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementBootstrapConfiguration.java
@@ -0,0 +1,15 @@
+package com.tencent.cloud.rpc.enhancement.config;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
+/**
+ * Bootstrap configuration for rpc enhancement.
+ * @author lepdou 2022-08-24
+ */
+@Configuration(proxyBeanMethods = false)
+@ConditionalOnProperty("spring.cloud.polaris.enabled")
+@Import(RpcEnhancementAutoConfiguration.class)
+public class RpcEnhancementBootstrapConfiguration {
+}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementReporterProperties.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementReporterProperties.java
index a044f459c..fc51b31c6 100644
--- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementReporterProperties.java
+++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementReporterProperties.java
@@ -32,6 +32,11 @@ import org.springframework.http.HttpStatus;
 @ConfigurationProperties("spring.cloud.tencent.rpc-enhancement.reporter")
 public class RpcEnhancementReporterProperties {
 
+	/**
+	 * Whether report call result to polaris.
+	 */
+	private boolean enabled;
+
 	/**
 	 * Specify the Http status code(s) that needs to be reported as FAILED.
 	 */
@@ -60,6 +65,14 @@ public class RpcEnhancementReporterProperties {
 		return new ArrayList<>(Arrays.asList(items));
 	}
 
+	public boolean isEnabled() {
+		return enabled;
+	}
+
+	public void setEnabled(boolean enabled) {
+		this.enabled = enabled;
+	}
+
 	public List<HttpStatus> getStatuses() {
 		return statuses;
 	}
diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/ExceptionPolarisReporter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/ExceptionPolarisReporter.java
index f5cb657ba..b870f3292 100644
--- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/ExceptionPolarisReporter.java
+++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/ExceptionPolarisReporter.java
@@ -19,6 +19,7 @@ package com.tencent.cloud.rpc.enhancement.feign.plugin.reporter;
 
 import java.net.SocketTimeoutException;
 
+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.EnhancedFeignPlugin;
 import com.tencent.cloud.rpc.enhancement.feign.plugin.EnhancedFeignPluginType;
@@ -45,6 +46,12 @@ public class ExceptionPolarisReporter implements EnhancedFeignPlugin {
 	@Autowired(required = false)
 	private ConsumerAPI consumerAPI;
 
+	private RpcEnhancementReporterProperties reporterProperties;
+
+	public ExceptionPolarisReporter(RpcEnhancementReporterProperties reporterProperties) {
+		this.reporterProperties = reporterProperties;
+	}
+
 	@Override
 	public String getName() {
 		return ExceptionPolarisReporter.class.getName();
@@ -57,6 +64,10 @@ public class ExceptionPolarisReporter implements EnhancedFeignPlugin {
 
 	@Override
 	public void run(EnhancedFeignContext context) {
+		if (!reporterProperties.isEnabled()) {
+			return;
+		}
+
 		if (consumerAPI != null) {
 			Request request = context.getRequest();
 			Response response = context.getResponse();
diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/SuccessPolarisReporter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/SuccessPolarisReporter.java
index d4dc77344..11614b6fc 100644
--- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/SuccessPolarisReporter.java
+++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/SuccessPolarisReporter.java
@@ -61,6 +61,10 @@ public class SuccessPolarisReporter extends AbstractPolarisReporterAdapter imple
 
 	@Override
 	public void run(EnhancedFeignContext context) {
+		if (!properties.isEnabled()) {
+			return;
+		}
+
 		if (consumerAPI != null) {
 			Request request = context.getRequest();
 			Response response = context.getResponse();
diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporter.java
index b3c8e9a09..4d93b8d7b 100644
--- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporter.java
+++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporter.java
@@ -77,8 +77,11 @@ public class EnhancedRestTemplateReporter extends AbstractPolarisReporterAdapter
 	}
 
 	@Override
-	public void handleError(@NonNull URI url, @NonNull HttpMethod method, @NonNull ClientHttpResponse response)
-			throws IOException {
+	public void handleError(@NonNull URI url, @NonNull HttpMethod method, @NonNull ClientHttpResponse response) {
+		if (!properties.isEnabled()) {
+			return;
+		}
+
 		ServiceCallResult resultRequest = createServiceCallResult(url);
 		try {
 			HttpURLConnection connection = (HttpURLConnection) ReflectionUtils.getFieldValue(response, FIELD_NAME);
@@ -95,7 +98,6 @@ public class EnhancedRestTemplateReporter extends AbstractPolarisReporterAdapter
 		catch (Exception e) {
 			LOG.error("Will report response of {} url {}", response, url, e);
 			resultRequest.setRetStatus(RetStatus.RetFail);
-			throw e;
 		}
 		finally {
 			LOG.debug("Will report result of {}. URL=[{}]. Response=[{}].", resultRequest.getRetStatus().name(),
diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-tencent-rpc-enhancement/src/main/resources/META-INF/additional-spring-configuration-metadata.json
index c76a18566..6f15540b1 100644
--- a/spring-cloud-tencent-rpc-enhancement/src/main/resources/META-INF/additional-spring-configuration-metadata.json
+++ b/spring-cloud-tencent-rpc-enhancement/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -6,6 +6,12 @@
       "defaultValue": true,
       "description": "If rpc enhancement enabled."
     },
+    {
+      "name": "spring.cloud.tencent.rpc-enhancement.reporter.enabled",
+      "type": "java.lang.Boolean",
+      "defaultValue": false,
+      "description": "Whether report call result to polaris."
+    },
     {
       "name": "spring.cloud.tencent.rpc-enhancement.reporter.ignore-internal-server-error",
       "type": "java.lang.Boolean",
diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/resources/META-INF/spring.factories b/spring-cloud-tencent-rpc-enhancement/src/main/resources/META-INF/spring.factories
index 990b75001..a8a9373af 100644
--- a/spring-cloud-tencent-rpc-enhancement/src/main/resources/META-INF/spring.factories
+++ b/spring-cloud-tencent-rpc-enhancement/src/main/resources/META-INF/spring.factories
@@ -1,5 +1,6 @@
 org.springframework.cloud.bootstrap.BootstrapConfiguration=\
-  com.tencent.cloud.rpc.enhancement.stat.config.PolarisStatPropertiesBootstrapConfiguration
+  com.tencent.cloud.rpc.enhancement.stat.config.PolarisStatPropertiesBootstrapConfiguration,\
+  com.tencent.cloud.rpc.enhancement.config.RpcEnhancementBootstrapConfiguration
 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
   com.tencent.cloud.rpc.enhancement.config.RpcEnhancementAutoConfiguration,\
   com.tencent.cloud.rpc.enhancement.stat.config.PolarisStatPropertiesAutoConfiguration
diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/ExceptionPolarisReporterTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/ExceptionPolarisReporterTest.java
index d47c7f2c5..45bea2a4a 100644
--- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/ExceptionPolarisReporterTest.java
+++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/ExceptionPolarisReporterTest.java
@@ -17,6 +17,7 @@
 
 package com.tencent.cloud.rpc.enhancement.feign.plugin.reporter;
 
+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.EnhancedFeignPluginType;
 import com.tencent.polaris.api.core.ConsumerAPI;
@@ -48,6 +49,8 @@ public class ExceptionPolarisReporterTest {
 	private static MockedStatic<ReporterUtils> mockedReporterUtils;
 	@Mock
 	private ConsumerAPI consumerAPI;
+	@Mock
+	private RpcEnhancementReporterProperties reporterProperties;
 	@InjectMocks
 	private ExceptionPolarisReporter exceptionPolarisReporter;
 
diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/SuccessPolarisReporterTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/SuccessPolarisReporterTest.java
index b3e28a5ca..56bd11817 100644
--- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/SuccessPolarisReporterTest.java
+++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/feign/plugin/reporter/SuccessPolarisReporterTest.java
@@ -17,6 +17,7 @@
 
 package com.tencent.cloud.rpc.enhancement.feign.plugin.reporter;
 
+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.EnhancedFeignPluginType;
 import com.tencent.polaris.api.core.ConsumerAPI;
@@ -49,6 +50,8 @@ public class SuccessPolarisReporterTest {
 	private static MockedStatic<ReporterUtils> mockedReporterUtils;
 	@Mock
 	private ConsumerAPI consumerAPI;
+	@Mock
+	private RpcEnhancementReporterProperties reporterProperties;
 	@InjectMocks
 	private SuccessPolarisReporter successPolarisReporter;