3131import static graphql .agent .result .ExecutionTrackingResult .EXECUTION_TRACKING_KEY ;
3232import static net .bytebuddy .matcher .ElementMatchers .nameMatches ;
3333import static net .bytebuddy .matcher .ElementMatchers .named ;
34+ import static net .bytebuddy .matcher .ElementMatchers .takesArguments ;
3435
3536public class GraphQLJavaAgent {
3637
@@ -49,11 +50,13 @@ public static class ExecutionData {
4950 private final Map <ResultPath , DFResultType > dfResultTypes = new ConcurrentHashMap <>();
5051
5152 public static class BatchLoadingCall {
52- public BatchLoadingCall (int resultCount ) {
53- this .resultCount = resultCount ;
53+ public BatchLoadingCall (int keyCount , String threadName ) {
54+ this .keyCount = keyCount ;
55+ this .threadName = threadName ;
5456 }
5557
56- public final int resultCount ;
58+ public final int keyCount ;
59+ public final String threadName ;
5760 }
5861
5962 public final Map <String , List <BatchLoadingCall >> dataLoaderNameToBatchCall = new ConcurrentHashMap <>();
@@ -74,17 +77,17 @@ public String print(String executionId) {
7477 s .append ("BatchLoader calls details: " ).append ("\n " );
7578 s .append ("==========================" ).append ("\n " );
7679 for (String dataLoaderName : dataLoaderNameToBatchCall .keySet ()) {
77- s .append ("DataLoader: '" ).append (dataLoaderName ).append ("' called " ).append (dataLoaderNameToBatchCall .get (dataLoaderName ).size ()).append (" times, " ).append ("\n " );
80+ s .append ("Batch call: '" ).append (dataLoaderName ).append ("' made " ).append (dataLoaderNameToBatchCall .get (dataLoaderName ).size ()).append (" times, " ).append ("\n " );
81+ for (BatchLoadingCall batchLoadingCall : dataLoaderNameToBatchCall .get (dataLoaderName )) {
82+ s .append ("Batch call with " ).append (batchLoadingCall .keyCount ).append (" keys " ).append (" in thread " ).append (batchLoadingCall .threadName ).append ("\n " );
83+ }
7884 List <ResultPath > resultPathUsed = new ArrayList <>();
7985 for (ResultPath resultPath : resultPathToDataLoaderUsed .keySet ()) {
8086 if (resultPathToDataLoaderUsed .get (resultPath ).equals (dataLoaderName )) {
8187 resultPathUsed .add (resultPath );
8288 }
8389 }
8490 s .append ("DataLoader: '" ).append (dataLoaderName ).append ("' used in fields: " ).append (resultPathUsed ).append ("\n " );
85- for (BatchLoadingCall batchLoadingCall : dataLoaderNameToBatchCall .get (dataLoaderName )) {
86- s .append ("Batch call with " ).append (batchLoadingCall .resultCount ).append (" results" ).append ("\n " );
87- }
8891 }
8992 s .append ("Field details:" ).append ("\n " );
9093 s .append ("===============" ).append ("\n " );
@@ -191,7 +194,9 @@ public static void agentmain(String agentArgs, Instrumentation inst) {
191194 .transform ((builder , typeDescription , classLoader , module , protectionDomain ) -> {
192195 // System.out.println("transforming " + typeDescription);
193196 return builder
194- .visit (Advice .to (DataLoaderHelperDispatchAdvice .class ).on (nameMatches ("dispatch" )));
197+ .visit (Advice .to (DataLoaderHelperDispatchAdvice .class ).on (nameMatches ("dispatch" )))
198+ .visit (Advice .to (DataLoaderHelperInvokeBatchLoaderAdvice .class )
199+ .on (nameMatches ("invokeLoader" ).and (takesArguments (List .class , List .class ))));
195200 })
196201 .type (named ("graphql.schema.DataFetchingEnvironmentImpl" ))
197202 .transform ((builder , typeDescription , classLoader , module , protectionDomain ) -> {
@@ -271,7 +276,6 @@ public void accept(Object o, Throwable throwable) {
271276 ExecutionId executionId = executionContext .getExecutionId ();
272277 GraphQLJavaAgent .ExecutionData executionData = GraphQLJavaAgent .executionIdToData .get (executionId );
273278 ResultPath path = parameters .getPath ();
274- System .out .println ("finished " + path );
275279 executionData .finishedTimePerPath .put (path , System .nanoTime () - startTime );
276280 executionData .finishedThreadPerPath .put (path , Thread .currentThread ().getName ());
277281 }
@@ -312,6 +316,63 @@ public static void invokeDataFetcherExit(@Advice.Argument(0) ExecutionContext ex
312316
313317 }
314318
319+
320+ public static class DataLoaderHelperInvokeBatchLoaderAdvice {
321+
322+ @ Advice .OnMethodEnter
323+ public static void invokeLoader (@ Advice .Argument (0 ) List keys ,
324+ @ Advice .Argument (1 ) List keysContext ,
325+ @ Advice .This (typing = Assigner .Typing .DYNAMIC ) Object dataLoaderHelper ) {
326+ DataLoader dataLoader = getDataLoaderForHelper (dataLoaderHelper );
327+ ExecutionId executionId = GraphQLJavaAgent .dataLoaderToExecutionId .get (dataLoader );
328+ ExecutionData executionData = GraphQLJavaAgent .executionIdToData .get (executionId );
329+ String dataLoaderName = executionData .dataLoaderToName .get (dataLoader );
330+
331+ synchronized (executionData .dataLoaderNameToBatchCall ) {
332+ executionData .dataLoaderNameToBatchCall .putIfAbsent (dataLoaderName , new ArrayList <>());
333+ executionData .dataLoaderNameToBatchCall .get (dataLoaderName )
334+ .add (new GraphQLJavaAgent .ExecutionData .BatchLoadingCall (keys .size (), Thread .currentThread ().getName ()));
335+ }
336+
337+ }
338+ }
339+
340+ public static class DataLoaderHelperDispatchAdvice {
341+
342+ @ Advice .OnMethodExit
343+ public static void dispatch (@ Advice .This (typing = Assigner .Typing .DYNAMIC ) Object dataLoaderHelper ,
344+ @ Advice .Return (typing = Assigner .Typing .DYNAMIC ) DispatchResult dispatchResult ) {
345+ try {
346+ // System.out.println("dataloader helper Dispatch " + dataLoaderHelper + " load for execution " + dispatchResult);
347+ // DataLoader dataLoader = getDataLoaderForHelper(dataLoaderHelper);
348+ // // System.out.println("dataLoader: " + dataLoader);
349+ // ExecutionId executionId = GraphQLJavaAgent.dataLoaderToExecutionId.get(dataLoader);
350+ // GraphQLJavaAgent.ExecutionData executionData = GraphQLJavaAgent.executionIdToData.get(executionId);
351+ // String dataLoaderName = executionData.dataLoaderToName.get(dataLoader);
352+ //
353+ // executionData.dataLoaderNameToBatchCall.putIfAbsent(dataLoaderName, new ArrayList<>());
354+ // executionData.dataLoaderNameToBatchCall.get(dataLoaderName).add(new GraphQLJavaAgent.ExecutionData.BatchLoadingCall(dispatchResult.getKeysCount()));
355+
356+ } catch (Exception e ) {
357+ e .printStackTrace ();
358+ }
359+
360+ }
361+
362+ }
363+
364+ public static DataLoader getDataLoaderForHelper (Object dataLoaderHelper ) {
365+ try {
366+ Field field = dataLoaderHelper .getClass ().getDeclaredField ("dataLoader" );
367+ field .setAccessible (true );
368+ return (DataLoader ) field .get (dataLoaderHelper );
369+ } catch (Exception e ) {
370+ e .printStackTrace ();
371+ throw new RuntimeException (e );
372+ }
373+ }
374+
375+
315376}
316377
317378class DataFetchingEnvironmentAdvice {
@@ -331,31 +392,6 @@ public static void getDataLoader(@Advice.Argument(0) String dataLoaderName,
331392
332393}
333394
334- class DataLoaderHelperDispatchAdvice {
335-
336- @ Advice .OnMethodExit
337- public static void dispatch (@ Advice .This (typing = Assigner .Typing .DYNAMIC ) Object dataLoaderHelper ,
338- @ Advice .Return (typing = Assigner .Typing .DYNAMIC ) DispatchResult dispatchResult ) {
339- try {
340- // System.out.println("dataloader helper Dispatch " + dataLoaderHelper + " load for execution " + dispatchResult);
341- Field field = dataLoaderHelper .getClass ().getDeclaredField ("dataLoader" );
342- field.setAccessible (true );
343- DataLoader dataLoader = (DataLoader ) field .get (dataLoaderHelper );
344- // System.out.println("dataLoader: " + dataLoader);
345- ExecutionId executionId = GraphQLJavaAgent .dataLoaderToExecutionId .get (dataLoader );
346- GraphQLJavaAgent .ExecutionData executionData = GraphQLJavaAgent .executionIdToData .get (executionId );
347- String dataLoaderName = executionData .dataLoaderToName .get (dataLoader );
348-
349- executionData .dataLoaderNameToBatchCall .putIfAbsent (dataLoaderName , new ArrayList <>());
350- executionData .dataLoaderNameToBatchCall .get (dataLoaderName ).add (new GraphQLJavaAgent .ExecutionData .BatchLoadingCall (dispatchResult .getKeysCount ()));
351-
352- } catch (Exception e ) {
353- e .printStackTrace ();
354- }
355-
356- }
357-
358- }
359395
360396class DataLoaderLoadAdvice {
361397
@@ -374,9 +410,9 @@ class DataLoaderRegistryAdvice {
374410 public static void dispatchAll (@ Advice .This (typing = Assigner .Typing .DYNAMIC ) Object dataLoaderRegistry ) {
375411 List <DataLoader <?, ?>> dataLoaders = ((DataLoaderRegistry ) dataLoaderRegistry ).getDataLoaders ();
376412 ExecutionId executionId = GraphQLJavaAgent .dataLoaderToExecutionId .get (dataLoaders .get (0 ));
377- System .out .println ("calling dispatchAll for " + executionId );
378413 }
379414
380415}
381416
382417
418+
0 commit comments