Skip to content

Commit 165f088

Browse files
committed
feat: log query that was causing the timeout
1 parent 93ed0a8 commit 165f088

File tree

6 files changed

+51
-6
lines changed

6 files changed

+51
-6
lines changed

graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/GraphQLBatchedInvocationInput.java

+1
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@ default List<ExecutionInput> getExecutionInputs() {
1919
}
2020

2121
ContextSetting getContextSetting();
22+
2223
}
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
package graphql.kickstart.execution.input;
22

3-
public interface GraphQLInvocationInput {}
3+
import java.util.List;
4+
5+
public interface GraphQLInvocationInput {
6+
List<String> getQueries();
7+
}

graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/GraphQLSingleInvocationInput.java

+9
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package graphql.kickstart.execution.input;
22

3+
import static java.util.Collections.singletonList;
4+
35
import graphql.ExecutionInput;
46
import graphql.execution.ExecutionId;
57
import graphql.kickstart.execution.GraphQLRequest;
68
import graphql.kickstart.execution.context.GraphQLContext;
79
import graphql.schema.GraphQLSchema;
10+
import java.util.List;
811
import java.util.Optional;
912
import javax.security.auth.Subject;
1013

@@ -50,4 +53,10 @@ private ExecutionInput createExecutionInput(
5053
public ExecutionInput getExecutionInput() {
5154
return executionInput;
5255
}
56+
57+
@Override
58+
public List<String> getQueries() {
59+
return singletonList(executionInput.getQuery());
60+
}
61+
5362
}

graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/PerQueryBatchedInvocationInput.java

+10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package graphql.kickstart.execution.input;
22

3+
import static java.util.stream.Collectors.toList;
4+
35
import graphql.kickstart.execution.GraphQLRequest;
46
import graphql.kickstart.execution.context.ContextSetting;
57
import graphql.kickstart.execution.context.GraphQLContext;
@@ -30,4 +32,12 @@ public PerQueryBatchedInvocationInput(
3032
.collect(Collectors.toList());
3133
this.contextSetting = contextSetting;
3234
}
35+
36+
@Override
37+
public List<String> getQueries() {
38+
return invocationInputs.stream()
39+
.map(GraphQLSingleInvocationInput::getQueries)
40+
.flatMap(List::stream)
41+
.collect(toList());
42+
}
3343
}

graphql-java-kickstart/src/main/java/graphql/kickstart/execution/input/PerRequestBatchedInvocationInput.java

+11-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package graphql.kickstart.execution.input;
22

3+
import static java.util.stream.Collectors.toList;
4+
35
import graphql.kickstart.execution.GraphQLRequest;
46
import graphql.kickstart.execution.context.ContextSetting;
57
import graphql.kickstart.execution.context.GraphQLContext;
68
import graphql.schema.GraphQLSchema;
79
import java.util.List;
810
import java.util.function.Supplier;
9-
import java.util.stream.Collectors;
1011
import lombok.Getter;
1112

1213
/** A collection of GraphQLSingleInvocationInputs that share a context object. */
@@ -26,7 +27,15 @@ public PerRequestBatchedInvocationInput(
2627
invocationInputs =
2728
requests.stream()
2829
.map(request -> new GraphQLSingleInvocationInput(request, schema, context, root))
29-
.collect(Collectors.toList());
30+
.collect(toList());
3031
this.contextSetting = contextSetting;
3132
}
33+
34+
@Override
35+
public List<String> getQueries() {
36+
return invocationInputs.stream()
37+
.map(GraphQLSingleInvocationInput::getQueries)
38+
.flatMap(List::stream)
39+
.collect(toList());
40+
}
3241
}

graphql-java-servlet/src/main/java/graphql/kickstart/servlet/HttpRequestInvokerImpl.java

+15-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import graphql.kickstart.servlet.input.BatchInputPreProcessor;
1414
import java.io.IOException;
1515
import java.io.UncheckedIOException;
16-
import java.util.Optional;
1716
import java.util.concurrent.CancellationException;
1817
import java.util.concurrent.CompletableFuture;
1918
import java.util.concurrent.CompletionException;
@@ -58,14 +57,27 @@ private void invokeAndHandleAsync(
5857
asyncContext.setTimeout(configuration.getAsyncTimeout());
5958
AtomicReference<FutureExecutionResult> futureHolder = new AtomicReference<>();
6059
AsyncTimeoutListener timeoutListener =
61-
event -> Optional.ofNullable(futureHolder.get()).ifPresent(FutureExecutionResult::cancel);
60+
event -> {
61+
log.warn(
62+
"GraphQL execution canceled because timeout of "
63+
+ configuration.getAsyncTimeout()
64+
+ " millis was reached. The following query was being executed when this happened:\n{}",
65+
String.join("\n", invocationInput.getQueries()));
66+
FutureExecutionResult futureResult = futureHolder.get();
67+
if (futureResult != null) {
68+
futureResult.cancel();
69+
} else {
70+
writeErrorResponse(
71+
invocationInput, request, response, listenerHandler, new CancellationException());
72+
}
73+
};
6274
asyncContext.addListener(timeoutListener);
6375
asyncContext.start(
6476
() -> {
6577
FutureExecutionResult futureResult = invoke(invocationInput, request, response);
6678
futureHolder.set(futureResult);
6779
handle(futureResult, request, response, listenerHandler)
68-
.thenAccept(it -> asyncContext.complete());
80+
.thenAccept(it -> asyncContext.complete());
6981
});
7082
}
7183

0 commit comments

Comments
 (0)