Skip to content

Instantly share code, notes, and snippets.

@nikicat
Created August 23, 2017 15:51
Show Gist options
  • Save nikicat/de7eea1292d2e6cf6265a0a9e2eb9ba7 to your computer and use it in GitHub Desktop.
Save nikicat/de7eea1292d2e6cf6265a0a9e2eb9ba7 to your computer and use it in GitHub Desktop.
measured.py
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