@@ -42,16 +42,18 @@ public static class ExecutionData {
4242 public final Map <ResultPath , String > resultPathToDataLoaderUsed = new ConcurrentHashMap <>();
4343 public final Map <DataLoader , String > dataLoaderToName = new ConcurrentHashMap <>();
4444
45- private final Map <ResultPath , Long > timePerPath = new ConcurrentHashMap <>();
46- private final Map <ResultPath , String > invocationThreadPerPath = new ConcurrentHashMap <>();
45+ public final Map <ResultPath , Long > timePerPath = new ConcurrentHashMap <>();
46+ public final Map <ResultPath , Long > finishedTimePerPath = new ConcurrentHashMap <>();
47+ public final Map <ResultPath , String > finishedThreadPerPath = new ConcurrentHashMap <>();
48+ public final Map <ResultPath , String > invocationThreadPerPath = new ConcurrentHashMap <>();
4749 private final Map <ResultPath , DFResultType > dfResultTypes = new ConcurrentHashMap <>();
4850
4951 public static class BatchLoadingCall {
5052 public BatchLoadingCall (int resultCount ) {
5153 this .resultCount = resultCount ;
5254 }
5355
54- public int resultCount ;
56+ public final int resultCount ;
5557 }
5658
5759 public final Map <String , List <BatchLoadingCall >> dataLoaderNameToBatchCall = new ConcurrentHashMap <>();
@@ -67,6 +69,7 @@ public String print(String executionId) {
6769 s .append ("Nonblocking fields count: " ).append (dfResultTypes .values ().stream ().filter (dfResultType -> dfResultType == PENDING ).count ()).append ("\n " );
6870 s .append ("DataLoaders used: " ).append (dataLoaderToName .size ()).append ("\n " );
6971 s .append ("DataLoader names: " ).append (dataLoaderToName .values ()).append ("\n " );
72+ s .append ("start thread: '" + startThread .get () + "' end thread: '" + endThread .get ()).append ("'\n " );
7073 s .append ("BatchLoader calls details: " ).append ("\n " );
7174 s .append ("==========================" ).append ("\n " );
7275 for (String dataLoaderName : dataLoaderNameToBatchCall .keySet ()) {
@@ -209,6 +212,7 @@ public void accept(Object o, Throwable throwable) {
209212 ExecutionId executionId = executionContext .getExecutionId ();
210213 GraphQLJavaAgent .ExecutionData executionData = GraphQLJavaAgent .executionIdToData .get (executionId );
211214 executionData .endExecutionTime .set (System .nanoTime ());
215+ executionData .endThread .set (Thread .currentThread ().getName ());
212216 System .out .println ("execution finished for: " + executionId + " with data " + executionData );
213217 System .out .println (executionData .print (executionId .toString ()));
214218 }
@@ -242,6 +246,63 @@ public static void executeOperationExit(@Advice.Argument(0) ExecutionContext exe
242246 }
243247 }
244248
249+ public static class DataFetcherInvokeAdvice {
250+
251+ public static class DataFetcherFinishedHandler implements BiConsumer <Object , Throwable > {
252+
253+ private final ExecutionContext executionContext ;
254+ private final ExecutionStrategyParameters parameters ;
255+ private final long startTime ;
256+
257+ public DataFetcherFinishedHandler (ExecutionContext executionContext , ExecutionStrategyParameters parameters , long startTime ) {
258+ this .executionContext = executionContext ;
259+ this .parameters = parameters ;
260+ this .startTime = startTime ;
261+ }
262+
263+ @ Override
264+ public void accept (Object o , Throwable throwable ) {
265+ ExecutionId executionId = executionContext .getExecutionId ();
266+ GraphQLJavaAgent .ExecutionData executionData = GraphQLJavaAgent .executionIdToData .get (executionId );
267+ ResultPath path = parameters .getPath ();
268+ executionData .finishedTimePerPath .put (path , System .nanoTime () - startTime );
269+ executionData .finishedThreadPerPath .put (path , Thread .currentThread ().getName ());
270+ }
271+ }
272+
273+ @ Advice .OnMethodEnter
274+ public static void invokeDataFetcherEnter (@ Advice .Argument (0 ) ExecutionContext executionContext ,
275+ @ Advice .Argument (1 ) ExecutionStrategyParameters parameters ) {
276+ GraphQLJavaAgent .ExecutionData executionData = GraphQLJavaAgent .executionIdToData .get (executionContext .getExecutionId ());
277+ executionData .start (parameters .getPath (), System .nanoTime ());
278+ executionData .invocationThreadPerPath .put (parameters .getPath (), Thread .currentThread ().getName ());
279+ }
280+
281+ @ Advice .OnMethodExit
282+ public static void invokeDataFetcherExit (@ Advice .Argument (0 ) ExecutionContext executionContext ,
283+ @ Advice .Argument (1 ) ExecutionStrategyParameters parameters ,
284+ @ Advice .Return CompletableFuture <Object > result ) {
285+ // ExecutionTrackingResult executionTrackingResult = executionContext.getGraphQLContext().get(EXECUTION_TRACKING_KEY);
286+ GraphQLJavaAgent .ExecutionData executionData = GraphQLJavaAgent .executionIdToData .get (executionContext .getExecutionId ());
287+ ResultPath path = parameters .getPath ();
288+ long startTime = executionData .timePerPath .get (path );
289+ executionData .end (path , System .nanoTime ());
290+ if (result .isDone ()) {
291+ if (result .isCancelled ()) {
292+ executionData .setDfResultTypes (path , DONE_CANCELLED );
293+ } else if (result .isCompletedExceptionally ()) {
294+ executionData .setDfResultTypes (path , DONE_EXCEPTIONALLY );
295+ } else {
296+ executionData .setDfResultTypes (path , DONE_OK );
297+ }
298+ } else {
299+ executionData .setDfResultTypes (path , PENDING );
300+ }
301+ result .whenComplete (new DataFetcherFinishedHandler (executionContext , parameters , startTime ));
302+ }
303+
304+ }
305+
245306}
246307
247308class DataFetchingEnvironmentAdvice {
@@ -310,33 +371,3 @@ public static void dispatchAll(@Advice.This(typing = Assigner.Typing.DYNAMIC) Ob
310371}
311372
312373
313- class DataFetcherInvokeAdvice {
314- @ Advice .OnMethodEnter
315- public static void invokeDataFetcherEnter (@ Advice .Argument (0 ) ExecutionContext executionContext ,
316- @ Advice .Argument (1 ) ExecutionStrategyParameters parameters ) {
317- GraphQLJavaAgent .executionIdToData .get (executionContext .getExecutionId ())
318- .start (parameters .getPath (), System .nanoTime ());
319- }
320-
321- @ Advice .OnMethodExit
322- public static void invokeDataFetcherExit (@ Advice .Argument (0 ) ExecutionContext executionContext ,
323- @ Advice .Argument (1 ) ExecutionStrategyParameters parameters ,
324- @ Advice .Return CompletableFuture <Object > result ) {
325- // ExecutionTrackingResult executionTrackingResult = executionContext.getGraphQLContext().get(EXECUTION_TRACKING_KEY);
326- GraphQLJavaAgent .ExecutionData executionData = GraphQLJavaAgent .executionIdToData .get (executionContext .getExecutionId ());
327- ResultPath path = parameters .getPath ();
328- executionData .end (path , System .nanoTime ());
329- if (result .isDone ()) {
330- if (result .isCancelled ()) {
331- executionData .setDfResultTypes (path , DONE_CANCELLED );
332- } else if (result .isCompletedExceptionally ()) {
333- executionData .setDfResultTypes (path , DONE_EXCEPTIONALLY );
334- } else {
335- executionData .setDfResultTypes (path , DONE_OK );
336- }
337- } else {
338- executionData .setDfResultTypes (path , PENDING );
339- }
340- }
341-
342- }
0 commit comments