Skip to content

Commit 74e7ed3

Browse files
committed
Instrument usage of ExecutableNormalizedOperationFactory.createExecutableNormalizedOperation
1 parent 1a4c778 commit 74e7ed3

11 files changed

+85
-24
lines changed

src/main/java/graphql/execution/ExecutionContext.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import graphql.execution.incremental.IncrementalCallState;
1515
import graphql.execution.instrumentation.Instrumentation;
1616
import graphql.execution.instrumentation.InstrumentationState;
17+
import graphql.execution.instrumentation.parameters.InstrumentationParseExecutableNormalizedOperation;
1718
import graphql.language.Document;
1819
import graphql.language.FragmentDefinition;
1920
import graphql.language.OperationDefinition;
@@ -100,7 +101,7 @@ public class ExecutionContext {
100101
this.localContext = builder.localContext;
101102
this.executionInput = builder.executionInput;
102103
this.dataLoaderDispatcherStrategy = builder.dataLoaderDispatcherStrategy;
103-
this.queryTree = FpKit.interThreadMemoize(() -> ExecutableNormalizedOperationFactory.createExecutableNormalizedOperation(graphQLSchema, operationDefinition, fragmentsByName, coercedVariables));
104+
this.queryTree = FpKit.interThreadMemoize(this::createExecutableNormalizedOperation);
104105
this.propagateErrorsOnNonNullContractFailure = builder.propagateErrorsOnNonNullContractFailure;
105106
this.engineRunningState = builder.engineRunningState;
106107
}
@@ -368,6 +369,15 @@ public ResultNodesInfo getResultNodesInfo() {
368369
return resultNodesInfo;
369370
}
370371

372+
private ExecutableNormalizedOperation createExecutableNormalizedOperation() {
373+
var instrument = instrumentation.beginParseExecutableNormalizedOperation(new InstrumentationParseExecutableNormalizedOperation(executionInput, graphQLSchema), instrumentationState);
374+
var result = ExecutableNormalizedOperationFactory.createExecutableNormalizedOperation(graphQLSchema, operationDefinition, fragmentsByName, coercedVariables);
375+
if (instrument != null) {
376+
instrument.onCompleted(result, null);
377+
}
378+
return result;
379+
}
380+
371381
@Internal
372382
public boolean hasIncrementalSupport() {
373383
GraphQLContext graphqlContext = getGraphQLContext();

src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,9 @@
88
import graphql.execution.Async;
99
import graphql.execution.ExecutionContext;
1010
import graphql.execution.FieldValueInfo;
11-
import graphql.execution.instrumentation.parameters.InstrumentationCreateStateParameters;
12-
import graphql.execution.instrumentation.parameters.InstrumentationExecuteOperationParameters;
13-
import graphql.execution.instrumentation.parameters.InstrumentationExecutionParameters;
14-
import graphql.execution.instrumentation.parameters.InstrumentationExecutionStrategyParameters;
15-
import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters;
16-
import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters;
17-
import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters;
18-
import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters;
11+
import graphql.execution.instrumentation.parameters.*;
1912
import graphql.language.Document;
13+
import graphql.normalized.ExecutableNormalizedOperation;
2014
import graphql.schema.DataFetcher;
2115
import graphql.schema.GraphQLSchema;
2216
import graphql.validation.ValidationError;
@@ -126,6 +120,12 @@ public InstrumentationContext<Document> beginParse(InstrumentationExecutionParam
126120
return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginParse(parameters, specificState));
127121
}
128122

123+
@Override
124+
public InstrumentationContext<ExecutableNormalizedOperation> beginParseExecutableNormalizedOperation(InstrumentationParseExecutableNormalizedOperation parameters, InstrumentationState state) {
125+
return chainedCtx(state, (instrumentation, specificState) ->
126+
instrumentation.beginParseExecutableNormalizedOperation(parameters, specificState));
127+
}
128+
129129

130130
@Override
131131
public InstrumentationContext<List<ValidationError>> beginValidation(InstrumentationValidationParameters parameters, InstrumentationState state) {

src/main/java/graphql/execution/instrumentation/Instrumentation.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,9 @@
55
import graphql.ExperimentalApi;
66
import graphql.PublicSpi;
77
import graphql.execution.ExecutionContext;
8-
import graphql.execution.instrumentation.parameters.InstrumentationCreateStateParameters;
9-
import graphql.execution.instrumentation.parameters.InstrumentationExecuteOperationParameters;
10-
import graphql.execution.instrumentation.parameters.InstrumentationExecutionParameters;
11-
import graphql.execution.instrumentation.parameters.InstrumentationExecutionStrategyParameters;
12-
import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters;
13-
import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters;
14-
import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters;
15-
import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters;
8+
import graphql.execution.instrumentation.parameters.*;
169
import graphql.language.Document;
10+
import graphql.normalized.ExecutableNormalizedOperation;
1711
import graphql.schema.DataFetcher;
1812
import graphql.schema.GraphQLSchema;
1913
import graphql.validation.ValidationError;
@@ -120,6 +114,18 @@ default InstrumentationContext<ExecutionResult> beginExecuteOperation(Instrument
120114
return noOp();
121115
}
122116

117+
/**
118+
* This is called just before the parsing of the executable normalized operation is started.
119+
*
120+
* @param parameters the parameters to this step
121+
* @param state the state created during the call to {@link #createState(InstrumentationCreateStateParameters)}
122+
* @return a nullable {@link InstrumentationContext} object that will be called back when the step ends (assuming it's not null)
123+
*/
124+
@Nullable
125+
default InstrumentationContext<ExecutableNormalizedOperation> beginParseExecutableNormalizedOperation(InstrumentationParseExecutableNormalizedOperation parameters, InstrumentationState state) {
126+
return noOp();
127+
}
128+
123129
/**
124130
* This is called each time an {@link graphql.execution.ExecutionStrategy} is invoked, which may be multiple times
125131
* per query as the engine recursively descends over the query.

src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,9 @@
22

33
import graphql.ExecutionResult;
44
import graphql.PublicApi;
5-
import graphql.execution.instrumentation.parameters.InstrumentationExecuteOperationParameters;
6-
import graphql.execution.instrumentation.parameters.InstrumentationExecutionParameters;
7-
import graphql.execution.instrumentation.parameters.InstrumentationExecutionStrategyParameters;
8-
import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters;
9-
import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters;
10-
import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters;
11-
import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters;
5+
import graphql.execution.instrumentation.parameters.*;
126
import graphql.language.Document;
7+
import graphql.normalized.ExecutableNormalizedOperation;
138
import graphql.validation.ValidationError;
149
import org.jspecify.annotations.Nullable;
1510

@@ -83,6 +78,11 @@ public ExecutionStrategyInstrumentationContext beginExecutionStrategy(Instrument
8378
return runAll(state, (instrumentation, specificState) -> instrumentation.beginExecuteObject(parameters, specificState));
8479
}
8580

81+
@Override
82+
public @Nullable InstrumentationContext<ExecutableNormalizedOperation> beginParseExecutableNormalizedOperation(InstrumentationParseExecutableNormalizedOperation parameters, InstrumentationState state) {
83+
return runAll(state, (instrumentation, specificState) -> instrumentation.beginParseExecutableNormalizedOperation(parameters, specificState));
84+
}
85+
8686
@Override
8787
public InstrumentationContext<ExecutionResult> beginSubscribedFieldEvent(InstrumentationFieldParameters parameters, InstrumentationState state) {
8888
return runAll(state, (instrumentation, specificState) -> instrumentation.beginSubscribedFieldEvent(parameters, specificState));
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package graphql.execution.instrumentation.parameters;
2+
3+
import graphql.ExecutionInput;
4+
import graphql.PublicApi;
5+
import graphql.execution.instrumentation.Instrumentation;
6+
import graphql.execution.instrumentation.InstrumentationState;
7+
import graphql.schema.GraphQLSchema;
8+
9+
/**
10+
* Parameters sent to {@link Instrumentation} methods
11+
*/
12+
@SuppressWarnings("TypeParameterUnusedInFormals")
13+
@PublicApi
14+
public class InstrumentationParseExecutableNormalizedOperation extends InstrumentationExecutionParameters {
15+
public InstrumentationParseExecutableNormalizedOperation(ExecutionInput executionInput, GraphQLSchema schema) {
16+
super(executionInput, schema);
17+
}
18+
}

src/test/groovy/graphql/StarWarsData.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ class StarWarsData {
105105
static TypeResolver characterTypeResolver = new TypeResolver() {
106106
@Override
107107
GraphQLObjectType getType(TypeResolutionEnvironment env) {
108+
env.getSelectionSet().getFields() // Used to validate instrumentation
108109
def id = env.getObject().id
109110
if (humanData[id] != null)
110111
return StarWarsSchema.humanType

src/test/groovy/graphql/execution/instrumentation/ChainedInstrumentationStateTest.groovy

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ class ChainedInstrumentationStateTest extends Specification {
5555
"start:fetch-hero",
5656
"end:fetch-hero",
5757
"start:complete-hero",
58+
"start:parse-executable-normalized-operation",
59+
"end:parse-executable-normalized-operation",
5860

5961
"start:execute-object",
6062

@@ -143,6 +145,8 @@ class ChainedInstrumentationStateTest extends Specification {
143145
"start:fetch-hero",
144146
"end:fetch-hero",
145147
"start:complete-hero",
148+
"start:parse-executable-normalized-operation",
149+
"end:parse-executable-normalized-operation",
146150

147151
"start:execute-object",
148152

@@ -183,6 +187,8 @@ class ChainedInstrumentationStateTest extends Specification {
183187
"start:fetch-hero",
184188
"end:fetch-hero",
185189
"start:complete-hero",
190+
"start:parse-executable-normalized-operation",
191+
"end:parse-executable-normalized-operation",
186192

187193
"start:execute-object",
188194

src/test/groovy/graphql/execution/instrumentation/InstrumentationTest.groovy

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,9 @@ class InstrumentationTest extends Specification {
313313
"end:fetch-hero",
314314
"start:complete-hero",
315315
"start:execute-object",
316+
"start:parse-executable-normalized-operation",
317+
"end:parse-executable-normalized-operation",
318+
"start:execution-strategy",
316319
"start:field-id",
317320
"start:fetch-id",
318321
"onDispatched:fetch-id",

src/test/groovy/graphql/execution/instrumentation/ModernTestingInstrumentation.groovy

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ import graphql.execution.instrumentation.parameters.InstrumentationExecutionStra
1010
import graphql.execution.instrumentation.parameters.InstrumentationFieldCompleteParameters
1111
import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters
1212
import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters
13+
import graphql.execution.instrumentation.parameters.InstrumentationParseExecutableNormalizedOperation
1314
import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters
1415
import graphql.language.Document
16+
import graphql.normalized.ExecutableNormalizedOperation
1517
import graphql.schema.DataFetcher
1618
import graphql.schema.DataFetchingEnvironment
1719
import graphql.schema.GraphQLSchema
@@ -73,6 +75,12 @@ class ModernTestingInstrumentation implements Instrumentation {
7375
return new TestingInstrumentContext("execute-operation", executionList, throwableList, useOnDispatch)
7476
}
7577

78+
@Override
79+
InstrumentationContext<ExecutableNormalizedOperation> beginParseExecutableNormalizedOperation(InstrumentationParseExecutableNormalizedOperation parameters, InstrumentationState state) {
80+
assert state == instrumentationState
81+
return new TestingInstrumentContext("parse-executable-normalized-operation", executionList, throwableList, useOnDispatch)
82+
}
83+
7684
@Override
7785
InstrumentationContext<ExecutionResult> beginSubscribedFieldEvent(InstrumentationFieldParameters parameters, InstrumentationState state) {
7886
assert state == instrumentationState

src/test/groovy/graphql/execution/instrumentation/NamedInstrumentation.groovy

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ import graphql.execution.instrumentation.parameters.InstrumentationExecutionPara
77
import graphql.execution.instrumentation.parameters.InstrumentationExecutionStrategyParameters
88
import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters
99
import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters
10+
import graphql.execution.instrumentation.parameters.InstrumentationParseExecutableNormalizedOperation
1011
import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters
1112
import graphql.language.Document
13+
import graphql.normalized.ExecutableNormalizedOperation
1214
import graphql.schema.DataFetcher
1315
import graphql.validation.ValidationError
1416

@@ -72,6 +74,12 @@ class NamedInstrumentation extends ModernTestingInstrumentation {
7274
return super.beginFieldExecution(parameters, state)
7375
}
7476

77+
@Override
78+
InstrumentationContext<ExecutableNormalizedOperation> beginParseExecutableNormalizedOperation(InstrumentationParseExecutableNormalizedOperation parameters, InstrumentationState state) {
79+
assertState(state)
80+
return super.beginParseExecutableNormalizedOperation(parameters, state)
81+
}
82+
7583
@Override
7684
InstrumentationContext<Object> beginFieldFetch(InstrumentationFieldFetchParameters parameters, InstrumentationState state) {
7785
assertState(state)

0 commit comments

Comments
 (0)