我的应用程序广泛使用CompletableFuture.supplyAsync(() -> someService(context, args));
&我们依靠supplyAsync使用ForkJoinPool.commonPool()
线程池来让服务在自己的线程中运行。
有没有一种方法可以在打开的跟踪中检测someService调用,而不需要将自定义的Executor
作为参数传入supplyAsync()?我正在使用Spring和Jaeger,并且有下面的依赖关系
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>
<version>3.2.2</version>
</dependency>
2条答案
按热度按时间qyzbxkaa1#
据我所知,
ForkJoinPool.commonPool()
的设计使得实际上不可能用一个插装版本以编程方式替换该池。因此,唯一的解决方法是通过字节码操作来实现。OpenTelemetry Java Automatic Instrumentation库执行了很多魔法,能够通过异步/并发原语正确地传播上下文,您可能想给予一下。
beq87vna2#
了解如何使用ForkJoinWorkerThreadFactory和ForkJoinWorkerThread设计/操作ForkJoinPool,并成为本地Java功能,其中工作线程在Spring Context之外执行。向ForkJoinPool执行添加跟踪的唯一方法是自定义Task本身。
这里是blog在Sping Boot 3x中使用Micrometer添加跟踪到ForkJoinPool Tasks执行。