Spring Cloud Sleuth 2.0.0.RELEASE Instrument @Scheduled 时没有启动Span的Bug

系统升级到Spring Boot 2.0.3.RELEASE和Spring Cloud Finchley.RELEASE的组合之后,Spring Cloud Sleuth的版本同时升级到了2.0.0.RELEASE;

升级之后,发现@Scheduled注解的方法无法追踪到,查看数据库发现,数据库里有数据,但是对应的记录的start_ts和duration字段是null;

调试Zipkin客户端代码zipkin2.internal.V2SpanWriter,发现timestamp和duration字段是0,如果是0的话,就不会被传给Zipkin Server;

通过对比@Scheduled注解的处理逻辑和rxjava,messaging等的处理逻辑,发现org.springframework.cloud.sleuth.instrument.scheduling.TraceSchedulingAspect中生成Span对象时,没有接着启动(调用span对象的start方法);将TraceSchedulingAspect中的逻辑改为如下之后测试通过:

    private Span startOrContinueRenamedSpan(String spanName) {
        Span currentSpan = this.tracer.currentSpan();
        if (currentSpan != null) {
            return currentSpan.name(spanName);
        }
        return this.tracer.nextSpan().name(spanName).start();
    }

确定了问题出现的原因之后,解决办法随之而来
1. 直接改spring cloud sleuth的源码,然后mvn install source:jar,毕竟不是天天换机器,也基本上是一劳永逸的事情
2. spring.sleuth.scheduled.enabled=false禁用系统的处理逻辑,重新实现TraceSchedulingAspect,并注入到Spring 容器中;

你可能感兴趣的:(Spring,Boot,Spring,Cloud)