Skip to content

Commit c8b0f31

Browse files
committed
wip
1 parent c960541 commit c8b0f31

File tree

2 files changed

+42
-7
lines changed

2 files changed

+42
-7
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package graphql.agent;
2+
3+
import graphql.execution.ExecutionContext;
4+
import graphql.execution.ExecutionId;
5+
6+
import java.util.function.BiConsumer;
7+
8+
public class AfterExecutionHandler implements BiConsumer<Object, Throwable> {
9+
10+
private final ExecutionContext executionContext;
11+
12+
public AfterExecutionHandler(ExecutionContext executionContext) {
13+
this.executionContext = executionContext;
14+
}
15+
16+
public void accept(Object o, Throwable throwable) {
17+
ExecutionId executionId = executionContext.getExecutionId();
18+
GraphQLJavaAgent.ExecutionData executionData = GraphQLJavaAgent.executionIdToData.get(executionId);
19+
executionData.endExecutionTime.set(System.nanoTime());
20+
System.out.println("execution finished for: " + executionId + " with data " + executionData);
21+
System.out.println(executionData.print(executionId.toString()));
22+
}
23+
24+
25+
}

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

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.concurrent.CompletableFuture;
2222
import java.util.concurrent.ConcurrentHashMap;
2323
import java.util.concurrent.atomic.AtomicLong;
24+
import java.util.concurrent.atomic.AtomicReference;
2425

2526
import static graphql.agent.GraphQLJavaAgent.ExecutionData.DFResultType.DONE_CANCELLED;
2627
import static graphql.agent.GraphQLJavaAgent.ExecutionData.DFResultType.DONE_EXCEPTIONALLY;
@@ -33,12 +34,15 @@
3334
public 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

Comments
 (0)