Spring Cloud Sleuth v2.2.3如何将TraceId传播到另一个线程

时间:2020-06-12 13:32:13

标签: java multithreading spring-boot spring-cloud-sleuth

我正在尝试设置多线程应用程序的跟踪。我已经设置了ThreadPool:

ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setThreadNamePrefix("XXXXXX-");
        executor.initialize();

所以有几个线程。线程之一正在侦听SQS队列:

@Scheduled(fixedRateString = "${processing.queue.period:60000}")
public void process() {
..........................................................................
    for (SQSMessage sqsMessage : sqsMessages) {
        String messageReceiptHandle = null;
        try {
             messageReceiptHandle = sqsMessage.getReceiptHandle();
             processMessage(sqsMessage);
        }                               
    }
}
..........................................................................

    public void processMessage(SQSMessage sqsMessage) throws InterruptedException {

        log.debug("Start Processing request: '{}'.", sqsMessage);
        monitoringWorker.addEntityForMonitoring(sqsMessage, processor);
        processor.processMessage(sqsMessage);
        monitoringWorker.removeEntityForMonitoring(sqsMessage.getStagingPrefix());
    }

在此代码段中

monitoringWorker.addEntityForMonitoring(sqsMessage, processor);

sqsMessage传播到另一个调度程序:

@Component
public class MonitoringWorker {

   private List<EntityToMonitor> entitiesForMonitoring = new ArrayList<>();

   public void addEntityForMonitoring(AssetSQSMessage assetSQSMessage, AssetProcessorService service) {
        entitiesForMonitoring.add(new EntityToMonitor(assetSQSMessage, service));
    }

   @Scheduled(fixedDelay = 1000)
   public void monitor() {
        for (EntityToMonitor entity : entitiesForMonitoring) {
            log.info("testmessage");
        }
   }

这个想法是追踪从SQS接收消息到处理逻辑结束的所有过程 但是所有线程都具有不同的跟踪ID,而MonitoringWorker开始处理消息时,它将采用另一个具有不同跟踪ID的线程:

enter image description here

如何保持相同的traceid,Spring Cloud Sleuth 2.2.3中的spanid可能会有所不同

2 个答案:

答案 0 :(得分:1)

使用LazyTraceExecutor。此类将traceId传播到新线程,并在该过程中创建新的spanId。

有关更多详细信息,请参见

答案 1 :(得分:0)

好的,有人可以告诉我如何在Spring Cloud Sleuth 2.2.3中获取Trace上下文。不能仅使用@Autowire Trace对象,如google示例中所述

相关问题