8000 wip · graphql-java/graphql-java@5fc2fc7 · GitHub
[go: up one dir, main page]

Skip to content

Commit 5fc2fc7

Browse files
committed
wip
1 parent f11aeed commit 5fc2fc7

File tree

1 file changed

+71
-35
lines changed

1 file changed

+71
-35
lines changed

agent/src/main/java/graphql/agent/GraphQLJavaAgent.java

Lines changed: 71 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import static graphql.agent.result.ExecutionTrackingResult.EXECUTION_TRACKING_KEY;
3232
import static net.bytebuddy.matcher.ElementMatchers.nameMatches;
3333
import static net.bytebuddy.matcher.ElementMatchers.named;
34+
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
3435

3536
public 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

317378
class 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

360396
class 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

Comments
 (0)
0