Во-первых: вы можете найти 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