From 07d2aa87c90f197e2fe209c557656691fedbeac5 Mon Sep 17 00:00:00 2001 From: Tim Ysewyn Date: Sun, 13 Jan 2019 17:13:42 +0100 Subject: [PATCH] Updated zipkin config to support multiple span reporters/senders --- .../zipkin2/ZipkinAutoConfiguration.java | 6 +- .../ZipkinKafkaSenderConfiguration.java | 2 +- .../ZipkinRabbitSenderConfiguration.java | 2 +- ...ZipkinRestTemplateSenderConfiguration.java | 2 +- .../zipkin2/ZipkinAutoConfigurationTests.java | 61 +++++++++++++++++++ 5 files changed, 68 insertions(+), 5 deletions(-) diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinAutoConfiguration.java b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinAutoConfiguration.java index b5eef2af2..c18dcbd86 100644 --- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinAutoConfiguration.java +++ b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinAutoConfiguration.java @@ -27,6 +27,7 @@ import zipkin2.reporter.ReporterMetrics; import zipkin2.reporter.Sender; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -72,10 +73,11 @@ public class ZipkinAutoConfiguration { * Accepts a sender so you can plug-in any standard one. Returns a Reporter so you can * also replace with a standard one. */ - @Bean + @Bean("zipkinReporter") @ConditionalOnMissingBean public Reporter reporter(ReporterMetrics reporterMetrics, - ZipkinProperties zipkin, Sender sender, BytesEncoder spanBytesEncoder) { + ZipkinProperties zipkin, @Qualifier("zipkinSender") Sender sender, + BytesEncoder spanBytesEncoder) { return AsyncReporter.builder(sender).queuedMaxSpans(1000) // historical // constraint. Note: // AsyncReporter diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinKafkaSenderConfiguration.java b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinKafkaSenderConfiguration.java index 0bb3116c8..204f28040 100644 --- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinKafkaSenderConfiguration.java +++ b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinKafkaSenderConfiguration.java @@ -42,7 +42,7 @@ class ZipkinKafkaSenderConfiguration { @Value("${spring.zipkin.kafka.topic:zipkin}") private String topic; - @Bean + @Bean("zipkinSender") Sender kafkaSender(KafkaProperties config) { Map properties = config.buildProducerProperties(); properties.put("key.serializer", ByteArraySerializer.class.getName()); diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinRabbitSenderConfiguration.java b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinRabbitSenderConfiguration.java index 3ce3bb491..c705bf453 100644 --- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinRabbitSenderConfiguration.java +++ b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinRabbitSenderConfiguration.java @@ -36,7 +36,7 @@ class ZipkinRabbitSenderConfiguration { @Value("${spring.zipkin.rabbitmq.queue:zipkin}") private String queue; - @Bean + @Bean("zipkinSender") Sender rabbitSender(CachingConnectionFactory connectionFactory, RabbitProperties config) { return RabbitMQSender.newBuilder() diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinRestTemplateSenderConfiguration.java b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinRestTemplateSenderConfiguration.java index c634228bc..6b0430715 100644 --- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinRestTemplateSenderConfiguration.java +++ b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinRestTemplateSenderConfiguration.java @@ -50,7 +50,7 @@ class ZipkinRestTemplateSenderConfiguration { @Autowired ZipkinUrlExtractor extractor; - @Bean + @Bean("zipkinSender") @ConditionalOnMissingBean public Sender restTemplateSender(ZipkinProperties zipkin, ZipkinRestTemplateCustomizer zipkinRestTemplateCustomizer) { diff --git a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinAutoConfigurationTests.java b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinAutoConfigurationTests.java index 0d30d2a27..0da2fd8b3 100644 --- a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinAutoConfigurationTests.java +++ b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinAutoConfigurationTests.java @@ -16,6 +16,8 @@ package org.springframework.cloud.sleuth.zipkin2; +import java.util.List; + import brave.Span; import brave.Tracing; import brave.handler.FinishedSpanHandler; @@ -38,6 +40,9 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.mock.env.MockEnvironment; +import zipkin2.Call; +import zipkin2.codec.Encoding; +import zipkin2.reporter.Reporter; import zipkin2.reporter.Sender; import zipkin2.reporter.amqp.RabbitMQSender; import zipkin2.reporter.kafka11.KafkaSender; @@ -184,6 +189,25 @@ public class ZipkinAutoConfigurationTests { this.context.close(); } + @Test + public void supportsMultipleReporters() { + this.context = new AnnotationConfigApplicationContext(); + environment().setProperty("spring.zipkin.base-url", + this.server.url("/").toString()); + this.context.register(ZipkinAutoConfiguration.class, + PropertyPlaceholderAutoConfiguration.class, TraceAutoConfiguration.class, + MultipleReportersConfig.class); + this.context.refresh(); + + then(this.context.getBeansOfType(Sender.class)).hasSize(2); + then(this.context.getBeansOfType(Sender.class)).containsKeys("zipkinSender", "otherSender"); + + then(this.context.getBeansOfType(Reporter.class)).hasSize(2); + then(this.context.getBeansOfType(Reporter.class)).containsKeys("zipkinReporter", "otherReporter"); + + this.context.close(); + } + @Configuration protected static class Config { @@ -221,4 +245,41 @@ public class ZipkinAutoConfigurationTests { } + @Configuration + protected static class MultipleReportersConfig { + + @Bean + Reporter otherReporter() { + return span -> { + + }; + } + + @Bean + Sender otherSender() { + return new Sender() { + @Override + public Encoding encoding() { + return null; + } + + @Override + public int messageMaxBytes() { + return 0; + } + + @Override + public int messageSizeInBytes(List encodedSpans) { + return 0; + } + + @Override + public Call sendSpans(List encodedSpans) { + return null; + } + }; + } + + } + }