1919 get_operation_root_type , SubscriberExecutionContext )
2020from .executors .sync import SyncExecutor
2121from .middleware import MiddlewareManager
22+ from .tracing import TracingMiddleware
2223
2324logger = logging .getLogger (__name__ )
2425
@@ -30,12 +31,23 @@ def subscribe(*args, **kwargs):
3031
3132def execute (schema , document_ast , root_value = None , context_value = None ,
3233 variable_values = None , operation_name = None , executor = None ,
33- return_promise = False , middleware = None , allow_subscriptions = False ):
34+ return_promise = False , middleware = None , allow_subscriptions = False ,
35+ tracing = True ):
3436 assert schema , 'Must provide schema'
3537 assert isinstance (schema , GraphQLSchema ), (
3638 'Schema must be an instance of GraphQLSchema. Also ensure that there are ' +
3739 'not multiple versions of GraphQL installed in your node_modules directory.'
3840 )
41+
42+ if tracing :
43+ tracing_middleware = TracingMiddleware ()
44+ tracing_middleware .start ()
45+
46+ if not isinstance (middleware , MiddlewareManager ):
47+ middleware = MiddlewareManager (tracing_middleware )
48+ else :
49+ middleware .middlewares .insert (0 , tracing_middleware )
50+
3951 if middleware :
4052 if not isinstance (middleware , MiddlewareManager ):
4153 middleware = MiddlewareManager (* middleware )
@@ -71,12 +83,14 @@ def on_resolve(data):
7183 if isinstance (data , Observable ):
7284 return data
7385
86+ extensions = dict (tracing = tracing_middleware .tracing_dict )
87+
7488 if not context .errors :
75- return ExecutionResult (data = data )
76- return ExecutionResult (data = data , errors = context .errors )
89+ return ExecutionResult (data = data , extensions = extensions )
90+
91+ return ExecutionResult (data = data , extensions = extensions , errors = context .errors )
7792
78- promise = Promise .resolve (None ).then (
79- executor ).catch (on_rejected ).then (on_resolve )
93+ promise = Promise .resolve (None ).then (executor ).catch (on_rejected ).then (on_resolve )
8094
8195 if not return_promise :
8296 context .executor .wait_until_finished ()
@@ -326,8 +340,7 @@ def complete_value_catching_error(exe_context, return_type, field_asts, info, re
326340 # Otherwise, error protection is applied, logging the error and
327341 # resolving a null value for this field if one is encountered.
328342 try :
329- completed = complete_value (
330- exe_context , return_type , field_asts , info , result )
343+ completed = complete_value (exe_context , return_type , field_asts , info , result )
331344 if is_thenable (completed ):
332345 def handle_error (error ):
333346 traceback = completed ._traceback
0 commit comments