19
19
get_operation_root_type , SubscriberExecutionContext )
20
20
from .executors .sync import SyncExecutor
21
21
from .middleware import MiddlewareManager
22
+ from .tracing import TracingMiddleware
22
23
23
24
logger = logging .getLogger (__name__ )
24
25
@@ -30,12 +31,23 @@ def subscribe(*args, **kwargs):
30
31
31
32
def execute (schema , document_ast , root_value = None , context_value = None ,
32
33
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 ):
34
36
assert schema , 'Must provide schema'
35
37
assert isinstance (schema , GraphQLSchema ), (
36
38
'Schema must be an instance of GraphQLSchema. Also ensure that there are ' +
37
39
'not multiple versions of GraphQL installed in your node_modules directory.'
38
40
)
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
+
39
51
if middleware :
40
52
if not isinstance (middleware , MiddlewareManager ):
41
53
middleware = MiddlewareManager (* middleware )
@@ -71,12 +83,14 @@ def on_resolve(data):
71
83
if isinstance (data , Observable ):
72
84
return data
73
85
86
+ extensions = dict (tracing = tracing_middleware .tracing_dict )
87
+
74
88
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 )
77
92
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 )
80
94
81
95
if not return_promise :
82
96
context .executor .wait_until_finished ()
@@ -326,8 +340,7 @@ def complete_value_catching_error(exe_context, return_type, field_asts, info, re
326
340
# Otherwise, error protection is applied, logging the error and
327
341
# resolving a null value for this field if one is encountered.
328
342
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 )
331
344
if is_thenable (completed ):
332
345
def handle_error (error ):
333
346
traceback = completed ._traceback
0 commit comments