From 1c6f999462c340d9586721fabd10308903bfe89a Mon Sep 17 00:00:00 2001 From: Fishtail <49390359+fuyuwei01@users.noreply.github.com> Date: Thu, 13 Aug 2026 14:54:21 +0800 Subject: [PATCH] feat: adapt to polaris-java ReportClientRequestCustomizer plugin for config watch reporting (#1813) * feat: adapt to polaris-java CLIENT_REPORTER plugin for config watch reporting - Upgrade polaris.version from 2.1.2.0-SNAPSHOT to 2.1.2.0 - Enable clientReporter in ConfigurationModifier.modify() - Add ClientReporterConfigImpl mock to ConfigurationModifierTest - Add clientReporter verification to test assertions * fix: enable config watch client reporter plugin in SCT * fix: add config report property * fix: add config report property * add CHANGELOG.md * fix pom * refactor: rename config report request customizer * fix CHANGELOG.md * fix REVISION * fix properties * refactor: use generic request customizer config * fix: align request customizer config type --------- Co-authored-by: fishtailfu --- CHANGELOG.md | 1 + pom.xml | 2 +- .../polaris/config/ConfigurationModifier.java | 9 +++ .../config/PolarisConfigProperties.java | 39 +++++++++++++ .../PolarisConfigDataLocationResolver.java | 10 ++-- ...itional-spring-configuration-metadata.json | 7 +++ .../config/ConfigurationModifierTest.java | 41 ++++++++++++++ .../config/PolarisConfigPropertiesTest.java | 56 +++++++++++++++++++ spring-cloud-tencent-dependencies/pom.xml | 4 +- 9 files changed, 162 insertions(+), 7 deletions(-) create mode 100644 spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/config/PolarisConfigPropertiesTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index a8e03bfc4..d50831039 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,3 +12,4 @@ - [feat: support overrideHost configuration for ratelimit, event reporter and stat modules](https://github.com/Tencent/spring-cloud-tencent/pull/1804) - [fix: split contract base-package for springdoc scan](https://github.com/Tencent/spring-cloud-tencent/pull/1807) - [feat: support using seperated cb in wildcard-api level and add cb counters expire interval config](https://github.com/Tencent/spring-cloud-tencent/pull/1809) +- [feat: adapt to polaris-java ReportClientRequestCustomizer plugin for config watch reporting](https://github.com/Tencent/spring-cloud-tencent/pull/1813) \ No newline at end of file diff --git a/pom.xml b/pom.xml index edfdfefc9..df4833f69 100644 --- a/pom.xml +++ b/pom.xml @@ -90,7 +90,7 @@ - 2.1.2.0-2024.0.3 + 2.2.0.0-2024.0.3-SNAPSHOT 6.2.18 diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/ConfigurationModifier.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/ConfigurationModifier.java index 2ead9c840..72dd0bee9 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/ConfigurationModifier.java +++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/ConfigurationModifier.java @@ -32,9 +32,12 @@ import com.tencent.cloud.polaris.context.config.PolarisContextProperties; import com.tencent.polaris.api.config.consumer.OutlierDetectionConfig; import com.tencent.polaris.api.utils.CollectionUtils; import com.tencent.polaris.api.utils.StringUtils; +import com.tencent.polaris.configuration.client.internal.ConfigWatchReportRequestCustomizer; +import com.tencent.polaris.configuration.client.internal.ConfigWatchReportRequestCustomizerConfig; import com.tencent.polaris.factory.config.ConfigurationImpl; import com.tencent.polaris.factory.config.configuration.ConfigFilterConfigImpl; import com.tencent.polaris.factory.config.configuration.ConnectorConfigImpl; +import com.tencent.polaris.factory.config.global.ReportClientRequestCustomizerConfigImpl; import com.tencent.polaris.factory.config.global.ServerConnectorConfigImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -67,6 +70,12 @@ public class ConfigurationModifier implements PolarisConfigurationConfigModifier @Override public void modify(ConfigurationImpl configuration) { configuration.getGlobal().getStatReporter().setEnable(false); + ReportClientRequestCustomizerConfigImpl customizerConfig = configuration.getGlobal() + .getReportClientRequestCustomizer(); + ConfigWatchReportRequestCustomizerConfig configWatchCustomizerConfig = customizerConfig.getPluginConfig( + ConfigWatchReportRequestCustomizer.NAME, ConfigWatchReportRequestCustomizerConfig.class); + configWatchCustomizerConfig.setEnable(polarisConfigProperties.getReport().isEnabled()); + customizerConfig.setPluginConfig(ConfigWatchReportRequestCustomizer.NAME, configWatchCustomizerConfig); configuration.getConsumer().getOutlierDetection().setWhen(OutlierDetectionConfig.When.never); configuration.getConsumer().getCircuitBreaker().setEnable(false); diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/config/PolarisConfigProperties.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/config/PolarisConfigProperties.java index 2fe62805e..261f05643 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/config/PolarisConfigProperties.java +++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/config/PolarisConfigProperties.java @@ -110,6 +110,10 @@ public class PolarisConfigProperties { */ private long emptyProtectionExpiredInterval = 7 * 24 * 3600 * 1000L; + /** + * Config watch metadata report settings. + */ + private Report report = new Report(); public boolean isEnabled() { return enabled; @@ -231,6 +235,14 @@ public class PolarisConfigProperties { this.emptyProtectionExpiredInterval = emptyProtectionExpiredInterval; } + public Report getReport() { + return report; + } + + public void setReport(Report report) { + this.report = report; + } + @Override public String toString() { return "PolarisConfigProperties{" + @@ -249,6 +261,33 @@ public class PolarisConfigProperties { ", checkAddress=" + checkAddress + ", emptyProtectionEnabled=" + emptyProtectionEnabled + ", emptyProtectionExpiredInterval=" + emptyProtectionExpiredInterval + + ", report=" + report + '}'; } + + /** + * Config watch metadata report settings. + */ + public static class Report { + + /** + * Whether to report config watch metadata. + */ + private boolean enabled = true; + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + @Override + public String toString() { + return "Report{" + + "enabled=" + enabled + + '}'; + } + } } diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/configdata/PolarisConfigDataLocationResolver.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/configdata/PolarisConfigDataLocationResolver.java index 0660c1ea9..ab7def5f9 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/configdata/PolarisConfigDataLocationResolver.java +++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/configdata/PolarisConfigDataLocationResolver.java @@ -160,7 +160,8 @@ public class PolarisConfigDataLocationResolver implements // prepare and init earlier Polaris SDKContext to pull config files from remote. try { - prepareAndInitEarlierPolarisSdkContext(resolverContext, polarisConfigProperties, polarisCryptoConfigProperties, polarisContextProperties); + prepareAndInitEarlierPolarisSdkContext(resolverContext, polarisConfigProperties, + polarisCryptoConfigProperties, polarisContextProperties); } catch (Throwable throwable) { if (location.isOptional()) { @@ -185,7 +186,8 @@ public class PolarisConfigDataLocationResolver implements BootstrapRegistry.InstanceSupplier.of(tsfTlsProperties)); return loadConfigDataResources(resolverContext, - location, profiles, polarisConfigProperties, polarisCryptoConfigProperties, polarisContextProperties, tsfTlsProperties); + location, profiles, polarisConfigProperties, polarisCryptoConfigProperties, + polarisContextProperties, tsfTlsProperties); } @Override @@ -318,7 +320,8 @@ public class PolarisConfigDataLocationResolver implements private SDKContext sdkContext(ConfigDataLocationResolverContext resolverContext, PolarisConfigProperties polarisConfigProperties, PolarisCryptoConfigProperties polarisCryptoConfigProperties, PolarisContextProperties polarisContextProperties) { - List modifierList = modifierList(polarisConfigProperties, polarisCryptoConfigProperties, polarisContextProperties); + List modifierList = modifierList(polarisConfigProperties, + polarisCryptoConfigProperties, polarisContextProperties); return SDKContext.initContextByConfig(polarisContextProperties.configuration( modifierList, () -> loadPolarisConfigProperties(resolverContext, String.class, "spring.cloud.client.ip-address"), @@ -347,4 +350,3 @@ public class PolarisConfigDataLocationResolver implements Boolean.class.isAssignableFrom(typeClass); } } - diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-starter-tencent-polaris-config/src/main/resources/META-INF/additional-spring-configuration-metadata.json index cbef57639..8c94b1e71 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-cloud-starter-tencent-polaris-config/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -85,6 +85,13 @@ "defaultValue": "./polaris/backup/config", "description": "Where to load config file, polaris or local." }, + { + "name": "spring.cloud.polaris.config.report.enabled", + "type": "java.lang.Boolean", + "defaultValue": true, + "description": "Whether to report config watch metadata through the Polaris client reporter.", + "sourceType": "com.tencent.cloud.polaris.config.config.PolarisConfigProperties" + }, { "name": "spring.cloud.polaris.config.crypto.enabled", "type": "java.lang.Boolean", diff --git a/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/ConfigurationModifierTest.java b/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/ConfigurationModifierTest.java index 69315674a..4a46887fa 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/ConfigurationModifierTest.java +++ b/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/ConfigurationModifierTest.java @@ -32,6 +32,8 @@ import com.tencent.cloud.polaris.config.config.PolarisConfigProperties; import com.tencent.cloud.polaris.config.config.PolarisCryptoConfigProperties; import com.tencent.cloud.polaris.context.config.PolarisContextProperties; import com.tencent.polaris.api.config.consumer.OutlierDetectionConfig; +import com.tencent.polaris.configuration.client.internal.ConfigWatchReportRequestCustomizer; +import com.tencent.polaris.configuration.client.internal.ConfigWatchReportRequestCustomizerConfig; import com.tencent.polaris.factory.config.ConfigurationImpl; import com.tencent.polaris.factory.config.configuration.ConfigFileConfigImpl; import com.tencent.polaris.factory.config.configuration.ConfigFilterConfigImpl; @@ -41,6 +43,7 @@ import com.tencent.polaris.factory.config.consumer.ConsumerConfigImpl; import com.tencent.polaris.factory.config.consumer.OutlierDetectionConfigImpl; import com.tencent.polaris.factory.config.global.APIConfigImpl; import com.tencent.polaris.factory.config.global.GlobalConfigImpl; +import com.tencent.polaris.factory.config.global.ReportClientRequestCustomizerConfigImpl; import com.tencent.polaris.factory.config.global.ServerConnectorConfigImpl; import com.tencent.polaris.factory.config.global.StatReporterConfigImpl; import org.junit.jupiter.api.BeforeEach; @@ -75,15 +78,23 @@ class ConfigurationModifierTest { @Mock private PolarisCryptoConfigProperties polarisCryptoConfigProperties; + @Mock + private PolarisConfigProperties.Report report; + @Mock private PolarisContextProperties polarisContextProperties; + @Mock + private ConfigWatchReportRequestCustomizerConfig configWatchCustomizer; + private ConfigurationModifier configurationModifier; @BeforeEach void setUp() { configurationModifier = new ConfigurationModifier( polarisConfigProperties, polarisCryptoConfigProperties, polarisContextProperties); + Mockito.lenient().when(polarisConfigProperties.getReport()).thenReturn(report); + Mockito.lenient().when(report.isEnabled()).thenReturn(true); } /** @@ -94,9 +105,14 @@ class ConfigurationModifierTest { GlobalConfigImpl globalConfig = mock(GlobalConfigImpl.class); StatReporterConfigImpl statReporter = mock(StatReporterConfigImpl.class); + ReportClientRequestCustomizerConfigImpl requestCustomizer = + mock(ReportClientRequestCustomizerConfigImpl.class); ServerConnectorConfigImpl serverConnector = mock(ServerConnectorConfigImpl.class); APIConfigImpl apiConfig = mock(APIConfigImpl.class); when(globalConfig.getStatReporter()).thenReturn(statReporter); + when(globalConfig.getReportClientRequestCustomizer()).thenReturn(requestCustomizer); + when(requestCustomizer.getPluginConfig(ConfigWatchReportRequestCustomizer.NAME, + ConfigWatchReportRequestCustomizerConfig.class)).thenReturn(configWatchCustomizer); Mockito.lenient().when(globalConfig.getServerConnector()).thenReturn(serverConnector); Mockito.lenient().when(globalConfig.getAPI()).thenReturn(apiConfig); when(configuration.getGlobal()).thenReturn(globalConfig); @@ -153,6 +169,11 @@ class ConfigurationModifierTest { // Assert verify(configuration.getGlobal().getStatReporter()).setEnable(false); + verify(configuration.getGlobal().getReportClientRequestCustomizer() + .getPluginConfig(ConfigWatchReportRequestCustomizer.NAME, + ConfigWatchReportRequestCustomizerConfig.class)).setEnable(true); + verify(configuration.getGlobal().getReportClientRequestCustomizer()) + .setPluginConfig(ConfigWatchReportRequestCustomizer.NAME, configWatchCustomizer); verify(configuration.getConsumer().getOutlierDetection()).setWhen(OutlierDetectionConfig.When.never); verify(configuration.getConsumer().getCircuitBreaker()).setEnable(false); verify(configuration.getConfigFile(), never()).getServerConnector(); @@ -176,6 +197,26 @@ class ConfigurationModifierTest { // Assert verify(configuration.getGlobal().getStatReporter()).setEnable(false); + verify(configuration.getGlobal().getReportClientRequestCustomizer() + .getPluginConfig(ConfigWatchReportRequestCustomizer.NAME, + ConfigWatchReportRequestCustomizerConfig.class)).setEnable(true); + verify(configuration.getGlobal().getReportClientRequestCustomizer()) + .setPluginConfig(ConfigWatchReportRequestCustomizer.NAME, configWatchCustomizer); + verify(configuration.getConfigFile(), never()).getServerConnector(); + } + + @DisplayName("modify should disable config watch reporter when configured") + @Test + void testModify_ConfigWatchReportDisabled() { + ConfigurationImpl configuration = buildMockConfiguration(); + when(report.isEnabled()).thenReturn(false); + when(polarisContextProperties.getEnabled()).thenReturn(false); + + configurationModifier.modify(configuration); + + verify(configWatchCustomizer).setEnable(false); + verify(configuration.getGlobal().getReportClientRequestCustomizer()) + .setPluginConfig(ConfigWatchReportRequestCustomizer.NAME, configWatchCustomizer); verify(configuration.getConfigFile(), never()).getServerConnector(); } diff --git a/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/config/PolarisConfigPropertiesTest.java b/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/config/PolarisConfigPropertiesTest.java new file mode 100644 index 000000000..1028951c9 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/config/PolarisConfigPropertiesTest.java @@ -0,0 +1,56 @@ +/* + * Tencent is pleased to support the open source community by making spring-cloud-tencent available. + * + * Copyright (C) 2021 Tencent. 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.polaris.config.config; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Test for {@link PolarisConfigProperties}. + */ +public class PolarisConfigPropertiesTest { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withUserConfiguration(TestConfiguration.class); + + @Test + public void testReportEnabledDefaultTrue() { + this.contextRunner.run(context -> { + PolarisConfigProperties properties = context.getBean(PolarisConfigProperties.class); + assertThat(properties.getReport().isEnabled()).isTrue(); + }); + } + + @Test + public void testReportEnabledBinding() { + this.contextRunner + .withPropertyValues("spring.cloud.polaris.config.report.enabled=false") + .run(context -> { + PolarisConfigProperties properties = context.getBean(PolarisConfigProperties.class); + assertThat(properties.getReport().isEnabled()).isFalse(); + }); + } + + @EnableConfigurationProperties(PolarisConfigProperties.class) + static class TestConfiguration { + } +} diff --git a/spring-cloud-tencent-dependencies/pom.xml b/spring-cloud-tencent-dependencies/pom.xml index 2a87d30bd..c7bd4b53e 100644 --- a/spring-cloud-tencent-dependencies/pom.xml +++ b/spring-cloud-tencent-dependencies/pom.xml @@ -71,10 +71,10 @@ - 2.1.2.0-2024.0.3 + 2.2.0.0-2024.0.3-SNAPSHOT - 2.1.2.0 + 2.2.0.0-SNAPSHOT 2.8.14