spring-cloud-sleuth 通过 spring-cloud-stream 和 rabbitmq-binder 跟踪:如何完成跟踪

spring-cloud-sleuth Trace via spring-cloud-stream with rabbitmq-binder: how to finish the Trace

我已经使用 spring-cloud-stream 和 RabbitMQ-binders 和 spring-cloud-sleuth 设置了一个演示项目。

dependencies {
    annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" // for @ConfigurationProperties, make sure compileJava.dependsOn(processResources)
    compile 'org.springframework.boot:spring-boot-starter-security'
    compile 'org.springframework.boot:spring-boot-starter-actuator'
    compile 'org.springframework.cloud:spring-cloud-starter-config'
    compile 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    compile 'org.springframework.cloud:spring-cloud-starter-sleuth'
    compile "org.springframework.boot:spring-boot-starter-web-services" // I also have some REST endpoints
    compile 'org.springframework.cloud:spring-cloud-stream-binder-rabbit'
}

我有一个预定的spring-云流源:

@Scheduled(fixedDelay = 2500, initialDelay = 500)
@HystrixCommand(fallbackMethod = "fallbackTimerMessageSource")
@SendTo(SourceChannels.OUTPUT)
public void timerMessageSource() {
     ...

然后是中间层,类似于最终的汇层,如下所示:

@Autowired
private Tracer sleuthTracer;


@StreamListener(SinkChannels.INPUT)
public void sinked(MessageDTO payload) {
    logger.info("[{}]sinked by {} with '{}'", instanceIndex, Sink.class.getSimpleName(), payload);
    ...

我很高兴地看到 TraceId 和 SpanId 自动通过 RabbitMQ 队列跨所有进程传递到日志文件中的接收器进程:

2018-03-20 20:55:10.580  INFO [circuitbreakers_sink,820fcab9830191c7,a388974ea57dac3a,true] 43379 --- [k27JdIWK8axsQ-1] c.d.minimal.circuitbreaker.sinks.Sink    : [0]sinked by Sink with 'Tue Mar 20 20:55:06 CET 2018 MESSAGE: 'fromSource transformed by tier1 transformed by tier2' modifiers: ' modBy:tier1:i0 modBy:tier2:i0''

所以在这一点上,最终的接收器层想要(明确地)发出信号,这个跟踪(我的业务流程的实例)被 finish 编辑在这里。

如何发出整个 Trace 已完成的信号?

我只找到 sleuthTracer.currentSpan().finish(); 但这只完成了 Span ... 没有明确表示整个跟踪在这里完成。

我错过了什么吗? (对 zipkin、brave 和 sleuth 很陌生)

zipkin 中没有trace finishing 的概念。跟踪中的跨度可以开始和结束。我们不会在不同主机上启动和停止跨度,因此未完成的跨度可能是偶然的。喜欢可以在这里多聊https://gitter.im/spring-cloud/spring-cloud-sleuth