核心是Flask集成prometheus_client并暴露/metrics端点:用PrometheusMetrics(app)自动注册路由,避免手动实现;注意调试模式冲突、路由占用、Gunicorn多进程需配置prometheus_multiproc_dir;业务指标用Counter等全局定义并打点。

Flask 应用暴露 Prometheus 指标后,Grafana 才能拉取并可视化;不暴露指标,Grafana 就是空转——所以核心动作是:在 Flask 中集成 prometheus_client 并正确暴露 /metrics 端点。
如何让 Flask 自动暴露 /metrics 端点
最轻量的方式是直接挂载 PrometheusMetrics 实例到 Flask app,它会自动注册 /metrics 路由,并默认采集 HTTP 请求计数、延迟直方图和 Python 运行时指标。
实操建议:
- 安装依赖:
pip install prometheus-client flask - 在应用初始化后立即初始化 metrics:
metrics = PrometheusMetrics(app) - 不要手动实现
/metrics视图——PrometheusMetrics已内置,重复定义会导致 404 或 500 - 若使用工厂模式(
create_app()),确保metrics在 app 创建后、返回前完成绑定 - 默认路径是
/metrics,可通过PrometheusMetrics(app, path='/monitoring/metrics')修改,但需同步更新 Prometheus 配置中的metrics_path
为什么 Flask 的 /metrics 返回空或 404
常见错误不是代码写错,而是指标暴露被中间件拦截、路由冲突或未启用调试/热重载干扰。
立即学习“Python免费学习笔记(深入)”;
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
排查要点:
- 检查是否启用了
app.debug = True且同时用了 Werkzeug 重载器——某些旧版prometheus_client与重载器冲突,导致/metrics不注册;升级到prometheus-client>=0.17.0可解决 - 确认没有其他扩展(如 Flask-Admin、Swagger UI)占用了
/metrics路径;可用app.url_map打印所有路由验证 - 若用 Gunicorn 启动,必须启用多进程模式下的指标共享——否则每个 worker 维护独立指标;需设置
prometheus_multiproc_dir环境变量并指向可写目录,且提前创建prometheus_multiproc_dir下的index.json - 访问
curl http://localhost:5000/metrics时返回空文本?大概率是未触发任何请求——flask_http_request_total类指标只在有真实 HTTP 流量后才出现
如何自定义业务指标(比如用户登录次数)
用 Counter、Gauge、Histogram 注册命名明确的指标,比硬塞进默认 HTTP 指标更利于后期查询和告警。
实操建议:
- 全局定义一次,避免视图里重复
Counter('login_attempts_total', 'Total login attempts')——重复定义会引发ValueError: Duplicated timeseries in CollectorRegistry - 推荐在模块顶层或
metrics.py中集中声明:login_counter = Counter('user_login_total', 'Total user logins', ['status']) - 在视图中打点:
login_counter.labels(status='success').inc()或login_counter.labels(status='failed').inc() - 避免在循环内高频调用
.inc();如需每秒统计,请用Gauge+ 定时任务聚合,而非实时累加 - Grafana 查询时,
user_login_total{status="success"}可直接作面板 metric,无需额外处理
真正容易被忽略的是多进程部署时的指标持久化——Gunicorn worker 重启后,内存里的计数器就清零了,而 prometheus_multiproc_dir 必须存在且权限正确,否则指标直接消失,Grafana 图表变平。别等上线后看图表不动才去查目录权限。

















