TraceId 传播到虚拟线程

问题描述 投票:0回答:1

我的应用程序处理上游请求调用 2 个下游系统(通过 REST)。由于调用是可并行的,我想使用虚拟线程,通过

StructuredTaskScope.fork()
Executors.newVirtualThreadPerTaskExecutor()

不幸的是,

traceId
不会自动向下游传播,并且虚拟线程中不存在MDC。

经过研究,这似乎是已知问题,没有简单的解决方案。

我想问我是否可以期望 Spring Boot 将来在跟踪和 MDC 传播到虚拟线程方面提供支持,或者我必须自己管理它

spring-boot trace mdc project-loom
1个回答
0
投票

为了将MDC和traceId传递给VT,我创建了以下虚拟线程工厂

class MdcAndTraceVirtualThreadFactory implements ThreadFactory {

  private static final ObservationRegistry OBSERVATION_REGISTRY = ObservationRegistry.create();

  @Override
  public Thread newThread(Runnable r) {
    Map<String, String> ctx = MDC.getCopyOfContextMap();
    Observation observation = OBSERVATION_REGISTRY.getCurrentObservation();
    return Thread.ofVirtual().factory().newThread(() -> {
        MDC.setContextMap(ctx);
        observation.observe(r);
    });
   }
}

然后我可以将工厂传递给

StructuredTaskScope
Executors.newThreadPerTaskExecutor
并拥有 MDC 和跟踪感知虚拟线程

© www.soinside.com 2019 - 2024. All rights reserved.