django-prometheus中间件已内置线程安全、低开销的请求延迟直方图和多维计数器,覆盖异常、重定向、流式响应等边界场景,且严格遵循Prometheus命名规范与标签维度;自定义时间戳统计易漏异常路径、嵌套不一致、标签不兼容等问题。

直接用 django-prometheus 的中间件,别自己写耗时统计逻辑 —— 它已内置请求延迟直方图、按视图/状态码分组的计数器,且线程安全、低开销。
为什么不用自定义中间件记录耗时
自己在 process_request 和 process_response 里打时间戳再算差值,看似简单,但容易漏掉几类关键场景:
- 视图抛出异常时,
process_response不会执行,耗时就丢失了 - 多个中间件嵌套下,不同中间件对“请求开始/结束”的理解可能不一致
- Prometheus 指标需要满足命名规范(如
django_http_requests_latency_seconds_bucket)、标签维度(view,method,status),手写难保证兼容性 - 原生中间件还自动处理了重定向、流式响应等边界 case,自己实现易出错
django_prometheus.middleware.PrometheusBeforeMiddleware 和 PrometheusAfterMiddleware 怎么配
这两个中间件必须成对出现,且顺序不能错 —— Before 放最前,After 放最后,确保覆盖所有请求生命周期:
-
PrometheusBeforeMiddleware在所有其他中间件之前插入,打下起始时间戳并初始化指标上下文 -
PrometheusAfterMiddleware在所有其他中间件之后执行,完成耗时观测、状态码标记、视图名提取 - 如果只加一个,或顺序颠倒,会导致指标缺失或重复计数
正确配置示例(settings.py):
MIDDLEWARE = [
'django_prometheus.middleware.PrometheusBeforeMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
# ... 其他中间件
'django.middleware.common.CommonMiddleware',
'django_prometheus.middleware.PrometheusAfterMiddleware', # 必须放在最后
]
如何验证耗时指标是否生效
启动 Django 后访问 /metrics/(需提前配置路由),搜索以下指标名确认数据存在:
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
-
django_http_requests_latency_seconds_bucket:带le="0.1"等 label 的直方图桶,说明延迟采集已启用 -
django_http_requests_total:检查是否有view="myapp.views.home"这类 label,代表视图维度已打上 - 故意触发一个 404 或 500,看对应
status="404"/status="500"的计数是否增长
若只看到 django_http_requests_total{method="GET",status="200"} 但没有 view 标签,说明 PrometheusAfterMiddleware 未生效或被其他中间件干扰(比如某些重写 request.resolver_match 的中间件)。
数据库和缓存耗时怎么一起监控
django-prometheus 的耗时监控不止 HTTP 层,它通过替换数据库后端和缓存后端来采集更底层指标:
- 数据库:把
DATABASES['default']['ENGINE']改为'django_prometheus.db.backends.postgresql'(或其他对应引擎),就能自动暴露django_db_query_duration_seconds - 缓存:使用
django_prometheus.cache.backends.redis.RedisCache替代原生RedisCache,获得django_cache_gets_total等指标 - 注意:这些后端替换是侵入性的,需确保你用的是官方支持的数据库/缓存类型,否则可能引发连接异常
真正容易被忽略的是:HTTP 耗时、DB 耗时、缓存耗时三者不在同一时间轴上对齐 —— Prometheus 默认只拉取 /metrics/ 瞬时快照,无法还原单个请求内各环节耗时分布。要关联分析,得靠 Grafana 的「Trace ID」字段或额外集成 OpenTelemetry。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










