From 87411d760c655033beecbf65d509ca4669a29646 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Sat, 15 Jul 2017 10:14:39 +0200 Subject: [PATCH] Ensured lower case of baggage keys fixes #641 --- .../HeaderBasedMessagingExtractor.java | 10 ++++---- .../web/ZipkinHttpSpanExtractor.java | 14 +++++------ .../MessagingSpanExtractorTests.java | 25 ++++++++++++++++--- .../MultipleHopsIntegrationTests.java | 6 ++++- 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/HeaderBasedMessagingExtractor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/HeaderBasedMessagingExtractor.java index 046a05b0f..2c02ef5e9 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/HeaderBasedMessagingExtractor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/HeaderBasedMessagingExtractor.java @@ -1,12 +1,12 @@ package org.springframework.cloud.sleuth.instrument.messaging; -import java.util.Map; -import java.util.Random; - import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.SpanTextMap; import org.springframework.cloud.sleuth.util.TextMapUtil; +import java.util.Map; +import java.util.Random; + /** * Default implementation for messaging * @@ -62,7 +62,7 @@ public class HeaderBasedMessagingExtractor implements MessagingSpanTextMapExtrac setParentIdIfApplicable(carrier, spanBuilder, TraceMessageHeaders.PARENT_ID_NAME); spanBuilder.remote(true); for (Map.Entry entry : carrier.entrySet()) { - if (entry.getKey().startsWith(Span.SPAN_BAGGAGE_HEADER_PREFIX + TraceMessageHeaders.HEADER_DELIMITER)) { + if (entry.getKey().toLowerCase().startsWith(Span.SPAN_BAGGAGE_HEADER_PREFIX + TraceMessageHeaders.HEADER_DELIMITER)) { spanBuilder.baggage(unprefixedKey(entry.getKey()), entry.getValue()); } } @@ -82,7 +82,7 @@ public class HeaderBasedMessagingExtractor implements MessagingSpanTextMapExtrac } private String unprefixedKey(String key) { - return key.substring(key.indexOf(TraceMessageHeaders.HEADER_DELIMITER) + 1); + return key.substring(key.indexOf(TraceMessageHeaders.HEADER_DELIMITER) + 1).toLowerCase(); } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/ZipkinHttpSpanExtractor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/ZipkinHttpSpanExtractor.java index d510e2ca8..5cfe870ea 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/ZipkinHttpSpanExtractor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/ZipkinHttpSpanExtractor.java @@ -1,16 +1,16 @@ package org.springframework.cloud.sleuth.instrument.web; -import java.lang.invoke.MethodHandles; -import java.util.Map; -import java.util.Random; -import java.util.regex.Pattern; - import org.apache.commons.logging.LogFactory; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.SpanTextMap; import org.springframework.cloud.sleuth.util.TextMapUtil; import org.springframework.util.StringUtils; +import java.lang.invoke.MethodHandles; +import java.util.Map; +import java.util.Random; +import java.util.regex.Pattern; + /** * Default implementation, compatible with Zipkin propagation. * @@ -101,7 +101,7 @@ public class ZipkinHttpSpanExtractor implements HttpSpanExtractor { span.exportable(false); } for (Map.Entry entry : carrier.entrySet()) { - if (entry.getKey().startsWith(Span.SPAN_BAGGAGE_HEADER_PREFIX + HEADER_DELIMITER)) { + if (entry.getKey().toLowerCase().startsWith(Span.SPAN_BAGGAGE_HEADER_PREFIX + HEADER_DELIMITER)) { span.baggage(unprefixedKey(entry.getKey()), entry.getValue()); } } @@ -109,7 +109,7 @@ public class ZipkinHttpSpanExtractor implements HttpSpanExtractor { } private String unprefixedKey(String key) { - return key.substring(key.indexOf(HEADER_DELIMITER) + 1); + return key.substring(key.indexOf(HEADER_DELIMITER) + 1).toLowerCase(); } } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/MessagingSpanExtractorTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/MessagingSpanExtractorTests.java index 778731020..594cd3ca8 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/MessagingSpanExtractorTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/MessagingSpanExtractorTests.java @@ -16,16 +16,16 @@ package org.springframework.cloud.sleuth.instrument.messaging; -import java.util.HashMap; -import java.util.Map; -import java.util.Random; import org.junit.Test; - import org.springframework.cloud.sleuth.Span; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.support.MessageBuilder; import org.springframework.util.StringUtils; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + import static org.assertj.core.api.Assertions.fail; import static org.springframework.cloud.sleuth.assertions.SleuthAssertions.then; @@ -64,6 +64,21 @@ public class MessagingSpanExtractorTests { then(span.traceIdString()).isEqualTo(traceId128); } + @Test + public void should_propagate_baggage_headers() { + String traceId128 = "463ac35c9f6413ad48485a3953bb6124"; + + Span span = this.extractor.joinTrace( + new MessagingTextMap(MessageBuilder.withPayload("") + .copyHeaders(headers(traceId128, randomId())))); + + then(span) + .hasBaggageItem("foo", "foofoo") + .hasBaggageItem("bar", "barbar"); + then(span.getBaggageItem("Foo")).isEqualTo("foofoo"); + then(span.getBaggageItem("BAr")).isEqualTo("barbar"); + } + @Test public void should_set_random_spanid_if_header_value_is_invalid() { try { @@ -107,6 +122,8 @@ public class MessagingSpanExtractorTests { if (StringUtils.hasText(parentId)) { map.put(TraceMessageHeaders.PARENT_ID_NAME, parentId); } + map.put("baggage_foo", "foofoo"); + map.put("BAGGAGE_BAR", "barbar"); return new MessageHeaders(map); } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/multiple/MultipleHopsIntegrationTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/multiple/MultipleHopsIntegrationTests.java index 9bb07e185..f51b4aafa 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/multiple/MultipleHopsIntegrationTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/multiple/MultipleHopsIntegrationTests.java @@ -73,11 +73,13 @@ public class MultipleHopsIntegrationTests { //tag::baggage[] Span initialSpan = this.tracer.createSpan("span"); initialSpan.setBaggageItem("foo", "bar"); + initialSpan.setBaggageItem("UPPER_CASE", "someValue"); //end::baggage[] try { HttpHeaders headers = new HttpHeaders(); headers.put("baggage-baz", Collections.singletonList("baz")); + headers.put("BAGGAGE-bizarreCASE", Collections.singletonList("value")); RequestEntity requestEntity = new RequestEntity(headers, HttpMethod.GET, URI.create("http://localhost:" + this.config.port + "/greeting")); this.restTemplate.exchange(requestEntity, String.class); @@ -85,7 +87,9 @@ public class MultipleHopsIntegrationTests { await().atMost(5, SECONDS).until(() -> { then(new ListOfSpans(this.arrayListSpanAccumulator.getSpans())) .everySpanHasABaggage("foo", "bar") - .anySpanHasABaggage("baz", "baz"); + .everySpanHasABaggage("upper_case", "someValue") + .anySpanHasABaggage("baz", "baz") + .anySpanHasABaggage("bizarrecase", "value"); }); } finally { this.tracer.close(initialSpan);