From 6f85526096e11acc6c3cd9388c71526650ff4832 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 20 Oct 2017 12:47:15 +0200 Subject: [PATCH] Setting headers instead of adding them for Zuul; fixes #755 --- ...acheHttpClientRibbonRequestCustomizer.java | 2 +- .../OkHttpClientRibbonRequestCustomizer.java | 2 +- ...ttpClientRibbonRequestCustomizerTests.java | 15 +++++++++++++++ ...ttpClientRibbonRequestCustomizerTests.java | 15 +++++++++++++++ ...estClientRibbonRequestCustomizerTests.java | 19 +++++++++++++++++++ 5 files changed, 51 insertions(+), 2 deletions(-) diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/ApacheHttpClientRibbonRequestCustomizer.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/ApacheHttpClientRibbonRequestCustomizer.java index 7ab591946..2119d0065 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/ApacheHttpClientRibbonRequestCustomizer.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/ApacheHttpClientRibbonRequestCustomizer.java @@ -54,7 +54,7 @@ class ApacheHttpClientRibbonRequestCustomizer extends SpanInjectingRibbonRequest } @Override public void put(String key, String value) { - context.addHeader(key, value); + context.setHeader(key, value); } }; } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/OkHttpClientRibbonRequestCustomizer.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/OkHttpClientRibbonRequestCustomizer.java index c6948533d..282020596 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/OkHttpClientRibbonRequestCustomizer.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/OkHttpClientRibbonRequestCustomizer.java @@ -57,7 +57,7 @@ class OkHttpClientRibbonRequestCustomizer extends SpanInjectingRibbonRequestCust } @Override public void put(String key, String value) { - context.addHeader(key, value); + context.header(key, value); } }; } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/zuul/ApacheHttpClientRibbonRequestCustomizerTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/zuul/ApacheHttpClientRibbonRequestCustomizerTests.java index f7d1ff935..61df97910 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/zuul/ApacheHttpClientRibbonRequestCustomizerTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/zuul/ApacheHttpClientRibbonRequestCustomizerTests.java @@ -71,7 +71,22 @@ public class ApacheHttpClientRibbonRequestCustomizerTests { thenThereIsAHeaderWithNameAndValue(request, Span.PROCESS_ID_NAME, "processId"); } + @Test + public void should_not_set_duplicate_tracing_headers_on_the_context_when_there_is_a_span() throws Exception { + RequestBuilder requestBuilder = RequestBuilder.create("GET"); + + this.customizer.inject(this.span, this.customizer.toSpanTextMap(requestBuilder)); + this.customizer.inject(this.span, this.customizer.toSpanTextMap(requestBuilder)); + + HttpUriRequest request = requestBuilder.build(); + thenThereIsAHeaderWithNameAndValue(request, Span.SPAN_ID_NAME, "0000000000000001"); + thenThereIsAHeaderWithNameAndValue(request, Span.TRACE_ID_NAME, "0000000000000002"); + thenThereIsAHeaderWithNameAndValue(request, Span.PARENT_ID_NAME, "0000000000000003"); + thenThereIsAHeaderWithNameAndValue(request, Span.PROCESS_ID_NAME, "processId"); + } + private void thenThereIsAHeaderWithNameAndValue(HttpUriRequest request, String name, String value) { + then(request.getHeaders(name)).hasSize(1); Header header = request.getFirstHeader(name); then(header.getName()).isEqualTo(name); then(header.getValue()).isEqualTo(value); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/zuul/OkHttpClientRibbonRequestCustomizerTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/zuul/OkHttpClientRibbonRequestCustomizerTests.java index 0b5e868fe..3de339c8c 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/zuul/OkHttpClientRibbonRequestCustomizerTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/zuul/OkHttpClientRibbonRequestCustomizerTests.java @@ -68,7 +68,22 @@ public class OkHttpClientRibbonRequestCustomizerTests { thenThereIsAHeaderWithNameAndValue(request, Span.PROCESS_ID_NAME, "processId"); } + @Test + public void should_not_set_duplicate_tracing_headers_on_the_context_when_there_is_a_span() throws Exception { + Request.Builder requestBuilder = requestBuilder(); + + this.customizer.inject(this.span, this.customizer.toSpanTextMap(requestBuilder)); + this.customizer.inject(this.span, this.customizer.toSpanTextMap(requestBuilder)); + + Request request = requestBuilder.build(); + thenThereIsAHeaderWithNameAndValue(request, Span.SPAN_ID_NAME, "0000000000000001"); + thenThereIsAHeaderWithNameAndValue(request, Span.TRACE_ID_NAME, "0000000000000002"); + thenThereIsAHeaderWithNameAndValue(request, Span.PARENT_ID_NAME, "0000000000000003"); + thenThereIsAHeaderWithNameAndValue(request, Span.PROCESS_ID_NAME, "processId"); + } + private void thenThereIsAHeaderWithNameAndValue(Request request, String name, String value) { + then(request.headers(name)).hasSize(1); then(request.header(name)).isEqualTo(value); } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/zuul/RestClientRibbonRequestCustomizerTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/zuul/RestClientRibbonRequestCustomizerTests.java index 286bc2a4c..cf5d78f4d 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/zuul/RestClientRibbonRequestCustomizerTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/zuul/RestClientRibbonRequestCustomizerTests.java @@ -16,6 +16,8 @@ package org.springframework.cloud.sleuth.instrument.zuul; +import java.util.stream.Collectors; + import com.netflix.client.http.HttpRequest; import org.junit.Test; @@ -68,7 +70,24 @@ public class RestClientRibbonRequestCustomizerTests { thenThereIsAHeaderWithNameAndValue(request, Span.PROCESS_ID_NAME, "processId"); } + @Test + public void should_not_set_duplicate_tracing_headers_on_the_context_when_there_is_a_span() throws Exception { + HttpRequest.Builder requestBuilder = requestBuilder(); + + this.customizer.inject(this.span, this.customizer.toSpanTextMap(requestBuilder)); + this.customizer.inject(this.span, this.customizer.toSpanTextMap(requestBuilder)); + + HttpRequest request = requestBuilder.build(); + thenThereIsAHeaderWithNameAndValue(request, Span.SPAN_ID_NAME, "0000000000000001"); + thenThereIsAHeaderWithNameAndValue(request, Span.TRACE_ID_NAME, "0000000000000002"); + thenThereIsAHeaderWithNameAndValue(request, Span.PARENT_ID_NAME, "0000000000000003"); + thenThereIsAHeaderWithNameAndValue(request, Span.PROCESS_ID_NAME, "processId"); + } + private void thenThereIsAHeaderWithNameAndValue(HttpRequest request, String name, String value) { + then(request.getHttpHeaders().getAllHeaders() + .stream().filter(stringStringEntry -> stringStringEntry.getKey().equals(name)).collect( + Collectors.toList())).hasSize(1); then(request.getHttpHeaders().getFirstValue(name)).isEqualTo(value); }