# 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