2017-02-22 4 views
0

2 개의 매우 간단한 봄 구름 스트림 응용 프로그램이 있습니다. 메시지 생성자 인 Service3은 binder-kafka를 통해 소비자 인 Service4에 메시지를 보냅니다.spring-cloud-stream을 추적 할 수 없습니다. spring-cloud-sleuth가있는 Listener

그리고 저는 스프링 클라우드 - 룰루를 사용하여 스팬을 추적합니다. Zipkin 서버에서는 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. Service4 내가 그리워 했는가

    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()); 
        } 
    } 
    

Servic4 (message consumer) is not traced

?

+0

마지막으로 내 응용 프로그램과 관련된 2 가지 문제점을 발견했습니다. 1. @EnalbeZipkinStreamServer가있는 응용 프로그램을 추적 할 수 없습니다. 이것은 디자인에 의한 것 같습니다. – RocWay

+0

그래, 우리가 추적자를 추적하고 싶지 않아서 디자인 상으로는 끝났어 –

답변

0

이것은 추측입니다.

카프카에는 메시지 헤더 개념이 없습니다 (범위가 저장되는 곳).

따라서 SCSt는 페이로드에 메시지 헤더를 포함해야합니다.

현재 버전에서는 이러한 방식으로 전송할 헤더를 "옵트 인 (opt-in)"해야합니다.

Documentation here.

spring.cloud.stream.kafka.binder.headers

바인더에 의해 운반됩니다 사용자 정의 헤더의 목록입니다.

기본값 : 비어 있음.

아쉽게도 패턴은 현재 지원되지 않으므로 헤더를 개별적으로 나열해야합니다. 우리는 considering adding support for patterns이며 기본적으로 모든 헤더를 전송합니다.

+0

제안 해 주셔서 감사합니다. @ russell, 네 말이 맞아. 이 질문과 관련된 github 문제를 발견했습니다. https://github.com/spring-cloud/spring-cloud-sleuth/issues/282. – RocWay

+0

오늘 나는 필요한 모든 헤더가 자동으로 전파되는 것을 고쳤다. –

+0

그것은 파기에 많은 시간을 절약하는 데 매우 도움이 될 것이다. :) – RocWay

0

마지막으로 내 응용 프로그램과 관련된 2 가지 문제점을 발견했습니다. 1. @EnalbeZipkinStreamServer가있는 응용 프로그램을 추적 할 수 없습니다. 이것은 디자인에 의한 것 같습니다. 2. 바인더로 kafka를 사용하는 경우 응용 프로그램에서 다음과 같이 헤더를 지정해야합니다.

spring.cloud.stream.kafka.binder.headers[0]=spanId 
    spring.cloud.stream.kafka.binder.headers[1]=spanSampled 
    spring.cloud.stream.kafka.binder.headers[2]=spanProcessId 
    spring.cloud.stream.kafka.binder.headers[3]=spanParentSpanId 
    spring.cloud.stream.kafka.binder.headers[4]=spanTraceId 
    spring.cloud.stream.kafka.binder.headers[5]=spanName 
    spring.cloud.stream.kafka.binder.headers[6]=spanFlags 
+0

오늘 변경 한 사항은 더 이상 필요하지 않습니다. –