flask应用暴露/metrics端点需用flask-prometheus-metrics等中间件自动注册,避免手写逻辑;其默认采集http_request_duration_seconds等指标,但le标签全+inf说明计时未启用,须检查enable_metrics配置、debug模式及wsgi中间件顺序。

Flask 应用没暴露 /metrics 端点?先装对库再挂中间件
直接用 prometheus_client 自己手写指标收集太重,容易漏掉请求延迟、状态码分布等关键维度。推荐用 flask-prometheus-metrics 这类轻量中间件,它自动注册 /metrics 路由并默认采集:http_request_duration_seconds、http_requests_total、http_request_size_bytes 等核心指标。
安装和初始化只需三步:
- 运行
pip install flask-prometheus-metrics - 在 Flask 实例创建后立即初始化:
from flask_prometheus_metrics import register_metrics app = Flask(__name__) register_metrics(app, app_version="1.0.0", pvc_name="my-app")
- 确保不手动覆盖
/metrics路由 —— 该库会自动注册,重复定义会报AssertionError: View function mapping is overwriting an existing endpoint function
为什么 http_request_duration_seconds 的 le 标签全是 +Inf?检查是否启用了计时器
默认情况下,flask-prometheus-metrics 只在启用性能监控时才打点。如果看到直方图指标的 le(less than or equal)标签全为 +Inf,说明延迟分桶未生效,本质是中间件没真正开始计时。
原因通常有两个:
- 调用
register_metrics()时传了app_config=None或未正确读取配置,导致ENABLE_METRICS=True没生效 - Flask 的
DEBUG=True模式下,某些版本的中间件会跳过耗时统计(避免干扰调试),上线前务必确认app.run(debug=False)或用gunicorn启动 - 自定义 WSGI 中间件顺序错误,比如把身份认证中间件放在 metrics 之前但没调用
start_time,会导致计时起点偏移
想按 API 路径(如 /api/users)或视图函数名聚合指标?得改 group_by 参数
默认指标的 path label 是原始 URL(含参数,如 /api/users/123),导致时间序列爆炸。要收敛成模板化路径(如 /api/users/{id}),不能靠 Prometheus 端 relabel —— 必须在 Flask 层统一归一化。
flask-prometheus-metrics 支持通过 group_by 控制维度来源:
- 设
group_by="endpoint":用request.endpoint(即视图函数名),适合内部服务,label 值稳定如user_api.get_user - 设
group_by="url_rule":用request.url_rule.rule(即路由定义字符串),值为/api/users/<user_id></user_id>,需确保所有 route 都用了变量规则而非硬编码 - 避免用
group_by="path"(默认),尤其当接口带查询参数或动态 ID 时,cardinality 会失控
示例初始化:
register_metrics(
app,
group_by="url_rule",
app_version="1.0.0"
)
本地调试时指标不更新?别忘了清除 flask.g 和线程局部存储
开发时用 app.run(debug=True, use_reloader=True),代码热重载会导致 prometheus_client 的全局 registry 被重复初始化,新旧指标混在一起,curl /metrics 可能返回重复的 http_requests_total 定义,Prometheus 抓取时报 text format parsing error。
解决方法很具体:
- 启动前加环境变量:
export PROMETHEUS_MULTIPROC_DIR=/tmp/prometheus_flask,然后用pip install prometheus-client[multiprocess],让多进程模式接管 registry - 或者干脆关掉 reloader:
app.run(debug=True, use_reloader=False),调试期间手动重启 - 切勿在每次请求里调用
Counter(...).inc()—— 这会新建对象,导致指标实例泄漏,必须复用模块级定义的指标对象
最易被忽略的是:Gunicorn 多 worker 场景下,不配 PROMETHEUS_MULTIPROC_DIR 就永远抓不到准确总数 —— 每个 worker 维护独立 registry,Prometheus 只拉到其中一个的快照。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











