Метрики Django Rest Framework по запросам пользователей

В настоящее время я работаю над сборкой Api с Django Rest Framework, uwsgi nginx и memcached.

Я хотел бы знать, как лучше всего получать статистику пользователей, например количество запросов на пользователя? Принимая во внимание, что инфраструктура, вероятно, будет масштабироваться до нескольких серверов.

И есть ли способ определить, был ли ответ получен из кеша или из приложения?

Я думаю об обработке журналов Nginx, чтобы разделить запрос по пользователю и применить все вычисления.


person alejandrodnm    schedule 29.05.2014    source источник


Ответы (2)


Во-первых: вы можете найти drf-tracking как полезный проект, но он сохраняет ответ на каждый запрос в базе данных, который мы сочли сумасшедшим.

Вместо этого мы разработали миксин, который в значительной степени заимствует у drf-tracking, но регистрирует только статистику. Это решение использует наш кеш-сервер (Redis), поэтому работает очень быстро.

Это очень просто, если вы уже используете Redis:

class LoggingMixin(object):
    """Log requests to Redis

    This draws inspiration from the code that can be found at: https://github.com/aschn/drf-tracking/blob/master/rest_framework_tracking/mixins.py

    The big distinctions, however, are that this code uses Redis for greater
    speed, and that it logs significantly less information.

    We want to know:
     - How many queries in last X days, total?
     - How many queries ever, total?
     - How many queries total made by user X?
     - How many queries per day made by user X?
    """

    def initial(self, request, *args, **kwargs):
        super(LoggingMixin, self).initial(request, *args, **kwargs)

        d = date.today().isoformat()
        user = request.user
        endpoint = request.resolver_match.url_name

        r = redis.StrictRedis(
            host=settings.REDIS_HOST,
            port=settings.REDIS_PORT,
            db=settings.REDIS_DATABASES['STATS'],
        )
        pipe = r.pipeline()

        # Global and daily tallies for all URLs.
        pipe.incr('api:v3.count')
        pipe.incr('api:v3.d:%s.count' % d)

        # Use a sorted set to store the user stats, with the score representing
        # the number of queries the user made total or on a given day.
        pipe.zincrby('api:v3.user.counts', user.pk)
        pipe.zincrby('api:v3.user.d:%s.counts' % d, user.pk)

        # Use a sorted set to store all the endpoints with score representing
        # the number of queries the endpoint received total or on a given day.
        pipe.zincrby('api:v3.endpoint.counts', endpoint)
        pipe.zincrby('api:v3.endpoint.d:%s.counts' % d, endpoint)

        pipe.execute()

Поместите это где-нибудь в своем проекте, а затем добавьте миксин в различные представления, например:

class ThingViewSet(LoggingMixin, viewsets.ModelViewSet):
    # More stuff here.

Некоторые заметки о классе:

  • Он использует конвейеры Redis, чтобы все запросы Redis попадали на сервер одним запросом вместо шести.
  • Он использует Сортированные наборы, чтобы отслеживать, какие конечные точки в вашем API используются чаще всего и какие пользователи используют API больше всего.
  • Он создает в вашем кеше несколько новых ключей в день - могут быть способы сделать это лучше, но я не могу их найти.

Это должно быть довольно гибкой отправной точкой для регистрации API.

person mlissner    schedule 30.12.2015

Обычно у меня есть централизованный кеш-сервер (Redis), я записываю туда все запросы со всеми настраиваемыми вычислениями или полями, которые мне нужны. Затем вы можете создать свою собственную панель управления.

OR

Выбирайте Logstash от компании Elasticsearch. Очень хорошо сделано, экономит ваше время и очень хорошо масштабируется. Я бы сказал, попробуйте http://michael.bouvy.net/blog/en/2013/11/19/collect-visualize-your-logs-logstash-elasticsearch-redis-kibana/

person bhappy    schedule 29.05.2014