diff --git a/instrumentation/executors/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/executors/ExecutorMatchers.java b/instrumentation/executors/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/executors/ExecutorMatchers.java index 40d2e50c1ae1..1c3d7497ab35 100644 --- a/instrumentation/executors/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/executors/ExecutorMatchers.java +++ b/instrumentation/executors/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/executors/ExecutorMatchers.java @@ -78,6 +78,7 @@ final class ExecutorMatchers { "java.util.concurrent.ForkJoinPool", "java.util.concurrent.ScheduledThreadPoolExecutor", "java.util.concurrent.ThreadPoolExecutor", + "java.util.concurrent.ThreadPerTaskExecutor", "org.apache.tomcat.util.threads.ThreadPoolExecutor", "org.eclipse.jetty.util.thread.QueuedThreadPool", // dispatch() covered in the jetty // module diff --git a/instrumentation/executors/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/executors/ExecutorInstrumentationTest.java b/instrumentation/executors/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/executors/ExecutorInstrumentationTest.java index aa05c1b6af0f..77a3d0ad7636 100644 --- a/instrumentation/executors/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/executors/ExecutorInstrumentationTest.java +++ b/instrumentation/executors/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/executors/ExecutorInstrumentationTest.java @@ -7,6 +7,8 @@ import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -24,6 +26,8 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledForJreRange; +import org.junit.jupiter.api.condition.JRE; import org.junit.jupiter.api.extension.RegisterExtension; abstract class ExecutorInstrumentationTest @@ -47,6 +51,24 @@ static class ThreadPoolExecutorTest extends ExecutorInstrumentationTest { + VirtualThreadExecutorTest() { + super(newVirtualThreadPerTaskExecutor()); + } + + private static ExecutorService newVirtualThreadPerTaskExecutor() { + Method newVirtualThreadPerTaskExecutor; + try { + newVirtualThreadPerTaskExecutor = + Executors.class.getMethod("newVirtualThreadPerTaskExecutor"); + return (ExecutorService) newVirtualThreadPerTaskExecutor.invoke(null); + } catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException e) { + throw new IllegalStateException("Should not happen on Java 21+", e); + } + } + } + static class WorkStealingPoolTest extends ExecutorInstrumentationTest { public WorkStealingPoolTest() { super(Executors.newWorkStealingPool(2));