From 0f2f4a473fad581cdf333825d49c7a9e68426788 Mon Sep 17 00:00:00 2001 From: fishtailfu Date: Mon, 10 Aug 2026 20:25:08 +0800 Subject: [PATCH] feat: support audit log --- pom.xml | 2 +- .../cloud/common/constant/OrderConstant.java | 5 + spring-cloud-tencent-dependencies/pom.xml | 4 +- .../audit/config/AuditLogConfigModifier.java | 49 +++++++++ .../config/PolarisAuditLogProperties.java | 55 +++++++++++ ...isAuditLogPropertiesAutoConfiguration.java | 42 ++++++++ ...itional-spring-configuration-metadata.json | 12 +++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../config/AuditLogConfigModifierTest.java | 99 +++++++++++++++++++ ...ditLogPropertiesAutoConfigurationTest.java | 46 +++++++++ .../config/PolarisAuditLogPropertiesTest.java | 58 +++++++++++ 11 files changed, 370 insertions(+), 3 deletions(-) create mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/audit/config/AuditLogConfigModifier.java create mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/audit/config/PolarisAuditLogProperties.java create mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/audit/config/PolarisAuditLogPropertiesAutoConfiguration.java create mode 100644 spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/audit/config/AuditLogConfigModifierTest.java create mode 100644 spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/audit/config/PolarisAuditLogPropertiesAutoConfigurationTest.java create mode 100644 spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/audit/config/PolarisAuditLogPropertiesTest.java 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-tencent-commons/src/main/java/com/tencent/cloud/common/constant/OrderConstant.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/OrderConstant.java index b94d141b8..4fdc07e8d 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/OrderConstant.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/OrderConstant.java @@ -195,6 +195,11 @@ public class OrderConstant { */ public static Integer STAT_REPORTER_ORDER = 1; + /** + * Order of audit log configuration modifier. + */ + public static Integer AUDIT_LOG_ORDER = 1; + /** * Load Balancer config modifier order. */ 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 diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/audit/config/AuditLogConfigModifier.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/audit/config/AuditLogConfigModifier.java new file mode 100644 index 000000000..b48e5f0a7 --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/audit/config/AuditLogConfigModifier.java @@ -0,0 +1,49 @@ +/* + * 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.rpc.enhancement.audit.config; + +import com.tencent.cloud.common.constant.OrderConstant; +import com.tencent.cloud.polaris.context.PolarisConfigModifier; +import com.tencent.polaris.factory.config.ConfigurationImpl; +import com.tencent.polaris.factory.config.consumer.AuditLogConfigImpl; + +/** + * Config modifier for Polaris service call audit logging. + * + * @author Yuwei Fu + */ +public class AuditLogConfigModifier implements PolarisConfigModifier { + + private final PolarisAuditLogProperties auditLogProperties; + + public AuditLogConfigModifier(PolarisAuditLogProperties auditLogProperties) { + this.auditLogProperties = auditLogProperties; + } + + @Override + public void modify(ConfigurationImpl configuration) { + AuditLogConfigImpl auditLogConfig = configuration.getConsumer().getAuditLog(); + auditLogConfig.setEnable(auditLogProperties.isEnabled()); + auditLogConfig.setFormat(auditLogProperties.getFormat()); + } + + @Override + public int getOrder() { + return OrderConstant.Modifier.AUDIT_LOG_ORDER; + } +} diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/audit/config/PolarisAuditLogProperties.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/audit/config/PolarisAuditLogProperties.java new file mode 100644 index 000000000..842cf1bf3 --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/audit/config/PolarisAuditLogProperties.java @@ -0,0 +1,55 @@ +/* + * 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.rpc.enhancement.audit.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * Properties for Polaris service call audit logging. + * + * @author Yuwei Fu + */ +@ConfigurationProperties("spring.cloud.polaris.audit-log") +public class PolarisAuditLogProperties { + + /** + * Whether service call audit logging is enabled. + */ + private boolean enabled = false; + + /** + * Audit log output format. + */ + private String format = "json"; + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } +} diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/audit/config/PolarisAuditLogPropertiesAutoConfiguration.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/audit/config/PolarisAuditLogPropertiesAutoConfiguration.java new file mode 100644 index 000000000..c6bbcdd50 --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/audit/config/PolarisAuditLogPropertiesAutoConfiguration.java @@ -0,0 +1,42 @@ +/* + * 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.rpc.enhancement.audit.config; + +import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Auto-configuration for Polaris service call audit logging. + * + * @author Yuwei Fu + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnPolarisEnabled +@EnableConfigurationProperties(PolarisAuditLogProperties.class) +public class PolarisAuditLogPropertiesAutoConfiguration { + + @Bean + @ConditionalOnMissingBean + public AuditLogConfigModifier auditLogConfigModifier(PolarisAuditLogProperties auditLogProperties) { + return new AuditLogConfigModifier(auditLogProperties); + } +} 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 8b283025d..3ac1214a0 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 @@ -30,6 +30,18 @@ "defaultValue": "", "description": "Specify the Http status code(s) that needs to be reported as FAILED." }, + { + "name": "spring.cloud.polaris.audit-log.enabled", + "type": "java.lang.Boolean", + "defaultValue": false, + "description": "Whether service call audit logging is enabled." + }, + { + "name": "spring.cloud.polaris.audit-log.format", + "type": "java.lang.String", + "defaultValue": "json", + "description": "Service call audit log output format." + }, { "name": "spring.cloud.polaris.stat.enabled", "type": "java.lang.Boolean", diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/spring-cloud-tencent-rpc-enhancement/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index c400229e0..c7e48c90a 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/spring-cloud-tencent-rpc-enhancement/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,3 +1,4 @@ com.tencent.cloud.rpc.enhancement.config.RpcEnhancementAutoConfiguration +com.tencent.cloud.rpc.enhancement.audit.config.PolarisAuditLogPropertiesAutoConfiguration com.tencent.cloud.rpc.enhancement.stat.config.PolarisStatPropertiesAutoConfiguration com.tencent.cloud.rpc.enhancement.config.RpcEnhancementPropertiesAutoConfiguration diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/audit/config/AuditLogConfigModifierTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/audit/config/AuditLogConfigModifierTest.java new file mode 100644 index 000000000..1ca41d036 --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/audit/config/AuditLogConfigModifierTest.java @@ -0,0 +1,99 @@ +/* + * 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.rpc.enhancement.audit.config; + +import com.tencent.cloud.common.constant.OrderConstant; +import com.tencent.cloud.polaris.context.PolarisSDKContextManager; +import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration; +import com.tencent.polaris.api.config.consumer.AuditLogConfig; +import com.tencent.polaris.factory.config.ConfigurationImpl; +import com.tencent.polaris.factory.config.consumer.AuditLogConfigImpl; +import com.tencent.polaris.factory.config.consumer.ConsumerConfigImpl; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * Test for {@link AuditLogConfigModifier}. + * + * @author Yuwei Fu + */ +public class AuditLogConfigModifierTest { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of( + PolarisContextAutoConfiguration.class, + PolarisAuditLogPropertiesAutoConfiguration.class)) + .withPropertyValues("spring.cloud.polaris.enabled=true") + .withPropertyValues("spring.application.name=audit-test") + .withPropertyValues("spring.cloud.gateway.enabled=false"); + + @BeforeEach + void setUp() { + PolarisSDKContextManager.innerDestroy(); + } + + @Test + void testModify() { + PolarisAuditLogProperties properties = new PolarisAuditLogProperties(); + properties.setEnabled(true); + properties.setFormat("json"); + ConfigurationImpl configuration = mock(ConfigurationImpl.class); + ConsumerConfigImpl consumerConfig = mock(ConsumerConfigImpl.class); + AuditLogConfigImpl auditLogConfig = mock(AuditLogConfigImpl.class); + when(configuration.getConsumer()).thenReturn(consumerConfig); + when(consumerConfig.getAuditLog()).thenReturn(auditLogConfig); + + AuditLogConfigModifier modifier = new AuditLogConfigModifier(properties); + modifier.modify(configuration); + + verify(auditLogConfig).setEnable(true); + verify(auditLogConfig).setFormat("json"); + assertThat(modifier.getOrder()).isEqualTo(OrderConstant.Modifier.AUDIT_LOG_ORDER); + } + + @Test + void testModifySdkConfiguration() { + contextRunner + .withPropertyValues("spring.cloud.polaris.audit-log.enabled=true") + .withPropertyValues("spring.cloud.polaris.audit-log.format=json") + .run(context -> { + PolarisSDKContextManager contextManager = context.getBean(PolarisSDKContextManager.class); + AuditLogConfig auditLogConfig = contextManager.getSDKContext().getConfig().getConsumer().getAuditLog(); + assertThat(auditLogConfig.isEnable()).isTrue(); + assertThat(auditLogConfig.getFormat()).isEqualTo("json"); + }); + } + + @Test + void testAuditLogDisabledByDefault() { + contextRunner.run(context -> { + PolarisSDKContextManager contextManager = context.getBean(PolarisSDKContextManager.class); + AuditLogConfig auditLogConfig = contextManager.getSDKContext().getConfig().getConsumer().getAuditLog(); + assertThat(auditLogConfig.isEnable()).isFalse(); + assertThat(auditLogConfig.getFormat()).isEqualTo("json"); + }); + } +} diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/audit/config/PolarisAuditLogPropertiesAutoConfigurationTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/audit/config/PolarisAuditLogPropertiesAutoConfigurationTest.java new file mode 100644 index 000000000..d1964f356 --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/audit/config/PolarisAuditLogPropertiesAutoConfigurationTest.java @@ -0,0 +1,46 @@ +/* + * 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.rpc.enhancement.audit.config; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Test for {@link PolarisAuditLogPropertiesAutoConfiguration}. + * + * @author Yuwei Fu + */ +public class PolarisAuditLogPropertiesAutoConfigurationTest { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(PolarisAuditLogPropertiesAutoConfiguration.class)) + .withPropertyValues("spring.cloud.polaris.enabled=true"); + + @Test + void testDefaultInitialization() { + contextRunner.run(context -> { + assertThat(context).hasSingleBean(PolarisAuditLogPropertiesAutoConfiguration.class); + assertThat(context).hasSingleBean(PolarisAuditLogProperties.class); + assertThat(context).hasSingleBean(AuditLogConfigModifier.class); + }); + } +} diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/audit/config/PolarisAuditLogPropertiesTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/audit/config/PolarisAuditLogPropertiesTest.java new file mode 100644 index 000000000..77ba546cb --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/audit/config/PolarisAuditLogPropertiesTest.java @@ -0,0 +1,58 @@ +/* + * 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.rpc.enhancement.audit.config; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Test for {@link PolarisAuditLogProperties}. + * + * @author Yuwei Fu + */ +public class PolarisAuditLogPropertiesTest { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(PolarisAuditLogPropertiesAutoConfiguration.class)) + .withPropertyValues("spring.cloud.polaris.enabled=true"); + + @Test + void testDefaultValues() { + contextRunner.run(context -> { + PolarisAuditLogProperties properties = context.getBean(PolarisAuditLogProperties.class); + assertThat(properties.isEnabled()).isFalse(); + assertThat(properties.getFormat()).isEqualTo("json"); + }); + } + + @Test + void testConfiguredValues() { + contextRunner + .withPropertyValues("spring.cloud.polaris.audit-log.enabled=true") + .withPropertyValues("spring.cloud.polaris.audit-log.format=json") + .run(context -> { + PolarisAuditLogProperties properties = context.getBean(PolarisAuditLogProperties.class); + assertThat(properties.isEnabled()).isTrue(); + assertThat(properties.getFormat()).isEqualTo("json"); + }); + } +}