@@ -9,7 +9,7 @@ import 'propagation/noop_text_map_propagator.dart';
99import 'trace/noop_tracer_provider.dart' ;
1010
1111import '../../api.dart' as api;
12- import '../experimental_api.dart' show globalContextManager;
12+ import '../experimental_api.dart' show globalContextManager, ZoneContext ;
1313
1414final api.TracerProvider _noopTracerProvider = NoopTracerProvider ();
1515final api.TextMapPropagator _noopTextMapPropagator = NoopTextMapPropagator ();
@@ -79,8 +79,13 @@ Future<T> traceContext<T>(String name, Future<T> Function(api.Context) fn,
7979 }
8080
8181 final span = tracer.startSpan (name, context: context);
82+ context = api.contextWithSpan (context, span);
8283 try {
83- return await fn (api.contextWithSpan (context, span));
84+ // TODO: remove this check once `run` exists on context interface
85+ if (context is ZoneContext ) {
86+ return await context.run ((context) => fn (context));
87+ }
88+ return await fn (context);
8489 } catch (e, s) {
8590 span
8691 ..setStatus (api.StatusCode .error, e.toString ())
@@ -93,7 +98,7 @@ Future<T> traceContext<T>(String name, Future<T> Function(api.Context) fn,
9398
9499/// Use [traceSync] instead of [trace] when [fn] is not an async function.
95100@Deprecated (
96- 'This method will be removed in 0.19.0. Use [traceSyncContext ] instead.' )
101+ 'This method will be removed in 0.19.0. Use [traceContextSync ] instead.' )
97102R traceSync <R >(String name, R Function () fn,
98103 {api.Context ? context, api.Tracer ? tracer}) {
99104 context ?? = globalContextManager.active;
@@ -120,9 +125,9 @@ R traceSync<R>(String name, R Function() fn,
120125 }
121126}
122127
123- /// Use [traceSyncContext ] instead of [traceContext] when [fn] is not an async function.
128+ /// Use [traceContextSync ] instead of [traceContext] when [fn] is not an async function.
124129@experimental
125- R traceSyncContext <R >(String name, R Function (api.Context ) fn,
130+ R traceContextSync <R >(String name, R Function (api.Context ) fn,
126131 {api.Context ? context,
127132 api.Tracer ? tracer,
128133 bool newRoot = false ,
@@ -136,12 +141,19 @@ R traceSyncContext<R>(String name, R Function(api.Context) fn,
136141 }
137142
138143 final span = tracer.startSpan (name, context: context);
144+ context = api.contextWithSpan (context, span);
139145 try {
140- final r = fn (api.contextWithSpan (context, span));
146+ var r;
147+ // TODO: remove this check once `run` exists on context interface
148+ if (context is ZoneContext ) {
149+ r = context.run ((context) => fn (context));
150+ } else {
151+ r = fn (context);
152+ }
141153
142154 if (r is Future ) {
143155 throw ArgumentError .value (fn, 'fn' ,
144- 'Use traceSyncContext to trace functions that do not return a [Future].' );
156+ 'Use traceContextSync to trace functions that do not return a [Future].' );
145157 }
146158
147159 return r;
0 commit comments