From 6948088085d36e4d1a216fbaf4bed33efa0903b7 Mon Sep 17 00:00:00 2001 From: svenz Date: Mon, 29 May 2017 13:49:55 -0700 Subject: [PATCH] https://github.com/spring-cloud/spring-cloud-sleuth/issues/597 Fix Http headers as tags --- .../instrument/web/HttpTraceKeysInjector.java | 5 +- .../web/HttpTraceKeysInjectorUnitTests.java | 67 +++++++++++++++++++ 2 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/HttpTraceKeysInjectorUnitTests.java diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpTraceKeysInjector.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpTraceKeysInjector.java index 7fd87dfba..1ee286c04 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpTraceKeysInjector.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpTraceKeysInjector.java @@ -73,8 +73,9 @@ public class HttpTraceKeysInjector { private void addRequestTagsFromHeaders(Map> headers) { for (String name : this.traceKeys.getHttp().getHeaders()) { - for (Map.Entry> entry : headers.entrySet()) { - addTagForEntry(name, entry.getValue()); + Collection values = headers.get(name); + if(values != null) { + addTagForEntry(name, values); } } } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/HttpTraceKeysInjectorUnitTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/HttpTraceKeysInjectorUnitTests.java new file mode 100644 index 000000000..0427b2ef9 --- /dev/null +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/HttpTraceKeysInjectorUnitTests.java @@ -0,0 +1,67 @@ +package org.springframework.cloud.sleuth.instrument.web; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.net.URL; +import java.util.Arrays; +import java.util.Map; +import java.util.Random; + +import org.junit.Before; +import org.junit.Test; +import org.springframework.cloud.sleuth.DefaultSpanNamer; +import org.springframework.cloud.sleuth.NoOpSpanReporter; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.SpanNamer; +import org.springframework.cloud.sleuth.SpanReporter; +import org.springframework.cloud.sleuth.TraceKeys; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.log.Slf4jSpanLogger; +import org.springframework.cloud.sleuth.log.SpanLogger; +import org.springframework.cloud.sleuth.sampler.AlwaysSampler; +import org.springframework.cloud.sleuth.trace.DefaultTracer; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; + + +public class HttpTraceKeysInjectorUnitTests { + TraceKeys traceKeys = new TraceKeys(); + private SpanNamer spanNamer = new DefaultSpanNamer(); + private SpanLogger spanLogger = new Slf4jSpanLogger("skip"); + private SpanReporter spanReporter = new NoOpSpanReporter(); + AlwaysSampler sampler = new AlwaysSampler(); + Tracer tracer = new DefaultTracer(sampler, new Random(), spanNamer, spanLogger, spanReporter, traceKeys); + HttpTraceKeysInjector injector; + + @Before + public void setup() { + assertNotNull(tracer); + injector = new HttpTraceKeysInjector(tracer, traceKeys); + } + + @Test + public void testHttpAttributes() throws Exception { + traceKeys.getHttp().setHeaders(Arrays.asList("Accept", "User-Agent", "Content-Type"));; + + URL url = new URL("http://localhost:8080/"); + HttpHeaders headers = new HttpHeaders(); + headers.add("User-Agent", "Test"); + headers.put("Accept", Arrays.asList(MediaType.TEXT_PLAIN_VALUE, MediaType.TEXT_XML_VALUE)); + headers.add("Content-Length", "0"); + headers.add("X-B3-TraceId","3bb9a1fa9e70fdbd763261a53162f330"); + headers.add("X-B3-SpanId", "763261a53162f330"); + headers.add("X-B3-Sampled","1"); + headers.add("X-Span-Name", "http:/"); + + Span span = tracer.createSpan("TestSpan", sampler); + injector.addRequestTags(url.toString(), url.getHost(), url.getPath(), HttpMethod.GET.name(), headers ); + Map tags = span.tags(); + assertEquals("Test", tags.get("http.user-agent")); + assertEquals("'text/plain','text/xml'", tags.get("http.accept")); + assertNull(tags.get("http.content-type")); + + } +}