django-prometheus 无效的主因是中间件顺序、URL 路由未正确引入、DEBUG=True 屏蔽指标、自定义指标定义位置错误、INSTALLED_APPS 顺序不当、多进程下未启用 multiproc 模式。

django-prometheus 为什么装不上或没效果
常见现象是 pip install django-prometheus 成功,但访问 /metrics 404,或者指标里完全看不到 Django 自带的请求延迟、视图调用次数等。根本原因不是库没装好,而是中间件和 URL 路由没对上号。
- 必须把
PrometheusBeforeMiddleware放在MIDDLEWARE最前面(Django 4.2+ 推荐用PrometheusAfterMiddleware放最后),否则指标统计会漏掉异常中断的请求 -
urlpatterns里得显式 includedjango_prometheus.urls,不能只靠path('metrics/', ...)手动写——它内部依赖多个子路由,漏了就 404 - Django 的
DEBUG=True时,django-prometheus默认禁用部分指标(比如数据库查询详情),上线前不切DEBUG=False就永远看不到真实 SQL 统计
如何暴露自定义业务指标(比如订单创建量)
硬编码 Counter 或 Gauge 到视图里看似简单,但容易导致命名冲突、标签混乱、甚至内存泄漏——Prometheus 客户端对象不是一次性的,得复用。
- 所有指标对象(
Counter、Gauge、Histogram)必须定义在模块顶层,不能在函数内反复Counter(...)—— 同名指标重复注册会报ValueError: Duplicated metrics - 业务维度用
labels,别拼接字符串:写order_created_total.labels(status="paid"),而不是order_created_paid_total,否则 Grafana 里没法做 status 分组聚合 - 如果指标要按用户 ID 统计,谨慎加
user_id标签——ID 是高基数字段,会导致指标数量爆炸,可能拖垮 Prometheus;改用低基数分类(如user_tier="premium")更安全
为什么 /metrics 返回空或只有 Python 进程指标
这是最常被忽略的一点:Django 默认不自动注册自己的内置指标(如 django_http_requests_total),得手动触发初始化。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 确保
INSTALLED_APPS包含'django_prometheus',且位置要在你自定义 app 之前——否则你的 app 里的模型、admin 注册逻辑可能早于指标注册,导致 DB 表相关指标缺失 - 检查
settings.py是否误删了PROMETHEUS_METRICS_EXPORT_PORT或设成了 0 —— 这个配置只影响多进程模式下的端口分发,单进程开发时不影响,但有人复制生产配置过来就卡在这儿 - 用
curl -s http://localhost:8000/metrics | grep django_http确认有没有django_http_开头的行;没有的话,大概率是中间件顺序或INSTALLED_APPS没生效
Gunicorn + Prometheus 多进程下指标不准怎么办
默认跑 Gunicorn 多 worker 时,每个进程独立维护自己的计数器,/metrics 每次只返回当前 worker 的数据,Prometheus 抓到的就是“随机样本”,总量永远对不上。
- 必须启用
prometheus_client的多进程模式:设置环境变量PROMETHEUS_MULTIPROC_DIR指向一个可写的临时目录(如/tmp/prometheus-django),并在启动前清空该目录 - Gunicorn 启动命令里要加
--preload,否则每个 worker 会各自初始化 client,导致 multiproc 文件写乱;不加的话,prometheus_client.values.MultiProcessCollector会静默失败 - 验证是否生效:抓取后看指标里是否有
_created后缀的时间戳(如django_http_requests_total_created),有说明 multiproc 已激活;没有就还是单进程假象
多进程共享指标这事,不碰 Gunicorn 几乎不会出问题;一碰就容易卡在环境变量、目录权限、preload 三者缺一,而且错误不报,只能靠 ls -l $PROMETHEUS_MULTIPROC_DIR 看文件生成情况来定位。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










