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 <fishtailfu@tencent.com>
2024
Fishtail 1 week ago committed by GitHub
parent 859b0258d8
commit 1c6f999462
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -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)

@ -90,7 +90,7 @@
<properties>
<!-- Project revision -->
<revision>2.1.2.0-2024.0.3</revision>
<revision>2.2.0.0-2024.0.3-SNAPSHOT</revision>
<!-- Spring Framework -->
<spring.framework.version>6.2.18</spring.framework.version>

@ -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);

@ -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 +
'}';
}
}
}

@ -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<PolarisConfigModifier> modifierList = modifierList(polarisConfigProperties, polarisCryptoConfigProperties, polarisContextProperties);
List<PolarisConfigModifier> 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);
}
}

@ -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",

@ -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();
}

@ -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 {
}
}

@ -71,10 +71,10 @@
<properties>
<!-- Project revision -->
<revision>2.1.2.0-2024.0.3</revision>
<revision>2.2.0.0-2024.0.3-SNAPSHOT</revision>
<!-- Polaris SDK version -->
<polaris.version>2.1.2.0</polaris.version>
<polaris.version>2.2.0.0-SNAPSHOT</polaris.version>
<!-- Dependencies -->
<springdoc.version>2.8.14</springdoc.version>

Loading…
Cancel
Save