无法用spring-cloud-sleuth追踪spring-cloud-stream Listener

时间:2017-02-22 09:02:42

标签: spring trace spring-cloud-stream spring-cloud-sleuth

我有两个非常简单的spring-cloud-stream应用程序。消息生成器Service3通过binder-kafka向消费者Service4发送消息。

我使用spring-cloud-sleuth来追踪它们之间的跨度。但是只有zip3服务器中的Service3中有跨度。 Service4没有跨度显示。

  1. 服务3

    dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    
    compile('org.springframework.cloud:spring-cloud-starter-sleuth')
    
    // Marshal spans over a Spring cloud stream binder
    compile('org.springframework.cloud:spring-cloud-sleuth-stream')
    compile('org.springframework.cloud:spring-cloud-stream-binder-kafka')
    
    testCompile group: 'junit', name: 'junit', version: '4.11'
    } 
    
    
    @SpringBootApplication
    public class Service3  {
        public static void main(String[] args) {
            SpringApplication.run(Service3.class, args);
        }
    }
    
    
    @Controller
    @EnableBinding(Source.class)
    public class WebController {
    
        @Autowired
        private Source source;
    
    
        @GetMapping("/srv4")
        private String getSrv4Info(){
            String msg = "Hello Service 4";
            this.source.output().send(MessageBuilder.withPayload(msg).build());
    
            return "srv4";
        }
    }
    
  2. 服务4

    dependencies {
        compile('org.springframework.boot:spring-boot-starter-web')
    
        compile('org.springframework.cloud:spring-cloud-starter-sleuth')
    
        // Marshal spans over a Spring cloud stream binder
        compile('org.springframework.cloud:spring-cloud-sleuth-stream')
        compile('org.springframework.cloud:spring-cloud-sleuth-zipkin-stream')
        compile('org.springframework.cloud:spring-cloud-stream-binder-kafka')
    
        runtime('io.zipkin.java:zipkin-autoconfigure-ui')
    
        testCompile group: 'junit', name: 'junit', version: '4.11'
    }
    
    @SpringBootApplication
    @EnableZipkinStreamServer
    public class Service4 {
        public static void main(String[] args) {
            SpringApplication.run(Service4.class, args);
        }
    }
    
    @EnableBinding(Sink.class)
    public class MsgReceiver {
        @StreamListener(Sink.INPUT)
        private void listen(Message<String> msg){
            System.out.println(msg.getPayload());
        }
    }
    
  3. Servic4 (message consumer) is not traced

    我错过了什么?

2 个答案:

答案 0 :(得分:0)

这是猜测。

Kafka没有消息标题的概念(存储跨度的地方)。

因此,SCSt必须在有效负载中嵌入消息头。

当前版本要求您选择&#34;选择加入&#34;你希望以这种方式传输哪些标题。

Documentation here

  

spring.cloud.stream.kafka.binder.headers

     

将由活页夹传输的自定义标头列表。

     

默认值:空。

不幸的是,目前不支持模式,您必须单独列出标题。我们considering adding support for patterns和/或默认传输所有标头。

答案 1 :(得分:0)

最后,我发现了与我的应用程序相关的2个问题。 1.无法跟踪@EnalbeZipkinStreamServer的应用程序。这看起来像是一个设计。 2.如果将kafka用作绑定程序,则应用程序应将标题指定为以下内容:

class Apod
  def self.get_apod_info
    apod_url = "https://api.nasa.gov/planetary/apod?api_key=#{ENV['NASA_API_KEY']}"
    response = Net::HTTP.get(URI(apod_url))
    JSON.parse(response)
  end
end