Skip to content

Commit 13c7805

Browse files
committed
WIP
1 parent d9fc7b2 commit 13c7805

File tree

4 files changed

+230
-93
lines changed

4 files changed

+230
-93
lines changed

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

Lines changed: 154 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.boot.actuate.autoconfigure.tracing;
1818

19+
import java.util.ArrayList;
20+
import java.util.Collections;
1921
import java.util.List;
2022

2123
import brave.CurrentSpanCustomizer;
@@ -34,18 +36,21 @@
3436
import brave.baggage.CorrelationScopeDecorator;
3537
import brave.context.slf4j.MDCScopeDecorator;
3638
import brave.handler.SpanHandler;
39+
import brave.propagation.B3Propagation;
3740
import brave.propagation.CurrentTraceContext;
3841
import brave.propagation.CurrentTraceContext.ScopeDecorator;
3942
import brave.propagation.CurrentTraceContextCustomizer;
4043
import brave.propagation.Propagation.Factory;
4144
import brave.propagation.ThreadLocalCurrentTraceContext;
4245
import brave.sampler.Sampler;
46+
import io.micrometer.tracing.BaggageManager;
4347
import io.micrometer.tracing.brave.bridge.BraveBaggageManager;
4448
import io.micrometer.tracing.brave.bridge.BraveCurrentTraceContext;
4549
import io.micrometer.tracing.brave.bridge.BravePropagator;
4650
import io.micrometer.tracing.brave.bridge.BraveSpanCustomizer;
4751
import io.micrometer.tracing.brave.bridge.BraveTracer;
4852
import io.micrometer.tracing.brave.bridge.CompositeSpanHandler;
53+
import io.micrometer.tracing.brave.bridge.W3CPropagation;
4954
import io.micrometer.tracing.exporter.SpanExportingPredicate;
5055
import io.micrometer.tracing.exporter.SpanFilter;
5156
import io.micrometer.tracing.exporter.SpanReporter;
@@ -76,8 +81,6 @@
7681
@ConditionalOnEnabledTracing
7782
public class BraveAutoConfiguration {
7883

79-
private static final BraveBaggageManager BRAVE_BAGGAGE_MANAGER = new BraveBaggageManager();
80-
8184
/**
8285
* Default value for application name if {@code spring.application.name} is not set.
8386
*/
@@ -92,19 +95,25 @@ CompositeSpanHandler compositeSpanHandler(ObjectProvider<SpanExportingPredicate>
9295
filters.orderedStream().toList());
9396
}
9497

98+
@Bean
99+
@ConditionalOnMissingBean
100+
BraveBaggageManager braveBaggageManager() {
101+
return new BraveBaggageManager();
102+
}
103+
95104
@Bean
96105
@ConditionalOnMissingBean
97106
public Tracing braveTracing(Environment environment, List<SpanHandler> spanHandlers,
98107
List<TracingCustomizer> tracingCustomizers, CurrentTraceContext currentTraceContext,
99108
Factory propagationFactory, Sampler sampler) {
100109
String applicationName = environment.getProperty("spring.application.name", DEFAULT_APPLICATION_NAME);
101110
Builder builder = Tracing.newBuilder()
102-
.currentTraceContext(currentTraceContext)
103-
.traceId128Bit(true)
104-
.supportsJoin(false)
105-
.propagationFactory(propagationFactory)
106-
.sampler(sampler)
107-
.localServiceName(applicationName);
111+
.currentTraceContext(currentTraceContext)
112+
.traceId128Bit(true)
113+
.supportsJoin(false)
114+
.propagationFactory(propagationFactory)
115+
.sampler(sampler)
116+
.localServiceName(applicationName);
108117
spanHandlers.forEach(builder::addSpanHandler);
109118
for (TracingCustomizer tracingCustomizer : tracingCustomizers) {
110119
tracingCustomizer.customize(builder);
@@ -138,8 +147,9 @@ public Sampler braveSampler(TracingProperties properties) {
138147

139148
@Bean
140149
@ConditionalOnMissingBean(io.micrometer.tracing.Tracer.class)
141-
BraveTracer braveTracerBridge(brave.Tracer tracer, CurrentTraceContext currentTraceContext) {
142-
return new BraveTracer(tracer, new BraveCurrentTraceContext(currentTraceContext), BRAVE_BAGGAGE_MANAGER);
150+
BraveTracer braveTracerBridge(brave.Tracer tracer, CurrentTraceContext currentTraceContext,
151+
BraveBaggageManager braveBaggageManager) {
152+
return new BraveTracer(tracer, new BraveCurrentTraceContext(currentTraceContext), braveBaggageManager);
143153
}
144154

145155
@Bean
@@ -166,8 +176,20 @@ static class BraveNoBaggageConfiguration {
166176

167177
@Bean
168178
@ConditionalOnMissingBean
169-
Factory propagationFactory(TracingProperties tracing) {
170-
return new CompositePropagationFactory(tracing.getPropagation().getType(), null, injectorFactories, extractorFactories);
179+
ExtractorFactories extractorFactories() {
180+
return ExtractorFactories.of(PropagationFactoryFactory.factoriesFor(PropagationType.values()));
181+
}
182+
183+
@Bean
184+
@ConditionalOnMissingBean
185+
InjectorFactories injectorFactories(TracingProperties tracing) {
186+
return InjectorFactories.of(PropagationFactoryFactory.factoriesFor(tracing.getPropagation().getType()));
187+
}
188+
189+
@Bean
190+
@ConditionalOnMissingBean
191+
Factory propagationFactory(InjectorFactories injectorFactories, ExtractorFactories extractorFactories) {
192+
return new CompositePropagationFactory(injectorFactories, extractorFactories);
171193
}
172194

173195
}
@@ -182,11 +204,26 @@ static class BraveBaggageConfiguration {
182204
this.tracingProperties = tracingProperties;
183205
}
184206

207+
@Bean
208+
@ConditionalOnMissingBean
209+
ExtractorFactories extractorFactories(BraveBaggageManager braveBaggageManager) {
210+
return ExtractorFactories
211+
.of(PropagationFactoryFactory.factoriesFor(braveBaggageManager, PropagationType.values()));
212+
}
213+
214+
@Bean
215+
@ConditionalOnMissingBean
216+
InjectorFactories injectorFactories(BraveBaggageManager braveBaggageManager) {
217+
return InjectorFactories.of(PropagationFactoryFactory.factoriesFor(braveBaggageManager,
218+
this.tracingProperties.getPropagation().getType()));
219+
}
220+
185221
@Bean
186222
@ConditionalOnMissingBean
187223
BaggagePropagation.FactoryBuilder propagationFactoryBuilder(
188-
ObjectProvider<BaggagePropagationCustomizer> baggagePropagationCustomizers) {
189-
Factory delegate = new CompositePropagationFactory(this.tracingProperties.getPropagation().getType(), BRAVE_BAGGAGE_MANAGER, injectorFactories, extractorFactories);
224+
ObjectProvider<BaggagePropagationCustomizer> baggagePropagationCustomizers,
225+
InjectorFactories injectorFactories, ExtractorFactories extractorFactories) {
226+
Factory delegate = new CompositePropagationFactory(injectorFactories, extractorFactories);
190227
FactoryBuilder builder = BaggagePropagation.newFactoryBuilder(delegate);
191228
baggagePropagationCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
192229
return builder;
@@ -227,8 +264,8 @@ CorrelationScopeCustomizer correlationFieldsCorrelationScopeCustomizer() {
227264
List<String> correlationFields = this.tracingProperties.getBaggage().getCorrelation().getFields();
228265
for (String field : correlationFields) {
229266
builder.add(CorrelationScopeConfig.SingleCorrelationField.newBuilder(BaggageField.create(field))
230-
.flushOnUpdate()
231-
.build());
267+
.flushOnUpdate()
268+
.build());
232269
}
233270
};
234271
}
@@ -241,4 +278,105 @@ ScopeDecorator correlationScopeDecorator(CorrelationScopeDecorator.Builder build
241278

242279
}
243280

281+
/**
282+
* A collection of {@link Factory factories} used for trace context extraction.
283+
*
284+
* @author Moritz Halbritter
285+
* @since 3.0.8
286+
*/
287+
public interface ExtractorFactories extends Iterable<Factory> {
288+
289+
/**
290+
* Creates an {@link ExtractorFactories} object from the given factories.
291+
* @param factories factories
292+
* @return {@link ExtractorFactories} object
293+
*/
294+
static ExtractorFactories of(Iterable<Factory> factories) {
295+
return factories::iterator;
296+
}
297+
298+
static ExtractorFactories of(PropagationType... types) {
299+
return of(PropagationFactoryFactory.factoriesFor(types));
300+
}
301+
302+
static ExtractorFactories of(BaggageManager baggageManager, PropagationType... types) {
303+
return of(PropagationFactoryFactory.factoriesFor(baggageManager, types));
304+
}
305+
306+
}
307+
308+
/**
309+
* A collection of {@link Factory factories} used for trace context injection.
310+
*
311+
* @author Moritz Halbritter
312+
* @since 3.0.8
313+
*/
314+
public interface InjectorFactories extends Iterable<Factory> {
315+
316+
/**
317+
* Creates an {@link InjectorFactories} object from the given factories.
318+
* @param factories factories
319+
* @return {@link InjectorFactories} object
320+
*/
321+
static InjectorFactories of(Iterable<Factory> factories) {
322+
return factories::iterator;
323+
}
324+
325+
static InjectorFactories of(PropagationType... types) {
326+
return of(PropagationFactoryFactory.factoriesFor(types));
327+
}
328+
329+
static InjectorFactories of(BaggageManager baggageManager, PropagationType... types) {
330+
return of(PropagationFactoryFactory.factoriesFor(baggageManager, types));
331+
}
332+
333+
}
334+
335+
/**
336+
* Factory for {@link Factory propagation factories}.
337+
*/
338+
private static class PropagationFactoryFactory {
339+
340+
private PropagationFactoryFactory() {
341+
}
342+
343+
/**
344+
* Creates a new B3 propagation factory.
345+
* @return B3 propagation factory.
346+
*/
347+
private static Factory b3() {
348+
return B3Propagation.newFactoryBuilder().injectFormat(B3Propagation.Format.SINGLE_NO_PARENT).build();
349+
}
350+
351+
/**
352+
* Creates a new W3C propagation factory.
353+
* @param baggageManager baggage manager to use, or {@code null}
354+
* @return W3C Propagation propagation factory
355+
*/
356+
private static W3CPropagation w3c(BaggageManager baggageManager) {
357+
return (baggageManager != null) ? new W3CPropagation(baggageManager, Collections.emptyList())
358+
: new W3CPropagation();
359+
}
360+
361+
private static Factory forType(BaggageManager baggageManager, PropagationType type) {
362+
return switch (type) {
363+
case B3 -> PropagationFactoryFactory.b3();
364+
case W3C -> PropagationFactoryFactory.w3c(baggageManager);
365+
};
366+
}
367+
368+
private static List<Factory> factoriesFor(PropagationType... types) {
369+
return factoriesFor(null, types);
370+
}
371+
372+
private static List<Factory> factoriesFor(BaggageManager baggageManager, PropagationType... types) {
373+
List<Factory> result = new ArrayList<>(types.length);
374+
for (PropagationType type : types) {
375+
result.add(forType(baggageManager, type));
376+
}
377+
return result;
378+
}
379+
380+
}
381+
244382
}

0 commit comments

Comments
 (0)