欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

django中间件

时间:2023-04-28

最近有个需要用prometheus对django服务的接口进行监控的任务,由于接口比较多,写装饰器比较麻烦,因此,研究了中间件的用法

1、编写monitor.middleware

编写一个middleware.py文件,内容如下:

from django.http import HttpResponsefrom django.utils.deprecation import MiddlewareMixinfrom django.views import Viewfrom prometheus_client import CollectorRegistry, Counter, generate_latest, Gaugeimport time# 注册采集器LABELS = ['req_status', 'req_method', 'req_url'] # 标签定义REGISTRY = CollectorRegistry()class ExporterView(View): """ exporter主页面 """ def get(self, request, *args, **kwargs): return HttpResponse(generate_latest(REGISTRY), status=200, content_type="application/json")class MonitorMiddleware(MiddlewareMixin): """ 监控指标埋点 该类主要是采集http性能相关的指标 """ def __init__(self, get_response=None, t=None): super().__init__(get_response) self.start = t self.g_requests_total = Counter('requests_total', 'url request total num', LABELS, registry=REGISTRY ) self.g_response_time_seconds = Gauge('avg_response_time_seconds', 'Seconds of prediction cost in total', LABELS, registry=REGISTRY ) def process_request(self, request): self.start = time.time() def process_response(self, request, response): method = request.method status = response.status_code url = request.path avg_rt = time.time() - self.start self.g_requests_total.labels(status, method, url).inc() # 统计请求次数 self.g_response_time_seconds.labels(status, method, url).set(avg_rt) return response

然后,在setting.py中配置该中间件

MIDDLEWARE = [ '....', # 其它默认的中间件 'monitor.middleware.MonitorMiddleware', # 自定义的监控中间件]

将django工程打包成docker镜像后,启动django工程(本项目使用8080端口),可以在该url下看到监控日志http:// :8080/metrics

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。