# HG changeset patch # User Marcin Kuzminski # Date 2017-01-18 23:03:43 # Node ID 1e471c218ae54d9fd3ed1332c725ec5a9dfb8c8f # Parent 885731a24afb533f3f6c4ec417c4a5fccecc1fd1 vcsserver: http main added time measuring tween for debugging. diff --git a/vcsserver/http_main.py b/vcsserver/http_main.py --- a/vcsserver/http_main.py +++ b/vcsserver/http_main.py @@ -216,6 +216,10 @@ class HTTPApplication(object): self.config.add_view( self.general_error_handler, context=Exception) + self.config.add_tween( + 'vcsserver.tweens.RequestWrapperTween', + ) + def wsgi_app(self): return self.config.make_wsgi_app() @@ -234,6 +238,7 @@ class HTTPApplication(object): pass args.insert(0, wire) + log.debug('method called:%s with kwargs:%s', method, kwargs) try: resp = getattr(remote, method)(*args, **kwargs) except Exception as e: diff --git a/vcsserver/tweens.py b/vcsserver/tweens.py new file mode 100644 --- /dev/null +++ b/vcsserver/tweens.py @@ -0,0 +1,60 @@ +# RhodeCode VCSServer provides access to different vcs backends via network. +# Copyright (C) 2014-2017 RodeCode GmbH +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + + +import time +import logging + + +from vcsserver.utils import safe_str + + +log = logging.getLogger(__name__) + + +def get_access_path(request): + environ = request.environ + return environ.get('PATH_INFO') + + +class RequestWrapperTween(object): + def __init__(self, handler, registry): + self.handler = handler + self.registry = registry + + # one-time configuration code goes here + + def __call__(self, request): + start = time.time() + try: + response = self.handler(request) + finally: + end = time.time() + + log.info('IP: %s Request to %s time: %.3fs' % ( + '127.0.0.1', + safe_str(get_access_path(request)), end - start) + ) + + return response + + +def includeme(config): + config.add_tween( + 'vcsserver.tweens.RequestWrapperTween', + )