# Copyright (c) 2014 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import time import functools import logging _registry = {} def stat(category=None): """ Decorator that registers the function as a function that, when called, will submit a stat to statsd. @param category: The set of servers to be run against. @param f: A function that submits stats. @returns: f """ def curry(f): # pylint: disable-msg=C0111 _registry.setdefault(category, []).append(f) return f return curry def loop_stat(category=None): """ Decorator that registers the function as a function that, when called, will submit a stat to statsd. This function is then registered so that it will be called periodically. You probably want to use this one. @param category: The set of servers to be run against. @param f: A function that submits stats. @returns: f """ def curry(f): # pylint: disable-msg=C0111 @functools.wraps(f) def looped(*args, **kwargs): # pylint: disable-msg=C0111 while True: try: f(*args, **kwargs) except Exception as e: logging.exception(e) time.sleep(15) _registry.setdefault(category, []).append(looped) return f return curry def registered_functions(): """ Return all functions registered as a stat. returns: A list of 0-arity functions. """ return _registry