Created
August 23, 2017 15:51
-
-
Save nikicat/de7eea1292d2e6cf6265a0a9e2eb9ba7 to your computer and use it in GitHub Desktop.
measured.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import functools | |
import inspect | |
from django_statsd.clients import statsd | |
def measured(): | |
def decorator(func): | |
def get_metric_name(metric): | |
return 'measured.%s.module_is_%s.func_is_%s' % (metric, func.__module__.replace('.', ':'), func.__name__) | |
def increment(metric): | |
return statsd.gauge(get_metric_name(metric), 1, delta=True) | |
if inspect.isgeneratorfunction(func): | |
@functools.wraps(func) | |
def wrapper(*args, **kwargs): | |
# Use gauges instead of counters to be able | |
# to count difference on server side | |
increment('started') | |
try: | |
with statsd.timer(get_metric_name('time')): | |
yield from func(*args, **kwargs) | |
except: | |
increment('failed') | |
raise | |
else: | |
increment('succeeded') | |
finally: | |
increment('finished') | |
else: | |
@functools.wraps(func) | |
def wrapper(*args, **kwargs): | |
# Use gauges instead of counters to be able | |
# to count difference on server side | |
increment('started') | |
try: | |
with statsd.timer(get_metric_name('time')): | |
result = func(*args, **kwargs) | |
except: | |
increment('failed') | |
raise | |
else: | |
increment('succeeded') | |
finally: | |
increment('finished') | |
return result | |
return wrapper | |
return decorator |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment