feat(syslog): 为三个生产模块增加启动版本标识
- syslog-serve 增加 SYSLOG_BUILD_READY 启动日志 - syslog-consumer 增加 SYSLOG_BUILD_READY 启动日志 - 更新 syslog-consumer-rule 代码修订标识至 v63 - 输出模块名、代码修订号、运行环境及关键非敏感配置 - 支持通过容器日志快速确认实际部署的 JAR 版本 - 补充 syslog-serve 和 syslog-consumer 启动日志测试 - 不输出数据库密码、API 凭据等敏感信息 - 不修改 Maven POM 配置
This commit is contained in:
+44
@@ -0,0 +1,44 @@
|
||||
package com.config;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
||||
import org.springframework.context.event.EventListener;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/** 在应用完全就绪后打印不可由现场配置覆盖的代码修订标识和关键开关。 */
|
||||
@Slf4j
|
||||
@Component
|
||||
public class SyslogBuildStartupLogger {
|
||||
|
||||
// 用于确认当前运行的原始日志存储模块 JAR,后续功能修订时同步更新。
|
||||
static final String CODE_REVISION = "RAW_STORAGE_PIPELINE_V20260917_63";
|
||||
private final Environment environment;
|
||||
|
||||
public SyslogBuildStartupLogger(Environment environment) {
|
||||
this.environment = environment;
|
||||
}
|
||||
|
||||
@EventListener(ApplicationReadyEvent.class)
|
||||
public void onApplicationReady() {
|
||||
log.info("[SYSLOG_BUILD_READY] {}", startupSummary());
|
||||
}
|
||||
|
||||
String startupSummary() {
|
||||
return "codeRevision=" + CODE_REVISION
|
||||
+ ", application=syslog-consumer"
|
||||
+ ", profiles=" + String.join(",", environment.getActiveProfiles())
|
||||
+ ", serverPort=" + value("server.port", "8089")
|
||||
+ ", contextPath=" + value("server.servlet.context-path", "/xdrservice")
|
||||
+ ", rawConsumerEnabled=" + value("syslog.raw-consumer.enabled", "false")
|
||||
+ ", kafkaTopic=" + value("spring.kafka.consumer.topic", "agent-syslog-topic")
|
||||
+ ", kafkaGroupId=" + value("spring.kafka.consumer.group-id", "agent-syslog-group")
|
||||
+ ", rawWriteSchema=" + value("influxdb.raw.write-schema", "V2")
|
||||
+ ", rawReadMode=" + value("influxdb.raw.read-mode", "V1_V2")
|
||||
+ ", reliabilityVersion=" + value("syslog.reliability.consumer-version", "1.0.0");
|
||||
}
|
||||
|
||||
private String value(String key, String fallback) {
|
||||
return environment.getProperty(key, fallback);
|
||||
}
|
||||
}
|
||||
@@ -169,11 +169,17 @@ analysis.realtime.check-interval-seconds: 10
|
||||
analysis.realtime.allowed-lateness-seconds=${ANALYSIS_REALTIME_ALLOWED_LATENESS_SECONDS:120}
|
||||
|
||||
# 迟到标准化告警使用独立状态表重放已完成规则窗口,不回退正常实时分析 checkpoint。
|
||||
# 是否启用迟到告警规则重放;关闭后不再扫描和重放历史窗口,不影响正常实时分析。
|
||||
analysis.late-replay.enabled=${ANALYSIS_LATE_REPLAY_ENABLED:true}
|
||||
# 两轮扫描之间的固定间隔,单位毫秒;5000 表示上一轮结束 5 秒后再执行下一轮。
|
||||
analysis.late-replay.scan-interval-ms=${ANALYSIS_LATE_REPLAY_SCAN_INTERVAL_MS:5000}
|
||||
# 通知桶和重放窗口被实例领取后的租约时长,单位秒;超时未完成时可由其他扫描重新领取。
|
||||
analysis.late-replay.lease-seconds=${ANALYSIS_LATE_REPLAY_LEASE_SECONDS:1800}
|
||||
# 每轮最多展开的迟到数据分钟桶数;将分钟桶转换为受影响的历史规则窗口。
|
||||
analysis.late-replay.max-buckets-per-scan=${ANALYSIS_LATE_REPLAY_MAX_BUCKETS_PER_SCAN:100}
|
||||
# 每轮最多执行的历史规则窗口数;用于限制单轮重放对数据库和规则引擎的压力。
|
||||
analysis.late-replay.max-windows-per-scan=${ANALYSIS_LATE_REPLAY_MAX_WINDOWS_PER_SCAN:10}
|
||||
# 重放失败后的再次尝试等待时间,单位秒。
|
||||
analysis.late-replay.retry-delay-seconds=${ANALYSIS_LATE_REPLAY_RETRY_DELAY_SECONDS:30}
|
||||
|
||||
# 关联分析规则达梦安全版子查询模式开关(默认false,生产环境达梦安全版设为true)
|
||||
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
package com.config;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import ch.qos.logback.classic.Logger;
|
||||
import ch.qos.logback.classic.spi.ILoggingEvent;
|
||||
import ch.qos.logback.core.read.ListAppender;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.mock.env.MockEnvironment;
|
||||
|
||||
class SyslogBuildStartupLoggerTest {
|
||||
@Test
|
||||
void logsCodeRevisionAndEffectiveOverrides() {
|
||||
MockEnvironment environment = new MockEnvironment()
|
||||
.withProperty("syslog.raw-consumer.enabled", "true")
|
||||
.withProperty("spring.kafka.consumer.topic", "prod-syslog")
|
||||
.withProperty("spring.kafka.consumer.group-id", "raw-store")
|
||||
.withProperty("influxdb.raw.write-schema", "V2_ONLY");
|
||||
environment.setActiveProfiles("prod");
|
||||
SyslogBuildStartupLogger reporter = new SyslogBuildStartupLogger(environment);
|
||||
Logger logger = (Logger) LoggerFactory.getLogger(SyslogBuildStartupLogger.class);
|
||||
ListAppender<ILoggingEvent> appender = new ListAppender<>();
|
||||
appender.start();
|
||||
logger.addAppender(appender);
|
||||
try {
|
||||
reporter.onApplicationReady();
|
||||
assertEquals(1, appender.list.size());
|
||||
String message = appender.list.get(0).getFormattedMessage();
|
||||
assertTrue(message.contains("[SYSLOG_BUILD_READY] codeRevision="
|
||||
+ SyslogBuildStartupLogger.CODE_REVISION));
|
||||
assertTrue(message.contains("application=syslog-consumer"));
|
||||
assertTrue(message.contains("profiles=prod"));
|
||||
assertTrue(message.contains("rawConsumerEnabled=true"));
|
||||
assertTrue(message.contains("kafkaTopic=prod-syslog"));
|
||||
assertTrue(message.contains("kafkaGroupId=raw-store"));
|
||||
assertTrue(message.contains("rawWriteSchema=V2_ONLY"));
|
||||
} finally {
|
||||
logger.detachAppender(appender);
|
||||
appender.stop();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void usesSafeDefaultsAndIgnoresConfiguredRevision() {
|
||||
String summary = new SyslogBuildStartupLogger(new MockEnvironment()
|
||||
.withProperty("codeRevision", "fake")).startupSummary();
|
||||
assertTrue(summary.contains("codeRevision=" + SyslogBuildStartupLogger.CODE_REVISION));
|
||||
assertFalse(summary.contains("codeRevision=fake"));
|
||||
assertTrue(summary.contains("rawConsumerEnabled=false"));
|
||||
assertTrue(summary.contains("rawWriteSchema=V2"));
|
||||
assertTrue(summary.contains("rawReadMode=V1_V2"));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user