直接安装prometheus-flask-exporter并初始化PrometheusMetrics(app)即可自动暴露/metrics端点,默认采集请求延迟、状态码、方法、路径等HTTP层基础指标,无需手写采集逻辑。

用 prometheus_flask_exporter 快速暴露指标
直接装包加两行代码就能让 Flask 自动暴露 /metrics 端点,不用手写采集逻辑。它会默认记录请求延迟、状态码、方法、路径等基础指标。
安装:pip install prometheus-flask-exporter
在 Flask 应用初始化后立即注册:
from flask import Flask from prometheus_flask_exporter import PrometheusMetrics <p>app = Flask(<strong>name</strong>) metrics = PrometheusMetrics(app)</p><h1>注意:这行必须在 app.run() 之前,且不能放在路由定义之后</h1><p></p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill10420" title="Flask Wrap"><img src="https://img.php.cn/upload/skill/001/246/273/6adaf20d79f23518.jpg" alt="Flask Wrap" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill10420" title="Flask Wrap" class="overflowclass">Flask Wrap</a> <p class="overflowclass">火焰围攻 授权: q15040409-creator.功能概述火焰围攻 授权: q15040409-creator.是一项面向实际任务的技能,主要用于Description.;Flask Web. - Python.;核心要点HTTP?;.Version.1.0.tags. wrap.github.automation.。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。使用与执行使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要</p> </div> <a rel="nofollow" href="/xiazai/skill10420" title="Flask Wrap" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>
启动后访问 http://localhost:5000/metrics 就能看到文本格式的指标数据。默认不采集自定义业务指标,只做 HTTP 层观测。
手动记录自定义指标要选对类型
计数器(Counter)、直方图(Histogram)、摘要(Summary)行为差异很大,错用会导致数据不可解释。
-
Counter只增不减,适合统计“成功调用次数”“错误总数”,不能用来记耗时或大小 -
Histogram按预设桶(bucket)分段统计分布,比如 API 响应时间,推荐用于延迟监控(Prometheus 官方建议) -
Summary实时计算分位数(如 p95),但服务重启后历史分位值丢失,且无法跨实例聚合,生产环境慎用
示例:记录某个关键函数的执行耗时
from prometheus_client import Histogram
<p>func_duration = Histogram('my_func_duration_seconds', 'Time spent in my_func', ['status'])</p><p>@app.route('/do-something')
def do_something():
try:</p><h1>... 业务逻辑</h1><pre class="brush:php;toolbar:false;"> func_duration.labels(status='success').observe(0.123)
return 'OK'
except Exception as e:
func_duration.labels(status='error').observe(0.456)
raise
多进程 Flask(gunicorn)下必须用共享存储
默认情况下,prometheus_flask_exporter 在多 worker 模式下各进程维护独立指标,/metrics 返回的只是当前 worker 的数据,总请求数、总延迟都会严重偏低。
解决方式只有两种:
- 启用
MultiProcessCollector:需设置环境变量PROMETHEUS_MULTIPROC_DIR指向一个可读写的临时目录,并在应用启动前调用prometheus_client.multiprocess.MultiProcessCollector - 改用
gunicorn的--preload模式(不推荐),或干脆只开单 worker(仅限开发)
关键步骤(缺一不可):
import os os.environ['PROMETHEUS_MULTIPROC_DIR'] = '/tmp/prometheus' <h1>在导入 prometheus_client 之前,先确保目录存在</h1><p>import tempfile os.makedirs(os.environ['PROMETHEUS_MULTIPROC_DIR'], exist_ok=True)</p><p>from prometheus_client import multiprocess, CollectorRegistry registry = CollectorRegistry() multiprocess.MultiProcessCollector(registry) </p>
然后把 metrics 初始化改为 metrics = PrometheusMetrics(app, registry=registry)。
避免在请求中频繁调用 labels() 创建新指标对象
每次调用 some_counter.labels(key='value') 都会动态注册一个新指标实例。如果 key 来自用户输入(如 URL 路径、查询参数),可能造成指标爆炸——成千上万个 label 组合,内存暴涨,Prometheus 抓取超时甚至崩溃。
正确做法:
- label 值必须来自有限枚举(如
status只有'success'/'timeout'/'auth_failed') - 路径类 label 用正则归一化,比如把
/user/123和/user/456都映射为/user/ - 完全不确定的维度(如用户 ID、订单号)不要塞进 label,改用日志或追踪系统(如 Jaeger)关联
一个易错例子:
# ❌ 危险:username 来自 request.args,每个用户都生成新指标
login_attempts.labels(username=request.args.get('u')).inc()
<h1>✅ 安全:只按固定状态分类</h1><p>login_attempts.labels(status='failed').inc()
</p>
指标 cardinality 是最常被忽视的性能隐患,上线前务必用 curl -s localhost:5000/metrics | grep '^your_metric_name' | wc -l 粗略检查数量级。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










