Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
hub-client / dockerhub / telemetry / middleware.py
Size: Mime:
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)