这个问题最初是在这里报告的:https://github.com/spring-projects/spring-boot/pull/34508#issuecomment-1557438909,作者:@chicobento:
@jonatan-ivanov 您好,我们在将其集成到我们的项目中时面临一些问题。场景如下:
- 我们有一个自定义类,它实现
SpanExporter
接口并在内部包装我们自己的可变对象OtlpHttpSpanExporter
- 这样,我们需要阻止
OtlpAutoConfiguration
创建OtlpHttpSpanExporter
Bean。但是, @ConditionalOnMissingBean 仅基于 OtlpHttpSpanExporter 和 OtlpGrpcSpanExporter bean,这不是我们的情况,因为我们实现了SpanExporter
接口并且不能从其OtlpHttpSpanExporter
最终的继承我尝试过的一些可能的问题解决方案:
- 删除
OtlpAutoConfiguration
:此行为是由内部库添加的,因此我无法轻松删除OtlpAutoConfiguration
而不影响使用我们的库的应用程序- 替换
SpanProcessor
: 因为该OpenTelemetryAutoConfiguration.otelSpanProcessor
方法没有@ConditionalOnMissingBean
.我无法轻松地将 替换为会忽略Bean 提供的SpanProcessor
自定义 BeanOtlpHttpSpanExporter
OtlpAutoConfiguration
- 替换
OpenTelemetryAutoConfiguration.otelSdkTracerProvider
:这不起作用,因为它将SpanProcessor.otelSpanProcessor
始终实例化 BatchSpanProcessor 并启动其线程。我必须关闭它您对我如何克服这个问题还有其他建议吗?
我想知道当前的工厂方法是否
OtlpAutoConfiguration.otlpHttpSpanExporter
太具有侵入性,因为它总是提供一个SpanExporter
Bean,即使应用程序已经定义了自己的 BeanSpanExporter
?我们可以把它改成简单的@ConditionalOnMissingBean(SpanExporter.class)
吗?