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