From af7df61b1795a66bc7d18ec3fa1a9c3ca4688893 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sat, 28 Apr 2018 23:46:49 +0800 Subject: [PATCH] Adds proto3 encoding Note: Zipkin server 2.8+ is required to be running for this to work. --- pom.xml | 2 +- spring-cloud-sleuth-dependencies/pom.xml | 2 +- .../zipkin2/sender/RestTemplateSender.java | 3 +++ .../sender/RestTemplateSenderTest.java | 25 ++++++++++++++++--- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 97e759646..c10cbb7c2 100644 --- a/pom.xml +++ b/pom.xml @@ -272,7 +272,7 @@ Elmhurst.BUILD-SNAPSHOT 2.0.0.BUILD-SNAPSHOT 2.0.0.BUILD-SNAPSHOT - 4.19.0 + 4.19.2 2.0.0.RELEASE diff --git a/spring-cloud-sleuth-dependencies/pom.xml b/spring-cloud-sleuth-dependencies/pom.xml index c24f1265f..83114c800 100644 --- a/spring-cloud-sleuth-dependencies/pom.xml +++ b/spring-cloud-sleuth-dependencies/pom.xml @@ -30,7 +30,7 @@ spring-cloud-sleuth-dependencies Spring Cloud Sleuth Dependencies - 0.30.0 + 0.30.3 diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/RestTemplateSender.java b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/RestTemplateSender.java index eae9406c4..d1a21ebda 100644 --- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/RestTemplateSender.java +++ b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/RestTemplateSender.java @@ -51,6 +51,9 @@ final class RestTemplateSender extends Sender { if (encoder.equals(JSON_V2)) { this.mediaType = MediaType.APPLICATION_JSON; this.url = baseUrl + (baseUrl.endsWith("/") ? "" : "/") + "api/v2/spans"; + } else if (this.encoding == Encoding.PROTO3) { + this.mediaType = MediaType.parseMediaType("application/x-protobuf"); + this.url = baseUrl + (baseUrl.endsWith("/") ? "" : "/") + "api/v2/spans"; } else if (this.encoding == Encoding.JSON) { this.mediaType = MediaType.APPLICATION_JSON; this.url = baseUrl + (baseUrl.endsWith("/") ? "" : "/") + "api/v1/spans"; diff --git a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/sender/RestTemplateSenderTest.java b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/sender/RestTemplateSenderTest.java index bf32f37e0..021ab6c5f 100644 --- a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/sender/RestTemplateSenderTest.java +++ b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/sender/RestTemplateSenderTest.java @@ -19,16 +19,20 @@ package org.springframework.cloud.sleuth.zipkin2.sender; import java.util.stream.Stream; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; import org.junit.Rule; import org.junit.Test; import org.springframework.web.client.RestTemplate; import zipkin2.Call; import zipkin2.Endpoint; import zipkin2.Span; +import zipkin2.codec.Encoding; +import zipkin2.codec.SpanBytesEncoder; import static java.util.stream.Collectors.toList; import static org.assertj.core.api.Assertions.assertThat; import static zipkin2.codec.SpanBytesEncoder.JSON_V2; +import static zipkin2.codec.SpanBytesEncoder.PROTO3; public class RestTemplateSenderTest { static final Span SPAN = Span.newBuilder() @@ -64,9 +68,24 @@ public class RestTemplateSenderTest { .isEqualTo("[" + new String(JSON_V2.encode(SPAN), "UTF-8") + "]"); } + @Test public void proto3() throws Exception { + server.enqueue(new MockResponse()); + sender = new RestTemplateSender(new RestTemplate(), endpoint, PROTO3); + + send(SPAN).execute(); + + RecordedRequest request = server.takeRequest(); + assertThat(request.getHeader("Content-Type")) + .isEqualTo("application/x-protobuf"); + + // proto3 encoding of ListOfSpan is simply a repeated span entry + assertThat(request.getBody().readByteArray()) + .containsExactly(SpanBytesEncoder.PROTO3.encode(SPAN)); + } + Call send(Span... spans) { - return sender.sendSpans(Stream.of(spans) - .map(JSON_V2::encode) - .collect(toList())); + SpanBytesEncoder bytesEncoder = sender.encoding() == Encoding.JSON + ? SpanBytesEncoder.JSON_V2 : SpanBytesEncoder.PROTO3; + return sender.sendSpans(Stream.of(spans).map(bytesEncoder::encode).collect(toList())); } }