diff options
author | Erik Johnston <erik@matrix.org> | 2019-10-11 11:22:36 +0100 |
---|---|---|
committer | Erik Johnston <erik@matrix.org> | 2019-10-11 11:58:52 +0100 |
commit | f3ceaf432365bce77cff71116fb6c7d38e61c9ab (patch) | |
tree | a988bb62ec67a563fb47efaff9cafc97652e8e02 /synapse | |
parent | Fix MAU reaping where reserved users are specified. (#6168) (diff) | |
download | synapse-f3ceaf432365bce77cff71116fb6c7d38e61c9ab.tar.xz |
Trace non-JSON APIs, /media, /key etc
Diffstat (limited to 'synapse')
-rw-r--r-- | synapse/http/server.py | 2 | ||||
-rw-r--r-- | synapse/logging/opentracing.py | 14 |
2 files changed, 11 insertions, 5 deletions
diff --git a/synapse/http/server.py b/synapse/http/server.py index cb9158fe1b..2ccb210fd6 100644 --- a/synapse/http/server.py +++ b/synapse/http/server.py @@ -388,7 +388,7 @@ class DirectServeResource(resource.Resource): if not callback: return super().render(request) - resp = callback(request) + resp = trace_servlet(self.__class__.__name__)(callback)(request) # If it's a coroutine, turn it into a Deferred if isinstance(resp, types.CoroutineType): diff --git a/synapse/logging/opentracing.py b/synapse/logging/opentracing.py index cd1ff6a518..0638cec429 100644 --- a/synapse/logging/opentracing.py +++ b/synapse/logging/opentracing.py @@ -169,6 +169,7 @@ import contextlib import inspect import logging import re +import types from functools import wraps from typing import Dict @@ -778,8 +779,7 @@ def trace_servlet(servlet_name, extract_context=False): return func @wraps(func) - @defer.inlineCallbacks - def _trace_servlet_inner(request, *args, **kwargs): + async def _trace_servlet_inner(request, *args, **kwargs): request_tags = { "request_id": request.get_request_id(), tags.SPAN_KIND: tags.SPAN_KIND_RPC_SERVER, @@ -796,8 +796,14 @@ def trace_servlet(servlet_name, extract_context=False): scope = start_active_span(servlet_name, tags=request_tags) with scope: - result = yield defer.maybeDeferred(func, request, *args, **kwargs) - return result + result = func(request, *args, **kwargs) + + if not isinstance(result, (types.CoroutineType, defer.Deferred)): + # Some servlets aren't async and just return results + # directly, so we handle that here. + return result + + return await result return _trace_servlet_inner |