diff --git a/synapse/logging/opentracing.py b/synapse/logging/opentracing.py
index 50c57940f9..17e729f0c7 100644
--- a/synapse/logging/opentracing.py
+++ b/synapse/logging/opentracing.py
@@ -84,14 +84,13 @@ the function becomes the operation name for the span.
return something_usual_and_useful
-Operation names can be explicitly set for a function by passing the
-operation name to ``trace``
+Operation names can be explicitly set for a function by using ``trace_with_opname``:
.. code-block:: python
- from synapse.logging.opentracing import trace
+ from synapse.logging.opentracing import trace_with_opname
- @trace(opname="a_better_operation_name")
+ @trace_with_opname("a_better_operation_name")
def interesting_badly_named_function(*args, **kwargs):
# Does all kinds of cool and expected things
return something_usual_and_useful
@@ -798,33 +797,31 @@ def extract_text_map(carrier: Dict[str, str]) -> Optional["opentracing.SpanConte
# Tracing decorators
-def trace(func=None, opname: Optional[str] = None):
+def trace_with_opname(opname: str) -> Callable[[Callable[P, R]], Callable[P, R]]:
"""
- Decorator to trace a function.
- Sets the operation name to that of the function's or that given
- as operation_name. See the module's doc string for usage
- examples.
+ Decorator to trace a function with a custom opname.
+
+ See the module's doc string for usage examples.
+
"""
- def decorator(func):
+ def decorator(func: Callable[P, R]) -> Callable[P, R]:
if opentracing is None:
return func # type: ignore[unreachable]
- _opname = opname if opname else func.__name__
-
if inspect.iscoroutinefunction(func):
@wraps(func)
- async def _trace_inner(*args, **kwargs):
- with start_active_span(_opname):
- return await func(*args, **kwargs)
+ async def _trace_inner(*args: P.args, **kwargs: P.kwargs) -> R:
+ with start_active_span(opname):
+ return await func(*args, **kwargs) # type: ignore[misc]
else:
# The other case here handles both sync functions and those
# decorated with inlineDeferred.
@wraps(func)
- def _trace_inner(*args, **kwargs):
- scope = start_active_span(_opname)
+ def _trace_inner(*args: P.args, **kwargs: P.kwargs) -> R:
+ scope = start_active_span(opname)
scope.__enter__()
try:
@@ -858,12 +855,21 @@ def trace(func=None, opname: Optional[str] = None):
scope.__exit__(type(e), None, e.__traceback__)
raise
- return _trace_inner
+ return _trace_inner # type: ignore[return-value]
- if func:
- return decorator(func)
- else:
- return decorator
+ return decorator
+
+
+def trace(func: Callable[P, R]) -> Callable[P, R]:
+ """
+ Decorator to trace a function.
+
+ Sets the operation name to that of the function's name.
+
+ See the module's doc string for usage examples.
+ """
+
+ return trace_with_opname(func.__name__)(func)
def tag_args(func: Callable[P, R]) -> Callable[P, R]:
|