Commit 7927f436 authored by Antoine Millet's avatar Antoine Millet
Browse files

Added logging of handler calls

parent c5516bde
Loading
Loading
Loading
Loading
+24 −1
Original line number Diff line number Diff line
@@ -14,12 +14,18 @@
# along with CloudControl.  If not, see <http://www.gnu.org/licenses/>.


import os
import inspect
import time
import functools
import base64

from sjrpc.utils import RpcHandler

from cloudcontrol.server import __version__

import prctl


def listed(func):
    func.__listed__ = True
@@ -77,7 +83,24 @@ class CCHandler(RpcHandler):
            raise KeyError('Remote name %s is private.' % repr(name))
        else:
            self.logger.debug('Called %s.%s', self.__class__.__name__, name)
            return super(CCHandler, self).__getitem__(name)
            return self._stats_decorator(super(CCHandler, self).__getitem__(name))

    def _stats_decorator(self, func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            call_id = base64.b64encode(os.urandom(6))
            if getattr(func, '__threaded__', True):
                prctl.set_name('H: %s' % call_id)
            started = time.time()
            returned = func(*args, **kwargs)
            duration = time.time() - started

            self.logger.info('Called handler [%s] by %s: %s(%s, %s) -> %.2f',
                             call_id, self.client.login, func.__name__, args,
                             kwargs, duration)

            return returned
        return wrapper

    @property
    def logger(self):