Spring Boot 打开ForkJoinPool.commonPool()的跟踪检测

jexiocij  于 2023-06-29  发布在  Spring
关注(0)|答案(2)|浏览(169)

我的应用程序广泛使用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>
qyzbxkaa

qyzbxkaa1#

据我所知,ForkJoinPool.commonPool()的设计使得实际上不可能用一个插装版本以编程方式替换该池。因此,唯一的解决方法是通过字节码操作来实现。
OpenTelemetry Java Automatic Instrumentation库执行了很多魔法,能够通过异步/并发原语正确地传播上下文,您可能想给予一下。

beq87vna

beq87vna2#

了解如何使用ForkJoinWorkerThreadFactory和ForkJoinWorkerThread设计/操作ForkJoinPool,并成为本地Java功能,其中工作线程在Spring Context之外执行。向ForkJoinPool执行添加跟踪的唯一方法是自定义Task本身。
这里是blog在Sping Boot 3x中使用Micrometer添加跟踪到ForkJoinPool Tasks执行。

相关问题