gpt4 book ai didi

每个用户请求的 Django Rest Framework 指标

转载 作者:行者123 更新时间:2023-12-05 01:04:03 25 4
gpt4 key购买 nike

我目前正在使用 Django Rest Framework、uwsgi nginx 和 memcached 进行 Api 构建。

我想知道获取用户统计信息(例如每个用户的请求数)的最佳方法是什么?考虑到基础设施可能会扩展到多台服务器。

有没有办法确定响应是从缓存还是从应用程序中检索的?

我在想的是处理 Nginx 日志以按用户分离请求并应用所有计算。

最佳答案

第一:你可能会find drf-tracking to be a useful project ,但它将对每个请求的响应存储在数据库中,我们发现这有点疯狂。

我们为此开发的解决方案是从 drf-tracking 大量借用的 mixin。 ,但这仅记录统计信息。此解决方案使用我们的缓存服务器 (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()

把它放在你的项目中,然后将 mixin 添加到你的各种 View 中,如下所示:
class ThingViewSet(LoggingMixin, viewsets.ModelViewSet):
# More stuff here.

关于类(class)的一些说明:
  • 它使用 Redis 管道使所有 Redis 查询以一个请求而不是六个请求命中服务器。
  • 它使用 Sorted Sets跟踪 API 中哪些端点使用最多,哪些用户使用 API 最多。
  • 它每天在您的缓存中创建一些新键——可能有更好的方法来做到这一点,但我找不到任何方法。

  • 这应该是记录 API 的一个相当灵活的起点。

    关于每个用户请求的 Django Rest Framework 指标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23932825/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com