Merge branch '3.5.x'

Closes gh-46845
This commit is contained in:
Phillip Webb 2025-08-14 14:46:33 -07:00
commit 094a8610da
2 changed files with 47 additions and 22 deletions

View File

@ -19,7 +19,6 @@ package org.springframework.boot.tracing.autoconfigure;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Stream;
import brave.propagation.B3Propagation;
@ -77,11 +76,19 @@ class CompositePropagationFactory extends Propagation.Factory {
@Override
public TraceContext decorate(TraceContext context) {
return Stream.concat(this.injectors.stream(), this.extractors.stream())
.map((factory) -> factory.decorate(context))
.filter((decorated) -> decorated != context)
.findFirst()
.orElse(context);
for (Propagation.Factory factory : this.injectors.factories) {
TraceContext decorated = factory.decorate(context);
if (decorated != context) {
return decorated;
}
}
for (Propagation.Factory factory : this.extractors.factories) {
TraceContext decorated = factory.decorate(context);
if (decorated != context) {
return decorated;
}
}
return context;
}
/**
@ -180,11 +187,21 @@ class CompositePropagationFactory extends Propagation.Factory {
}
boolean requires128BitTraceId() {
return stream().anyMatch(Propagation.Factory::requires128BitTraceId);
for (Propagation.Factory factory : this.factories) {
if (factory.requires128BitTraceId()) {
return true;
}
}
return false;
}
boolean supportsJoin() {
return stream().allMatch(Propagation.Factory::supportsJoin);
for (Propagation.Factory factory : this.factories) {
if (!factory.supportsJoin()) {
return false;
}
}
return true;
}
List<Propagation<String>> get() {
@ -225,19 +242,24 @@ class CompositePropagationFactory extends Propagation.Factory {
@Override
public <R> TraceContext.Injector<R> injector(Setter<R, String> setter) {
return (traceContext, request) -> this.injectors.stream()
.map((propagation) -> propagation.injector(setter))
.forEach((injector) -> injector.inject(traceContext, request));
return (traceContext, request) -> {
for (Propagation<String> propagation : this.injectors) {
propagation.injector(setter).inject(traceContext, request);
}
};
}
@Override
public <R> TraceContext.Extractor<R> extractor(Getter<R, String> getter) {
return (request) -> this.extractors.stream()
.map((propagation) -> propagation.extractor(getter))
.map((extractor) -> extractor.extract(request))
.filter(Predicate.not(TraceContextOrSamplingFlags.EMPTY::equals))
.findFirst()
.orElse(TraceContextOrSamplingFlags.EMPTY);
return (request) -> {
for (Propagation<String> propagation : this.extractors) {
TraceContextOrSamplingFlags extracted = propagation.extractor(getter).extract(request);
if (!TraceContextOrSamplingFlags.EMPTY.equals(extracted)) {
return extracted;
}
}
return TraceContextOrSamplingFlags.EMPTY;
};
}
}

View File

@ -107,11 +107,14 @@ class CompositeTextMapPropagator implements TextMapPropagator {
if (getter == null) {
return context;
}
Context result = this.extractors.stream()
.map((extractor) -> extractor.extract(context, carrier, getter))
.filter((extracted) -> extracted != context)
.findFirst()
.orElse(context);
Context result = context;
for (TextMapPropagator extractor : this.extractors) {
Context extracted = extractor.extract(context, carrier, getter);
if (extracted != context) {
result = extracted;
break;
}
}
if (this.baggagePropagator != null) {
result = this.baggagePropagator.extract(result, carrier, getter);
}