Fix error reporting when using `opentracing.trace` (#7961)

pull/7967/head
Erik Johnston 2020-07-27 16:20:24 +01:00 committed by GitHub
parent 84d099ae11
commit 1ef9efc1e0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 4 additions and 12 deletions

1
changelog.d/7961.bugfix Normal file
View File

@ -0,0 +1 @@
Fix a long standing bug where the tracing of async functions with opentracing was broken.

View File

@ -737,24 +737,14 @@ def trace(func=None, opname=None):
@wraps(func)
async def _trace_inner(*args, **kwargs):
if opentracing is None:
with start_active_span(_opname):
return await func(*args, **kwargs)
with start_active_span(_opname) as scope:
try:
return await func(*args, **kwargs)
except Exception:
scope.span.set_tag(tags.ERROR, True)
raise
else:
# The other case here handles both sync functions and those
# decorated with inlineDeferred.
@wraps(func)
def _trace_inner(*args, **kwargs):
if opentracing is None:
return func(*args, **kwargs)
scope = start_active_span(_opname)
scope.__enter__()
@ -767,7 +757,6 @@ def trace(func=None, opname=None):
return result
def err_back(result):
scope.span.set_tag(tags.ERROR, True)
scope.__exit__(None, None, None)
return result

View File

@ -116,6 +116,8 @@ class _LogContextScope(Scope):
if self._enter_logcontext:
self.logcontext.__enter__()
return self
def __exit__(self, type, value, traceback):
if type == twisted.internet.defer._DefGen_Return:
super(_LogContextScope, self).__exit__(None, None, None)