Skip to content

Commit c6d8b1a

Browse files
committed
Fix Wavefront and OpenTelemetry auto-configuration
See spring-projectsgh-30156
1 parent cddc774 commit c6d8b1a

File tree

2 files changed

+81
-59
lines changed

2 files changed

+81
-59
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfiguration.java

+51-36
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,13 @@
3838
import org.springframework.boot.SpringBootVersion;
3939
import org.springframework.boot.autoconfigure.AutoConfiguration;
4040
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
41+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
4142
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
4243
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
4344
import org.springframework.boot.context.properties.EnableConfigurationProperties;
4445
import org.springframework.context.annotation.Bean;
4546
import org.springframework.context.annotation.Configuration;
47+
import org.springframework.context.annotation.Import;
4648

4749
/**
4850
* {@link EnableAutoConfiguration Auto-configuration} for OpenTelemetry.
@@ -51,59 +53,72 @@
5153
* @since 3.0.0
5254
*/
5355
@AutoConfiguration(after = ZipkinAutoConfiguration.class)
54-
@ConditionalOnClass(Tracer.class)
55-
@EnableConfigurationProperties(TracingProperties.class)
5656
public class OpenTelemetryAutoConfiguration {
5757

58-
@Bean
59-
@ConditionalOnMissingBean
60-
Tracer tracer(OpenTelemetry openTelemetry) {
61-
// TODO MH: Decide on a name
62-
return openTelemetry.getTracer("org.springframework.boot", SpringBootVersion.getVersion());
63-
}
58+
@Configuration(proxyBeanMethods = false)
59+
@ConditionalOnClass(SdkTracerProvider.class)
60+
@EnableConfigurationProperties(TracingProperties.class)
61+
static class Sdk {
6462

65-
@Bean
66-
@ConditionalOnMissingBean
67-
OpenTelemetry openTelemetry(SdkTracerProvider sdkTracerProvider, ContextPropagators contextPropagators) {
68-
return OpenTelemetrySdk.builder().setTracerProvider(sdkTracerProvider).setPropagators(contextPropagators)
69-
.buildAndRegisterGlobal();
70-
}
63+
@Bean
64+
@ConditionalOnMissingBean
65+
OpenTelemetry openTelemetry(SdkTracerProvider sdkTracerProvider, ContextPropagators contextPropagators) {
66+
return OpenTelemetrySdk.builder().setTracerProvider(sdkTracerProvider).setPropagators(contextPropagators)
67+
.build();
68+
}
7169

72-
@Bean
73-
@ConditionalOnMissingBean
74-
ContextPropagators contextPropagators(List<TextMapPropagator> textMapPropagators) {
75-
return ContextPropagators.create(TextMapPropagator.composite(textMapPropagators));
76-
}
70+
@Bean
71+
@ConditionalOnMissingBean
72+
SdkTracerProvider sdkTracerProvider(List<SpanProcessor> spanProcessors, Sampler sampler) {
73+
SdkTracerProviderBuilder builder = SdkTracerProvider.builder().setSampler(sampler);
74+
for (SpanProcessor spanProcessor : spanProcessors) {
75+
builder.addSpanProcessor(spanProcessor);
76+
}
77+
return builder.build();
78+
}
7779

78-
@Bean
79-
@ConditionalOnMissingBean
80-
SdkTracerProvider sdkTracerProvider(List<SpanProcessor> spanProcessors, Sampler sampler) {
81-
SdkTracerProviderBuilder builder = SdkTracerProvider.builder().setSampler(sampler);
82-
for (SpanProcessor spanProcessor : spanProcessors) {
83-
builder.addSpanProcessor(spanProcessor);
80+
@Bean
81+
@ConditionalOnMissingBean
82+
ContextPropagators contextPropagators(List<TextMapPropagator> textMapPropagators) {
83+
return ContextPropagators.create(TextMapPropagator.composite(textMapPropagators));
8484
}
85-
return builder.build();
86-
}
8785

88-
@Bean
89-
@ConditionalOnMissingBean
90-
Sampler sampler(TracingProperties properties) {
91-
return Sampler.traceIdRatioBased(properties.getSampling().getProbability());
86+
@Bean
87+
@ConditionalOnMissingBean
88+
Sampler sampler(TracingProperties properties) {
89+
return Sampler.traceIdRatioBased(properties.getSampling().getProbability());
90+
}
91+
92+
@Bean
93+
@ConditionalOnMissingBean
94+
SpanProcessor spanProcessor(List<SpanExporter> spanExporter) {
95+
return SpanProcessor.composite(spanExporter.stream()
96+
.map(exporter -> BatchSpanProcessor.builder(exporter).build()).collect(Collectors.toSet()));
97+
}
9298
}
9399

94-
@Bean
95-
@ConditionalOnMissingBean
96-
SpanProcessor spanProcessor(List<SpanExporter> spanExporter) {
97-
return SpanProcessor.composite(spanExporter.stream()
98-
.map(exporter -> BatchSpanProcessor.builder(exporter).build()).collect(Collectors.toSet()));
100+
@Configuration(proxyBeanMethods = false)
101+
@Import(Sdk.class)
102+
@ConditionalOnClass(Tracer.class)
103+
static class TracerConfiguration {
104+
105+
@Bean
106+
@ConditionalOnMissingBean
107+
@ConditionalOnBean(OpenTelemetry.class)
108+
Tracer tracer(OpenTelemetry openTelemetry) {
109+
// TODO MH: Decide on a name
110+
return openTelemetry.getTracer("org.springframework.boot", SpringBootVersion.getVersion());
111+
}
99112
}
100113

101114
@Configuration(proxyBeanMethods = false)
102115
@ConditionalOnClass(OtelTracer.class)
116+
@Import(TracerConfiguration.class)
103117
static class OpenTelemetryMicrometer {
104118

105119
@Bean
106120
@ConditionalOnMissingBean
121+
@ConditionalOnBean(Tracer.class)
107122
OtelTracer otelTracer(Tracer tracer, EventPublisher eventPublisher,
108123
OtelCurrentTraceContext otelCurrentTraceContext) {
109124
return new OtelTracer(tracer, otelCurrentTraceContext, eventPublisher,

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/wavefront/WavefrontAutoConfiguration.java

+30-23
Original file line numberDiff line numberDiff line change
@@ -49,23 +49,15 @@
4949
* @author Moritz Halbritter
5050
*/
5151
@AutoConfiguration(before = { OpenTelemetryAutoConfiguration.class, BraveAutoConfiguration.class })
52-
@ConditionalOnClass(WavefrontSpanHandler.class)
5352
@EnableConfigurationProperties(WavefrontTracingProperties.class)
53+
@ConditionalOnClass(WavefrontSender.class)
5454
class WavefrontAutoConfiguration {
5555

5656
/**
5757
* Default value for application name if {@code spring.application.name} is not set.
5858
*/
5959
private static final String DEFAULT_APPLICATION_NAME = "application";
6060

61-
@Bean
62-
@ConditionalOnMissingBean
63-
WavefrontSpanHandler wavefrontSpanHandler(WavefrontTracingProperties properties, WavefrontSender wavefrontSender,
64-
SpanMetrics spanMetrics, ApplicationTags applicationTags) {
65-
return new WavefrontSpanHandler(properties.getSender().getMaxQueueSize(), wavefrontSender, spanMetrics,
66-
properties.getSource(), applicationTags, Set.of());
67-
}
68-
6961
@Bean
7062
@ConditionalOnMissingBean
7163
WavefrontSender wavefrontSender(WavefrontTracingProperties properties) {
@@ -110,27 +102,42 @@ NoopSpanMetrics meterRegistrySpanMetrics() {
110102
}
111103

112104
@Configuration(proxyBeanMethods = false)
113-
@ConditionalOnClass(SpanHandler.class)
114-
static class WavefrontBrave {
105+
@ConditionalOnClass(WavefrontSpanHandler.class)
106+
// TODO MH: remove '@Bean(destroyMethod = "")' when
107+
// https://github.com/micrometer-metrics/tracing/pull/12 is merged
108+
static class WavefrontMicrometer {
115109

116-
@Bean
110+
@Bean(destroyMethod = "")
117111
@ConditionalOnMissingBean
118-
WavefrontBraveSpanHandler wavefrontBraveSpanHandler(WavefrontSpanHandler wavefrontSpanHandler) {
119-
return new WavefrontBraveSpanHandler(wavefrontSpanHandler);
112+
WavefrontSpanHandler wavefrontSpanHandler(WavefrontTracingProperties properties,
113+
WavefrontSender wavefrontSender, SpanMetrics spanMetrics, ApplicationTags applicationTags) {
114+
return new WavefrontSpanHandler(properties.getSender().getMaxQueueSize(), wavefrontSender, spanMetrics,
115+
properties.getSource(), applicationTags, Set.of());
120116
}
121117

122-
}
118+
@Configuration(proxyBeanMethods = false)
119+
@ConditionalOnClass(SpanHandler.class)
120+
static class WavefrontBrave {
123121

124-
@Configuration(proxyBeanMethods = false)
125-
@ConditionalOnClass(SpanExporter.class)
126-
static class WavefrontOpenTelemetry {
122+
@Bean(destroyMethod = "")
123+
@ConditionalOnMissingBean
124+
WavefrontBraveSpanHandler wavefrontBraveSpanHandler(WavefrontSpanHandler wavefrontSpanHandler) {
125+
return new WavefrontBraveSpanHandler(wavefrontSpanHandler);
126+
}
127127

128-
@Bean
129-
@ConditionalOnMissingBean
130-
WavefrontOtelSpanHandler wavefrontOtelSpanHandler(WavefrontSpanHandler wavefrontSpanHandler) {
131-
return new WavefrontOtelSpanHandler(wavefrontSpanHandler);
132128
}
133129

134-
}
130+
@Configuration(proxyBeanMethods = false)
131+
@ConditionalOnClass(SpanExporter.class)
132+
static class WavefrontOpenTelemetry {
133+
134+
@Bean(destroyMethod = "")
135+
@ConditionalOnMissingBean
136+
WavefrontOtelSpanHandler wavefrontOtelSpanHandler(WavefrontSpanHandler wavefrontSpanHandler) {
137+
return new WavefrontOtelSpanHandler(wavefrontSpanHandler);
138+
}
135139

140+
}
141+
142+
}
136143
}

0 commit comments

Comments
 (0)