middleware.py 文件源码

python
阅读 29 收藏 0 点赞 0 评论 0

项目:django-workload 作者: Instagram 项目源码 文件源码
def memory_cpu_stats_middleware(get_response):
    import time
    import psutil

    from collections import Counter
    from django_statsd.clients import statsd
    from .global_request import get_view_name
    from django.conf import settings

    mem_entries = (
        'rss',
        'shared_clean', 'shared_dirty',
        'private_clean', 'private_dirty'
    )

    def summed(info):
        res = dict.fromkeys(mem_entries, 0)
        for path_info in info:
            for name in mem_entries:
                res[name] += getattr(path_info, name)
        return res

    def middleware(request):
        global SAMPLE_COUNT

        SAMPLE_COUNT += 1
        if SAMPLE_COUNT >= settings.SAMPLE_RATE:
            SAMPLE_COUNT = 0
            cpu_before = time.clock_gettime(time.CLOCK_PROCESS_CPUTIME_ID)
            mem_before = summed(psutil.Process().memory_maps())
            try:
                return get_response(request)
            finally:
                cpu_after = time.clock_gettime(time.CLOCK_PROCESS_CPUTIME_ID)
                statsd.gauge(
                    'cpu.{}'.format(get_view_name()),
                    cpu_after - cpu_before)
                mem_after = summed(psutil.Process().memory_maps())
                mem_key_base = 'memory.{}.{{}}'.format(get_view_name())
                for name, after in mem_after.items():
                    diff = after - mem_before[name]
                    statsd.gauge(mem_key_base.format(name) + '.total', after)
                    statsd.gauge(mem_key_base.format(name) + '.change', diff)
        else:
            return get_response(request)

    return middleware
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号