docs: public CompletableFuture<ExecutionResult> executeAsync(ExecutionInput executionInput) {
          try {
              log.debug("Executing request. operation name: '{}'. query: '{}'. variables '{}'", executionInput.getOperationName(), executionInput.getQuery(), executionInput.getVariables());
  
              InstrumentationState instrumentationState = instrumentation.createState(new InstrumentationCreateStateParameters(this.graphQLSchema, executionInput));
  
              InstrumentationExecutionParameters inputInstrumentationParameters = new InstrumentationExecutionParameters(executionInput, this.graphQLSchema, instrumentationState);
              executionInput = instrumentation.instrumentExecutionInput(executionInput, inputInstrumentationParameters);
  
              InstrumentationExecutionParameters instrumentationParameters = new InstrumentationExecutionParameters(executionInput, this.graphQLSchema, instrumentationState);
              InstrumentationContext<ExecutionResult> executionInstrumentation = instrumentation.beginExecution(instrumentationParameters);
  
              GraphQLSchema graphQLSchema = instrumentation.instrumentSchema(this.graphQLSchema, instrumentationParameters);
  
              CompletableFuture<ExecutionResult> executionResult = parseValidateAndExecute(executionInput, graphQLSchema, instrumentationState);
              //
              // finish up instrumentation
              executionResult = executionResult.whenComplete(executionInstrumentation::onCompleted);
              //
              // allow instrumentation to tweak the result
              executionResult = executionResult.thenCompose(result -> instrumentation.instrumentExecutionResult(result, instrumentationParameters));
              return executionResult;
          } catch (AbortExecutionException abortException) {
              return CompletableFuture.completedFuture(abortException.toExecutionResult());
          }
      }