Skip to content

Commit 12ad6ba

Browse files
committed
wip
1 parent 1b4c2fb commit 12ad6ba

File tree

1 file changed

+64
-33
lines changed

1 file changed

+64
-33
lines changed

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

Lines changed: 64 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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

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

Comments
 (0)