Merge pull request #1005 from DataDog/tyler/additional-executors
Fix async dispatch for Jetty QueuedThreadPool
This commit is contained in:
commit
40a7ef6086
|
|
@ -55,10 +55,10 @@ public abstract class AbstractExecutorInstrumentation extends Instrumenter.Defau
|
||||||
"akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinPool",
|
"akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinPool",
|
||||||
"akka.dispatch.MessageDispatcher",
|
"akka.dispatch.MessageDispatcher",
|
||||||
"akka.dispatch.PinnedDispatcher",
|
"akka.dispatch.PinnedDispatcher",
|
||||||
"akka.dispatch.ThreadPoolConfig$ThreadPoolExecutorServiceFactory$$anon$1",
|
|
||||||
"com.google.common.util.concurrent.AbstractListeningExecutorService",
|
"com.google.common.util.concurrent.AbstractListeningExecutorService",
|
||||||
"com.google.common.util.concurrent.MoreExecutors$ListeningDecorator",
|
"com.google.common.util.concurrent.MoreExecutors$ListeningDecorator",
|
||||||
"com.google.common.util.concurrent.MoreExecutors$ScheduledListeningDecorator",
|
"com.google.common.util.concurrent.MoreExecutors$ScheduledListeningDecorator",
|
||||||
|
"io.netty.channel.epoll.EpollEventLoop",
|
||||||
"io.netty.channel.epoll.EpollEventLoopGroup",
|
"io.netty.channel.epoll.EpollEventLoopGroup",
|
||||||
"io.netty.channel.MultithreadEventLoopGroup",
|
"io.netty.channel.MultithreadEventLoopGroup",
|
||||||
"io.netty.channel.nio.NioEventLoop",
|
"io.netty.channel.nio.NioEventLoop",
|
||||||
|
|
@ -67,6 +67,8 @@ public abstract class AbstractExecutorInstrumentation extends Instrumenter.Defau
|
||||||
"io.netty.util.concurrent.AbstractEventExecutor",
|
"io.netty.util.concurrent.AbstractEventExecutor",
|
||||||
"io.netty.util.concurrent.AbstractEventExecutorGroup",
|
"io.netty.util.concurrent.AbstractEventExecutorGroup",
|
||||||
"io.netty.util.concurrent.AbstractScheduledEventExecutor",
|
"io.netty.util.concurrent.AbstractScheduledEventExecutor",
|
||||||
|
"io.netty.util.concurrent.DefaultEventExecutor",
|
||||||
|
"io.netty.util.concurrent.DefaultEventExecutorGroup",
|
||||||
"io.netty.util.concurrent.GlobalEventExecutor",
|
"io.netty.util.concurrent.GlobalEventExecutor",
|
||||||
"io.netty.util.concurrent.MultithreadEventExecutorGroup",
|
"io.netty.util.concurrent.MultithreadEventExecutorGroup",
|
||||||
"io.netty.util.concurrent.SingleThreadEventExecutor",
|
"io.netty.util.concurrent.SingleThreadEventExecutor",
|
||||||
|
|
@ -76,15 +78,14 @@ public abstract class AbstractExecutorInstrumentation extends Instrumenter.Defau
|
||||||
"java.util.concurrent.ForkJoinPool",
|
"java.util.concurrent.ForkJoinPool",
|
||||||
"java.util.concurrent.ScheduledThreadPoolExecutor",
|
"java.util.concurrent.ScheduledThreadPoolExecutor",
|
||||||
"java.util.concurrent.ThreadPoolExecutor",
|
"java.util.concurrent.ThreadPoolExecutor",
|
||||||
"javax.management.NotificationBroadcasterSupport$1",
|
|
||||||
"kotlinx.coroutines.scheduling.CoroutineScheduler",
|
"kotlinx.coroutines.scheduling.CoroutineScheduler",
|
||||||
|
"org.eclipse.jetty.util.thread.QueuedThreadPool",
|
||||||
|
"org.eclipse.jetty.util.thread.ReservedThreadExecutor",
|
||||||
"org.glassfish.grizzly.threadpool.GrizzlyExecutorService",
|
"org.glassfish.grizzly.threadpool.GrizzlyExecutorService",
|
||||||
"play.api.libs.streams.Execution$trampoline$",
|
"play.api.libs.streams.Execution$trampoline$",
|
||||||
"scala.concurrent.forkjoin.ForkJoinPool",
|
"scala.concurrent.forkjoin.ForkJoinPool",
|
||||||
"scala.concurrent.Future$InternalCallbackExecutor$",
|
"scala.concurrent.Future$InternalCallbackExecutor$",
|
||||||
"scala.concurrent.impl.ExecutionContextImpl",
|
"scala.concurrent.impl.ExecutionContextImpl",
|
||||||
"scala.concurrent.impl.ExecutionContextImpl$$anon$1",
|
|
||||||
"scala.concurrent.impl.ExecutionContextImpl$$anon$3",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
final Set<String> executors = new HashSet<>(Config.get().getTraceExecutors());
|
final Set<String> executors = new HashSet<>(Config.get().getTraceExecutors());
|
||||||
|
|
|
||||||
|
|
@ -70,11 +70,6 @@ public final class JavaExecutorInstrumentation extends AbstractExecutorInstrumen
|
||||||
transformers.put(
|
transformers.put(
|
||||||
named("schedule").and(takesArgument(0, Callable.class)),
|
named("schedule").and(takesArgument(0, Callable.class)),
|
||||||
SetCallableStateAdvice.class.getName());
|
SetCallableStateAdvice.class.getName());
|
||||||
transformers.put( // kotlinx.coroutines.scheduling.CoroutineScheduler
|
|
||||||
named("dispatch")
|
|
||||||
.and(takesArgument(0, Runnable.class))
|
|
||||||
.and(takesArgument(1, named("kotlinx.coroutines.scheduling.TaskContext"))),
|
|
||||||
SetExecuteRunnableStateAdvice.class.getName());
|
|
||||||
return transformers;
|
return transformers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
package datadog.trace.instrumentation.java.concurrent;
|
||||||
|
|
||||||
|
import static java.util.Collections.singletonMap;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
|
import com.google.auto.service.AutoService;
|
||||||
|
import datadog.trace.agent.tooling.Instrumenter;
|
||||||
|
import datadog.trace.bootstrap.instrumentation.java.concurrent.State;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import net.bytebuddy.description.method.MethodDescription;
|
||||||
|
import net.bytebuddy.matcher.ElementMatcher;
|
||||||
|
|
||||||
|
@AutoService(Instrumenter.class)
|
||||||
|
public final class NonStandardExecutorInstrumentation extends AbstractExecutorInstrumentation {
|
||||||
|
|
||||||
|
public NonStandardExecutorInstrumentation() {
|
||||||
|
super(EXEC_NAME + ".other");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, String> contextStore() {
|
||||||
|
return singletonMap(Runnable.class.getName(), State.class.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
||||||
|
final Map<ElementMatcher<? super MethodDescription>, String> transformers = new HashMap<>();
|
||||||
|
transformers.put( // kotlinx.coroutines.scheduling.CoroutineScheduler
|
||||||
|
named("dispatch")
|
||||||
|
.and(takesArgument(0, Runnable.class))
|
||||||
|
.and(takesArgument(1, named("kotlinx.coroutines.scheduling.TaskContext"))),
|
||||||
|
JavaExecutorInstrumentation.SetExecuteRunnableStateAdvice.class.getName());
|
||||||
|
transformers.put( // org.eclipse.jetty.util.thread.QueuedThreadPool
|
||||||
|
named("dispatch").and(takesArguments(1)).and(takesArgument(0, Runnable.class)),
|
||||||
|
JavaExecutorInstrumentation.SetExecuteRunnableStateAdvice.class.getName());
|
||||||
|
return transformers;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -100,14 +100,13 @@ class JettyServlet3TestSync extends JettyServlet3Test {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: Async context propagation for org.eclipse.jetty.util.thread.QueuedThreadPool.dispatch currently broken.
|
class JettyServlet3TestAsync extends JettyServlet3Test {
|
||||||
//class JettyServlet3TestAsync extends JettyServlet3Test {
|
|
||||||
//
|
@Override
|
||||||
// @Override
|
Class<Servlet> servlet() {
|
||||||
// Class<Servlet> servlet() {
|
TestServlet3.Async
|
||||||
// TestServlet3.Async
|
}
|
||||||
// }
|
}
|
||||||
//}
|
|
||||||
|
|
||||||
class JettyServlet3TestFakeAsync extends JettyServlet3Test {
|
class JettyServlet3TestFakeAsync extends JettyServlet3Test {
|
||||||
|
|
||||||
|
|
@ -137,25 +136,24 @@ class JettyServlet3TestDispatchImmediate extends JettyDispatchTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: Async context propagation for org.eclipse.jetty.util.thread.QueuedThreadPool.dispatch currently broken.
|
class JettyServlet3TestDispatchAsync extends JettyDispatchTest {
|
||||||
//class JettyServlet3TestDispatchAsync extends JettyDispatchTest {
|
@Override
|
||||||
// @Override
|
Class<Servlet> servlet() {
|
||||||
// Class<Servlet> servlet() {
|
TestServlet3.Async
|
||||||
// TestServlet3.Async
|
}
|
||||||
// }
|
|
||||||
//
|
@Override
|
||||||
// @Override
|
protected void setupServlets(ServletContextHandler context) {
|
||||||
// protected void setupServlets(ServletContextHandler context) {
|
super.setupServlets(context)
|
||||||
// super.setupServlets(context)
|
|
||||||
//
|
addServlet(context, "/dispatch" + SUCCESS.path, TestServlet3.DispatchAsync)
|
||||||
// addServlet(context, "/dispatch" + SUCCESS.path, TestServlet3.DispatchAsync)
|
addServlet(context, "/dispatch" + ERROR.path, TestServlet3.DispatchAsync)
|
||||||
// addServlet(context, "/dispatch" + ERROR.path, TestServlet3.DispatchAsync)
|
addServlet(context, "/dispatch" + EXCEPTION.path, TestServlet3.DispatchAsync)
|
||||||
// addServlet(context, "/dispatch" + EXCEPTION.path, TestServlet3.DispatchAsync)
|
addServlet(context, "/dispatch" + REDIRECT.path, TestServlet3.DispatchAsync)
|
||||||
// addServlet(context, "/dispatch" + REDIRECT.path, TestServlet3.DispatchAsync)
|
addServlet(context, "/dispatch" + AUTH_REQUIRED.path, TestServlet3.DispatchAsync)
|
||||||
// addServlet(context, "/dispatch" + AUTH_REQUIRED.path, TestServlet3.DispatchAsync)
|
addServlet(context, "/dispatch/recursive", TestServlet3.DispatchRecursive)
|
||||||
// addServlet(context, "/dispatch/recursive", TestServlet3.DispatchRecursive)
|
}
|
||||||
// }
|
}
|
||||||
//}
|
|
||||||
|
|
||||||
abstract class JettyDispatchTest extends JettyServlet3Test {
|
abstract class JettyDispatchTest extends JettyServlet3Test {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue