Repository URL to install this package:
|
Version:
0.32.0 ▾
|
import inspect
import timeit
from django.http import Http404
# see http://statsd.readthedocs.org/en/latest/configure.html
from .client import statsd
class TimingRequestMiddleware(object):
def __init__(self):
# namespace for all hub requests timing, labels will expand on service
self.timing_metric = 'request_duration_microseconds'
self.status_metric = 'request_status_code'
def process_view(self, request, view_func, view_args, view_kwargs):
view = view_func
if not inspect.isfunction(view_func):
view = view.__class__
try:
view_module = view.__module__.replace(".", "-")
view_name = view.__name__.replace(".", "-")
request._view_name = "{}-{}".format(view_module, view_name)
request._start_time = timeit.default_timer()
except AttributeError: # pragma: no cover
pass
def process_exception(self, request, exception):
"""
If we get an exception, we want to store count as a 500.
Django will handle the 404 as an exception but it will always pass to
the regular response, so we need to avoid counting twice.
"""
try:
if not isinstance(exception, Http404):
self.record_status(request, '500')
except:
pass
def process_response(self, request, response):
try:
self.record_time(request)
self.record_status(request, response.status_code)
except Exception:
# if we don't get a timing, don't send any timing
pass
return response
def record_time(self, request):
if hasattr(request, '_start_time'):
# in milliseconds
request_time = float((timeit.default_timer() - request._start_time) * 1000)
tags = ['view:{}'.format(request._view_name), 'method:{}'.format(request.method)]
statsd.timing(self.timing_metric, request_time, tags=tags)
return tags, request_time
def record_status(self, request, status_code):
""" Increment the view counter per status code """
tags = [
'view:{}'.format(request._view_name),
'method:{}'.format(request.method),
'status_code:{}'.format(status_code),
]
statsd.increment(self.status_metric, tags=tags)