2121import java .util .concurrent .CompletableFuture ;
2222import java .util .concurrent .ConcurrentHashMap ;
2323import java .util .concurrent .atomic .AtomicLong ;
24+ import java .util .concurrent .atomic .AtomicReference ;
2425
2526import static graphql .agent .GraphQLJavaAgent .ExecutionData .DFResultType .DONE_CANCELLED ;
2627import static graphql .agent .GraphQLJavaAgent .ExecutionData .DFResultType .DONE_EXCEPTIONALLY ;
3334public class GraphQLJavaAgent {
3435
3536 public static class ExecutionData {
37+ public final AtomicReference <String > startThread = new AtomicReference <>();
38+ public final AtomicReference <String > endThread = new AtomicReference <>();
3639 public final AtomicLong startExecutionTime = new AtomicLong ();
3740 public final AtomicLong endExecutionTime = new AtomicLong ();
3841 public final Map <ResultPath , String > resultPathToDataLoaderUsed = new ConcurrentHashMap <>();
3942 public final Map <DataLoader , String > dataLoaderToName = new ConcurrentHashMap <>();
4043
4144 private final Map <ResultPath , Long > timePerPath = new ConcurrentHashMap <>();
45+ private final Map <ResultPath , String > invocationThreadPerPath = new ConcurrentHashMap <>();
4246 private final Map <ResultPath , DFResultType > dfResultTypes = new ConcurrentHashMap <>();
4347
4448 public static class BatchLoadingCall {
@@ -150,6 +154,7 @@ public static void agentmain(String agentArgs, Instrumentation inst) {
150154 new AgentBuilder .Default ()
151155 .type (named ("graphql.execution.Execution" ))
152156 .transform ((builder , typeDescription , classLoader , module , protectionDomain ) -> {
157+ // ClassInjector.UsingInstrumentation.of()
153158 // System.out.println("transforming " + typeDescription);
154159 return builder
155160 .visit (Advice .to (ExecutionAdvice .class ).on (nameMatches ("executeOperation" )));
@@ -184,6 +189,7 @@ public static void agentmain(String agentArgs, Instrumentation inst) {
184189 return builder
185190 .visit (Advice .to (DataFetchingEnvironmentAdvice .class ).on (nameMatches ("getDataLoader" )));
186191 })
192+ .disableClassFormatChanges ()
187193 .installOn (inst );
188194
189195 }
@@ -254,12 +260,13 @@ public static void dispatchAll(@Advice.This(typing = Assigner.Typing.DYNAMIC) Ob
254260
255261}
256262
257- class ExecutionAdvice {
263+ class ExecutionAdvice {
258264
259265 @ Advice .OnMethodEnter
260266 public static void executeOperationEnter (@ Advice .Argument (0 ) ExecutionContext executionContext ) {
261267 GraphQLJavaAgent .ExecutionData executionData = new GraphQLJavaAgent .ExecutionData ();
262268 executionData .startExecutionTime .set (System .nanoTime ());
269+ executionData .startThread .set (Thread .currentThread ().getName ());
263270 System .out .println ("execution started for: " + executionContext .getExecutionId ());
264271 executionContext .getGraphQLContext ().put (EXECUTION_TRACKING_KEY , new ExecutionTrackingResult ());
265272
@@ -274,12 +281,15 @@ public static void executeOperationEnter(@Advice.Argument(0) ExecutionContext ex
274281 }
275282
276283 @ Advice .OnMethodExit
277- public static void executeOperationExit (@ Advice .Argument (0 ) ExecutionContext executionContext ) {
278- ExecutionId executionId = executionContext .getExecutionId ();
279- GraphQLJavaAgent .ExecutionData executionData = GraphQLJavaAgent .executionIdToData .get (executionId );
280- executionData .endExecutionTime .set (System .nanoTime ());
281- System .out .println ("execution finished for: " + executionId + " with data " + executionData );
282- System .out .println (executionData .print (executionId .toString ()));
284+ public static void executeOperationExit (@ Advice .Argument (0 ) ExecutionContext executionContext ,
285+ @ Advice .Return (typing = Assigner .Typing .DYNAMIC ) CompletableFuture <Object > result ) {
286+
287+ result .whenComplete (new AfterExecutionHandler (executionContext ));
288+ // ExecutionId executionId = executionContext.getExecutionId();
289+ // GraphQLJavaAgent.ExecutionData executionData = GraphQLJavaAgent.executionIdToData.get(executionId);
290+ // executionData.endExecutionTime.set(System.nanoTime());
291+ // System.out.println("execution finished for: " + executionId + " with data " + executionData);
292+ // System.out.println(executionData.print(executionId.toString()));
283293 // cleanup
284294 // GraphQLJavaAgent.executionDataMap.get(executionId).dataLoaderToName.forEach((dataLoader, s) -> {
285295 // GraphQLJavaAgent.dataLoaderToExecutionId.remove(dataLoader);
0 commit comments