在Spring中同时获取MongoDB的指标与追踪数据
MongoDB追踪与指标配置疑问解答
问题背景
我按照Spring官方文档配置了MongoDB的追踪功能,添加了如下Bean:
@Bean MongoClientSettingsBuilderCustomizer mongoMetricsSynchronousContextProvider(ObservationRegistry registry) { return (clientSettingsBuilder) -> { clientSettingsBuilder.contextProvider(ContextProviderFactory.create(registry)) .addCommandListener(new MongoObservationCommandListener(registry)); }; }
同时添加了配置:
# Disable Spring Boot's autoconfigured tracing management.metrics.mongo.command.enabled=false # Enable it manually management.tracing.enabled=true
目前已能在Zipkin中看到追踪数据,但存在两个疑问:
- 为什么需要禁用
MongoMetricsAutoConfiguration中的自动配置Bean? - 如何同时获取MongoDB的指标与追踪数据?
Spring提供的MongoMetricsAutoConfiguration核心代码如下:
@AutoConfiguration(before = MongoAutoConfiguration.class, after = { MetricsAutoConfiguration.class, CompositeMeterRegistryAutoConfiguration.class }) @ConditionalOnClass(MongoClientSettings.class) @ConditionalOnBean(MeterRegistry.class) public class MongoMetricsAutoConfiguration { @ConditionalOnClass(MongoMetricsCommandListener.class) @ConditionalOnProperty(name = "management.metrics.mongo.command.enabled", havingValue = "true", matchIfMissing = true) static class MongoCommandMetricsConfiguration { @Bean MongoClientSettingsBuilderCustomizer mongoMetricsCommandListenerClientSettingsBuilderCustomizer( MongoMetricsCommandListener mongoMetricsCommandListener) { return (clientSettingsBuilder) -> clientSettingsBuilder.addCommandListener(mongoMetricsCommandListener); } }
解答
一、为什么需要禁用自动配置的Bean?
MongoMetricsCommandListener是Spring Boot自动配置用来收集MongoDB指标的监听器,MongoObservationCommandListener则是处理追踪(Observation)逻辑的监听器,两者都通过MongoClientSettingsBuilderCustomizer向MongoClient注入命令监听逻辑。- 默认情况下
management.metrics.mongo.command.enabled为true,会自动注册MongoMetricsCommandListener对应的Customizer。如果不禁用它,同时手动添加MongoObservationCommandListener的Customizer,会出现重复监听Mongo命令的情况,可能导致指标/追踪数据重复上报,甚至引发上下文传递的冲突。 - 早期版本中,两类监听器的上下文处理逻辑存在兼容性问题,禁用自动配置的指标监听器可以避免这类冲突,确保追踪流程正常运行。
二、如何同时获取MongoDB的指标与追踪数据?
无需完全禁用自动配置,只需调整配置和Bean定义,让两类监听器共存:
恢复指标自动配置
移除management.metrics.mongo.command.enabled=false配置,让MongoMetricsAutoConfiguration自动注册MongoMetricsCommandListener。修改自定义Bean,聚焦追踪逻辑
自定义的MongoClientSettingsBuilderCustomizer只需负责配置追踪相关内容,不需要重复处理指标:@Bean MongoClientSettingsBuilderCustomizer mongoTracingCustomizer(ObservationRegistry registry) { return (clientSettingsBuilder) -> { // 设置上下文提供者,确保追踪上下文能传递到Mongo命令执行链路中 clientSettingsBuilder.contextProvider(ContextProviderFactory.create(registry)); // 添加追踪专用监听器 clientSettingsBuilder.addCommandListener(new MongoObservationCommandListener(registry)); }; }保留必要配置
保持management.tracing.enabled=true,同时确保指标基础配置(如management.metrics.enabled=true,默认已开启)正常。
通过上述配置,MongoMetricsCommandListener负责收集指标数据,MongoObservationCommandListener负责处理追踪链路,两者通过各自的Customizer注入到MongoClient,即可同时获取完整的指标与追踪数据,且不会产生冲突。
内容的提问来源于stack exchange,提问作者2shar
相关产品推荐
相关产品推荐

