From 400f9c86a64287930cfcc593ca69c70b9778ccd0 Mon Sep 17 00:00:00 2001 From: evelynwei Date: Mon, 24 Aug 2026 16:54:50 +0800 Subject: [PATCH] feat: expose config client id in polaris config endpoint The config SDK context is created in the config-data phase, so its startup logs may be dropped before the polaris log appenders are ready. Exposing the client id via the endpoint gives tooling a reliable source instead of grepping logs (the cloud verify script had to derive it from the first SDKContext when no stream-establishment anchor log exists). Co-authored-by: Cursor --- .../endpoint/PolarisConfigEndpoint.java | 17 +++++++++++ .../endpoint/PolarisConfigEndpointTest.java | 30 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/endpoint/PolarisConfigEndpoint.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/endpoint/PolarisConfigEndpoint.java index 0942fb2f9..04788b6d0 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/endpoint/PolarisConfigEndpoint.java +++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/endpoint/PolarisConfigEndpoint.java @@ -21,6 +21,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import com.tencent.cloud.polaris.config.PolarisConfigSDKContextManager; import com.tencent.cloud.polaris.config.adapter.PolarisPropertySource; import com.tencent.cloud.polaris.config.adapter.PolarisPropertySourceManager; import com.tencent.cloud.polaris.config.config.PolarisConfigProperties; @@ -50,6 +51,22 @@ public class PolarisConfigEndpoint { List propertySourceList = PolarisPropertySourceManager.getAllPropertySources(); configInfo.put("PolarisPropertySource", propertySourceList); + configInfo.put("ClientId", getClientId()); + return configInfo; } + + /** + * The config SDK context is created in the config-data phase, so its startup logs may be + * dropped before the polaris log appenders are ready. Exposing the client id here gives + * tooling a reliable source instead of grepping logs. + */ + private String getClientId() { + try { + return PolarisConfigSDKContextManager.innerGetConfigSDKContext().getValueContext().getClientId(); + } + catch (Throwable throwable) { + return null; + } + } } diff --git a/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/endpoint/PolarisConfigEndpointTest.java b/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/endpoint/PolarisConfigEndpointTest.java index f077e50ba..51bc92975 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/endpoint/PolarisConfigEndpointTest.java +++ b/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/endpoint/PolarisConfigEndpointTest.java @@ -21,14 +21,19 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import com.tencent.cloud.polaris.config.PolarisConfigSDKContextManager; import com.tencent.cloud.polaris.config.adapter.MockedConfigKVFile; import com.tencent.cloud.polaris.config.adapter.PolarisPropertySource; import com.tencent.cloud.polaris.config.adapter.PolarisPropertySourceManager; import com.tencent.cloud.polaris.config.config.PolarisConfigProperties; +import com.tencent.polaris.api.plugin.common.ValueContext; +import com.tencent.polaris.client.api.SDKContext; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import static org.assertj.core.api.Assertions.assertThat; @@ -53,6 +58,11 @@ public class PolarisConfigEndpointTest { PolarisPropertySourceManager.clearPropertySources(); } + @AfterEach + public void tearDown() { + PolarisConfigSDKContextManager.innerConfigDestroy(); + } + @Test public void testPolarisConfigEndpoint() { Map content = new HashMap<>(); @@ -69,4 +79,24 @@ public class PolarisConfigEndpointTest { assertThat(polarisConfigProperties).isEqualTo(info.get("PolarisConfigProperties")); assertThat(Collections.singletonList(polarisPropertySource)).isEqualTo(info.get("PolarisPropertySource")); } + + @Test + public void testPolarisConfigEndpointExposesClientId() { + SDKContext sdkContext = Mockito.mock(SDKContext.class); + ValueContext valueContext = Mockito.mock(ValueContext.class); + Mockito.when(sdkContext.getValueContext()).thenReturn(valueContext); + Mockito.when(valueContext.getClientId()).thenReturn("host_1234_0"); + PolarisConfigSDKContextManager.setConfigSDKContext(sdkContext); + + PolarisConfigEndpoint endpoint = new PolarisConfigEndpoint(polarisConfigProperties); + + assertThat(endpoint.polarisConfig().get("ClientId")).isEqualTo("host_1234_0"); + } + + @Test + public void testPolarisConfigEndpointClientIdIsNullWhenContextAbsent() { + PolarisConfigEndpoint endpoint = new PolarisConfigEndpoint(polarisConfigProperties); + + assertThat(endpoint.polarisConfig().get("ClientId")).isNull(); + } }