diff --git a/opentracing-spring-web/src/main/java/io/opentracing/contrib/spring/web/webfilter/TracingOperator.java b/opentracing-spring-web/src/main/java/io/opentracing/contrib/spring/web/webfilter/TracingOperator.java index b7aa0b83..8bbb61a6 100644 --- a/opentracing-spring-web/src/main/java/io/opentracing/contrib/spring/web/webfilter/TracingOperator.java +++ b/opentracing-spring-web/src/main/java/io/opentracing/contrib/spring/web/webfilter/TracingOperator.java @@ -20,6 +20,7 @@ import io.opentracing.SpanContext; import io.opentracing.Tracer; import io.opentracing.propagation.Format; +import io.opentracing.propagation.TextMapAdapter; import io.opentracing.tag.Tags; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.web.server.ServerWebExchange; @@ -28,7 +29,10 @@ import reactor.core.publisher.MonoOperator; import reactor.util.context.Context; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; +import java.util.Map; /** * Similar to {@code MonoWebFilterTrace} from spring-cloud-sleuth-core. @@ -72,7 +76,21 @@ public void subscribe(final CoreSubscriber subscriber) { try (final Scope scope = tracer.scopeManager().activate(span, false)) { exchange.getAttributes().put(TracingWebFilter.SERVER_SPAN_CONTEXT, span.context()); - source.subscribe(new TracingSubscriber(subscriber, exchange, context, span, spanDecorators)); + source.subscribe(new TracingSubscriber(subscriber, this.wrappleExchange(span), context, span, spanDecorators)); } } + + private ServerWebExchange wrappleExchange(Span span) { + Map map = new HashMap(); + this.tracer.inject(span.context(), Format.Builtin.HTTP_HEADERS, new TextMapAdapter(map)); + ServerHttpRequest req = this.exchange.getRequest(); + if (map.isEmpty()) { + return this.exchange; + } else { + for (String key : map.keySet()) { + req.mutate().header(key, map.get(key)); + } + } + return this.exchange.mutate().request(req).build(); + } }