feat(syslog-consumer-rule): 增加慢批次全链路耗时诊断

- 批次端到端耗时达到500ms时输出SLOW_SYSLOG_BATCH日志
- 记录入口统计、规则计算、InfluxDB和达梦写入的分阶段耗时
- 使用MANUAL_IMMEDIATE模式准确统计Kafka offset同步提交耗时
- 记录Kafka提交状态、异常类型和端到端总耗时
- 在常规批次日志中补充ingressMs
- 增加Kafka监听器ACK模式回归测试
This commit is contained in:
王绍宏
2026-09-13 04:01:01 +08:00
parent d3bc083b88
commit c392f7b47f
4 changed files with 208 additions and 10 deletions
@@ -0,0 +1,67 @@
package com.config;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.kafka.ConcurrentKafkaListenerContainerFactoryConfigurer;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.kafka.listener.ContainerProperties;
import org.springframework.kafka.listener.DefaultErrorHandler;
import java.util.Collections;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
class KafkaReliabilityConfigTest {
@Test
void retryListenerCommitsInsideAcknowledgment() {
KafkaReliabilityConfig config = new KafkaReliabilityConfig();
ConcurrentKafkaListenerContainerFactoryConfigurer configurer =
mock(ConcurrentKafkaListenerContainerFactoryConfigurer.class);
@SuppressWarnings("unchecked")
ConsumerFactory<Object, Object> consumerFactory = mock(ConsumerFactory.class);
ConcurrentKafkaListenerContainerFactory<Object, Object> factory =
config.kafkaListenerContainerFactory(configurer, consumerFactory,
config.syslogDefaultErrorHandler());
assertEquals(ContainerProperties.AckMode.MANUAL_IMMEDIATE,
factory.getContainerProperties().getAckMode());
}
@Test
void rawListenerCommitsInsideAcknowledgmentForAccurateSlowBatchTiming() {
KafkaReliabilityConfig config = new KafkaReliabilityConfig();
ConcurrentKafkaListenerContainerFactoryConfigurer configurer =
mock(ConcurrentKafkaListenerContainerFactoryConfigurer.class);
@SuppressWarnings("unchecked")
ConsumerFactory<Object, Object> consumerFactory = mock(ConsumerFactory.class);
DefaultErrorHandler errorHandler = config.syslogDefaultErrorHandler();
ConcurrentKafkaListenerContainerFactory<Object, Object> factory =
config.rawKafkaListenerContainerFactory(
configurer, consumerFactory, errorHandler, 3);
assertEquals(ContainerProperties.AckMode.MANUAL_IMMEDIATE,
factory.getContainerProperties().getAckMode());
}
@Test
void largeListenerAlsoCommitsInsideAcknowledgment() {
KafkaReliabilityConfig config = new KafkaReliabilityConfig();
ConcurrentKafkaListenerContainerFactoryConfigurer configurer =
mock(ConcurrentKafkaListenerContainerFactoryConfigurer.class);
@SuppressWarnings("unchecked")
ConsumerFactory<Object, Object> consumerFactory = mock(ConsumerFactory.class);
when(consumerFactory.getConfigurationProperties()).thenReturn(Collections.emptyMap());
ConcurrentKafkaListenerContainerFactory<Object, Object> factory =
config.largeRawKafkaListenerContainerFactory(configurer, consumerFactory,
config.syslogDefaultErrorHandler(), 1, 5, 33554432, 67108864);
assertEquals(ContainerProperties.AckMode.MANUAL_IMMEDIATE,
factory.getContainerProperties().getAckMode());
}
}