Skip to content

Commit

Permalink
Ensure that W3C tracing headers are always set to request.
Browse files Browse the repository at this point in the history
The replaced implementation only replaced existing headers but did not set the headers if they were absent in original request.

Signed-off-by: Juergen Fickel <juergen.fickel@bosch.io>
  • Loading branch information
Juergen Fickel committed Oct 28, 2022
1 parent 3c09dfa commit 0c0fdb2
Showing 1 changed file with 15 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import java.net.URI;
import java.text.MessageFormat;
import java.util.Map;
import java.util.Set;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
Expand Down Expand Up @@ -163,32 +164,22 @@ private static HttpRequest adjustSpanContextHeadersOfRequest(

// Replace W3C tracing headers of original request because from now
// on the newly started span is the parent of all subsequent spans.
return originalRequest.withHeaders(originalHttpRequestHeaders(originalRequest)
.map(requestHeader -> {
final HttpHeader result;
if (isW3cTracingHeader(requestHeader)) {
@Nullable final var spanContextHeaderValue = spanContextHeaders.get(requestHeader.name());
if (null != spanContextHeaderValue) {
result = HttpHeader.parse(requestHeader.name(), spanContextHeaderValue);
} else {
result = requestHeader;
}
} else {
result = requestHeader;
}
return result;
})
.collect(Collectors.toList()));
}

private static Stream<HttpHeader> originalHttpRequestHeaders(final HttpRequest httpRequest) {
final var originalRequestHeaders = httpRequest.getHeaders();
return StreamSupport.stream(originalRequestHeaders.spliterator(), false);
var result = originalRequest;
for (final var w3cTracingHeader : getW3cTracingHeaders(spanContextHeaders)) {
result = result.removeHeader(w3cTracingHeader.name()).addHeader(w3cTracingHeader);
}
return result;
}

private static boolean isW3cTracingHeader(final HttpHeader header) {
return header.is(DittoHeaderDefinition.W3C_TRACESTATE.getKey()) ||
header.is(DittoHeaderDefinition.W3C_TRACEPARENT.getKey());
private static Set<HttpHeader> getW3cTracingHeaders(final Map<String, String> spanContextHeaders) {
return Stream.of(DittoHeaderDefinition.W3C_TRACEPARENT, DittoHeaderDefinition.W3C_TRACESTATE)
.map(DittoHeaderDefinition::getKey)
.filter(spanContextHeaders::containsKey)
.map(w3cTracingHeaderName -> HttpHeader.parse(
w3cTracingHeaderName,
spanContextHeaders.get(w3cTracingHeaderName)
))
.collect(Collectors.toSet());
}

@Nullable
Expand Down

0 comments on commit 0c0fdb2

Please sign in to comment.