diff options
author | Richard van der Hoff <github@rvanderhoff.org.uk> | 2018-01-10 14:53:40 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-10 14:53:40 +0000 |
commit | c175a5f0f220628cd171feac59e45a84ed57cdb6 (patch) | |
tree | 60921e7278c4ec7fd16ab93bc7377ca4871371d3 /synapse | |
parent | Merge pull request #2764 from matrix-org/erikj/remove_dead_thumbnail_code (diff) | |
parent | Update http request metrics before calling servlet (diff) | |
download | synapse-c175a5f0f220628cd171feac59e45a84ed57cdb6.tar.xz |
Merge pull request #2770 from matrix-org/rav/fix_request_metrics
Update http request metrics before calling servlet
Diffstat (limited to 'synapse')
-rw-r--r-- | synapse/http/server.py | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/synapse/http/server.py b/synapse/http/server.py index 25466cd292..6e8f4c9c5f 100644 --- a/synapse/http/server.py +++ b/synapse/http/server.py @@ -107,6 +107,10 @@ def wrap_request_handler(request_handler, include_metrics=False): with LoggingContext(request_id) as request_context: with Measure(self.clock, "wrapped_request_handler"): request_metrics = RequestMetrics() + # we start the request metrics timer here with an initial stab + # at the servlet name. For most requests that name will be + # JsonResource (or a subclass), and JsonResource._async_render + # will update it once it picks a servlet. request_metrics.start(self.clock, name=self.__class__.__name__) request_context.request = request_id @@ -249,12 +253,23 @@ class JsonResource(HttpServer, resource.Resource): if not m: continue - # We found a match! Trigger callback and then return the - # returned response. We pass both the request and any - # matched groups from the regex to the callback. + # We found a match! First update the metrics object to indicate + # which servlet is handling the request. callback = path_entry.callback + servlet_instance = getattr(callback, "__self__", None) + if servlet_instance is not None: + servlet_classname = servlet_instance.__class__.__name__ + else: + servlet_classname = "%r" % callback + + request_metrics.name = servlet_classname + + # Now trigger the callback. If it returns a response, we send it + # here. If it throws an exception, that is handled by the wrapper + # installed by @request_handler. + kwargs = intern_dict({ name: urllib.unquote(value).decode("UTF-8") if value else value for name, value in m.groupdict().items() @@ -265,17 +280,10 @@ class JsonResource(HttpServer, resource.Resource): code, response = callback_return self._send_response(request, code, response) - servlet_instance = getattr(callback, "__self__", None) - if servlet_instance is not None: - servlet_classname = servlet_instance.__class__.__name__ - else: - servlet_classname = "%r" % callback - - request_metrics.name = servlet_classname - return # Huh. No one wanted to handle that? Fiiiiiine. Send 400. + request_metrics.name = self.__class__.__name__ + ".UnrecognizedRequest" raise UnrecognizedRequestError() def _send_response(self, request, code, response_json_object, |