66import graphql .execution .ExecutionIdProvider ;
77import graphql .execution .ExecutionStrategy ;
88import graphql .execution .SimpleExecutionStrategy ;
9+ import graphql .execution .instrumentation .Instrumentation ;
10+ import graphql .execution .instrumentation .InstrumentationContext ;
11+ import graphql .execution .instrumentation .NoOpInstrumentation ;
12+ import graphql .execution .instrumentation .parameters .ExecutionParameters ;
13+ import graphql .execution .instrumentation .parameters .ValidationParameters ;
914import graphql .language .Document ;
1015import graphql .language .SourceLocation ;
1116import graphql .parser .Parser ;
@@ -38,6 +43,7 @@ public ExecutionId provide(String query, String operationName, Object context) {
3843 private final ExecutionStrategy queryStrategy ;
3944 private final ExecutionStrategy mutationStrategy ;
4045 private final ExecutionIdProvider idProvider ;
46+ private final Instrumentation instrumentation ;
4147
4248
4349 /**
@@ -76,14 +82,15 @@ public GraphQL(GraphQLSchema graphQLSchema, ExecutionStrategy queryStrategy) {
7682 * @deprecated use the {@link #newGraphQL(GraphQLSchema)} builder instead. This will be removed in a future version.
7783 */
7884 public GraphQL (GraphQLSchema graphQLSchema , ExecutionStrategy queryStrategy , ExecutionStrategy mutationStrategy ) {
79- this (graphQLSchema ,queryStrategy ,mutationStrategy , DEFAULT_EXECUTION_ID_PROVIDER );
85+ this (graphQLSchema ,queryStrategy ,mutationStrategy , DEFAULT_EXECUTION_ID_PROVIDER , NoOpInstrumentation . INSTANCE );
8086 }
8187
82- private GraphQL (GraphQLSchema graphQLSchema , ExecutionStrategy queryStrategy , ExecutionStrategy mutationStrategy , ExecutionIdProvider idProvider ) {
88+ private GraphQL (GraphQLSchema graphQLSchema , ExecutionStrategy queryStrategy , ExecutionStrategy mutationStrategy , ExecutionIdProvider idProvider , Instrumentation instrumentation ) {
8389 this .graphQLSchema = assertNotNull (graphQLSchema ,"queryStrategy must be non null" );
8490 this .queryStrategy = assertNotNull (queryStrategy , "queryStrategy must be non null" );
8591 this .idProvider = assertNotNull (idProvider , "idProvider must be non null" );
8692 this .mutationStrategy = mutationStrategy ;
93+ this .instrumentation = instrumentation ;
8794 }
8895
8996 /**
@@ -103,6 +110,7 @@ public static class Builder {
103110 private ExecutionStrategy queryExecutionStrategy = new SimpleExecutionStrategy ();
104111 private ExecutionStrategy mutationExecutionStrategy = new SimpleExecutionStrategy ();
105112 private ExecutionIdProvider idProvider = DEFAULT_EXECUTION_ID_PROVIDER ;
113+ private Instrumentation instrumentation = NoOpInstrumentation .INSTANCE ;
106114
107115
108116 public Builder (GraphQLSchema graphQLSchema ) {
@@ -124,13 +132,18 @@ public Builder mutationExecutionStrategy(ExecutionStrategy executionStrategy) {
124132 return this ;
125133 }
126134
135+ public Builder instrumentation (Instrumentation instrumentation ) {
136+ this .instrumentation = assertNotNull (instrumentation , "Instrumentation must be non null" );
137+ return this ;
138+ }
139+
127140 public Builder executionIdProvider (ExecutionIdProvider executionIdProvider ) {
128141 this .idProvider = assertNotNull (executionIdProvider , "ExecutionIdProvider must be non null" );
129142 return this ;
130143 }
131144
132145 public GraphQL build () {
133- return new GraphQL (graphQLSchema , queryExecutionStrategy , mutationExecutionStrategy , idProvider );
146+ return new GraphQL (graphQLSchema , queryExecutionStrategy , mutationExecutionStrategy , idProvider , instrumentation );
134147 }
135148 }
136149
@@ -151,29 +164,41 @@ public ExecutionResult execute(String requestString, Object context, Map<String,
151164 }
152165
153166 public ExecutionResult execute (String requestString , String operationName , Object context , Map <String , Object > arguments ) {
167+ InstrumentationContext <ExecutionResult > executionCtx = instrumentation .beginExecution (new ExecutionParameters (requestString , operationName , context , arguments ));
168+
154169 assertNotNull (arguments , "arguments can't be null" );
155170 log .debug ("Executing request. operation name: {}. Request: {} " , operationName , requestString );
171+
172+ InstrumentationContext <Document > parseCtx = instrumentation .beginParse (new ExecutionParameters (requestString , operationName , context , arguments ));
156173 Parser parser = new Parser ();
157174 Document document ;
158175 try {
159176 document = parser .parseDocument (requestString );
177+ parseCtx .onEnd (document );
160178 } catch (ParseCancellationException e ) {
161179 RecognitionException recognitionException = (RecognitionException ) e .getCause ();
162180 SourceLocation sourceLocation = new SourceLocation (recognitionException .getOffendingToken ().getLine (), recognitionException .getOffendingToken ().getCharPositionInLine ());
163181 InvalidSyntaxError invalidSyntaxError = new InvalidSyntaxError (sourceLocation );
164182 return new ExecutionResultImpl (Collections .singletonList (invalidSyntaxError ));
165183 }
166184
185+ InstrumentationContext <List <ValidationError >> validationCtx = instrumentation .beginValidation (new ValidationParameters (requestString ,operationName ,context ,arguments ,document ));
186+
167187 Validator validator = new Validator ();
168188 List <ValidationError > validationErrors = validator .validateDocument (graphQLSchema , document );
189+
190+ validationCtx .onEnd (validationErrors );
191+
169192 if (validationErrors .size () > 0 ) {
170193 return new ExecutionResultImpl (validationErrors );
171194 }
172195 ExecutionId executionId = idProvider .provide (requestString , operationName , context );
173196
174- Execution execution = new Execution (queryStrategy , mutationStrategy );
175- return execution .execute (executionId , graphQLSchema , context , document , operationName , arguments );
176- }
197+ Execution execution = new Execution (queryStrategy , mutationStrategy , instrumentation );
198+ ExecutionResult result = execution .execute (executionId , graphQLSchema , context , document , operationName , arguments );
177199
200+ executionCtx .onEnd (result );
178201
202+ return result ;
203+ }
179204}
0 commit comments