flask应用需通过prometheus-flask-exporter暴露/metrics端点供prometheus抓取,再经prometheus中转供grafana可视化;自定义指标须用metrics.counter等注册,grafana查询需匹配指标名与label;链路排查应依次验证flask指标暴露、prometheus抓取及grafana查询。

Flask 应用如何暴露 Prometheus 格式指标
Grafana 本身不直接读取 Flask 应用内存或日志,必须通过中间指标采集层(通常是 Prometheus)拉取数据。所以第一步不是连 Grafana,而是让 Flask 输出 Prometheus 能识别的文本格式指标。
推荐用 prometheus-flask-exporter,它自动注册 /metrics 端点,并默认收集 HTTP 请求计数、延迟直方图、Python 进程内存等基础指标。
- 安装:
pip install prometheus-flask-exporter - 初始化时绑定到 Flask 实例:
from prometheus_flask_exporter import PrometheusMetrics→metrics = PrometheusMetrics(app) - 默认暴露在
/metrics,无需额外路由;若需改路径,初始化时传path='/my-metrics' - 注意:不要在开发模式下启用
metrics的export_defaults(默认开启),否则每次请求都会触发计数器递增,导致测试数据失真
Grafana 怎么连接本地运行的 Prometheus
本地调试时,Prometheus 通常跑在 localhost:9090,Grafana 默认不信任本地 HTTP 数据源,容易卡在 “Data source is not available” 错误。
关键不是配置 URL,而是绕过 Grafana 的 CORS 和协议限制:
- Grafana 配置文件
conf/defaults.ini中,确保allow_embedding = true(用于 iframe 嵌入) - 启动 Prometheus 时加参数:
--web.allow-origin="*"(仅限本地开发,生产禁用) - Grafana 添加数据源时,URL 填
http://host.docker.internal:9090(Mac/Windows Docker Desktop),Linux 则用http://172.17.0.1:9090(宿主机 IP) - 如果用
docker-compose,把 Flask、Prometheus、Grafana 放同一网络,用服务名http://prometheus:9090更可靠
Flask 自定义指标怎么写进 Grafana 查询语句
内置指标如 flask_http_request_total 可直接用,但业务指标(比如“订单创建失败次数”)需要手动注册并暴露,否则 Grafana 查不到。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
用 metrics.counter 或 metrics.gauge 注册后,名字会变成 Prometheus 的合法标识符(自动转下划线、小写):
order_failed = metrics.counter(
'order_create_failed_total',
'Total number of failed order creations',
labels=['reason']
)
之后在 Grafana 查询中写:rate(order_create_failed_total{job="my-flask-app"}[5m]),注意:
- label 名必须小写,
reason不能写成Reason,否则查询为空 - 如果指标没出现在 Prometheus 的
/targets页面里,说明 Flask 没真正上报——检查 Flask 日志是否有Failed to connect to prometheus pushgateway类错误(你没配 pushgateway 就不该出现这句) - Grafana 的变量(Variable)若想动态列出
reason值,查询类型选Label values,Label name 填reason,Data source 选 Prometheus
为什么 Grafana 看板刷新慢或数据断层
这不是 Grafana 的问题,而是 Prometheus 抓取间隔和 Flask 指标生命周期不匹配造成的常见假象。
- Prometheus 默认抓取间隔是 15s,如果 Flask 应用重启,所有 counter 指标重置为 0,会导致
rate()计算出负值或跳变——Grafana 默认隐藏异常值,看起来就像“断层” - 解决方法:在 Prometheus 配置里给 job 加
honor_labels: true,并在 Flask 启动时用metrics.info('app_info', 'App version and build info', version='1.2.3')打上唯一标识,避免多实例指标混淆 - 另一个坑:Grafana 时间范围选了 “Last 5 minutes”,但 Prometheus 还没抓到最新数据(刚启动或网络延迟),可临时调大
scrape_timeout并观察/targets页面的 Last Scrape Time - 别依赖
gauge做累计值——它不会自动重置,Flask 进程重启后旧值残留,要用counter+rate()或increase()
指标链路里任意一环(Flask 暴露、Prometheus 抓取、Grafana 查询)出问题,表现都是“没数据”,但根因差异很大。先确认 curl http://localhost:5000/metrics 能看到你的自定义指标,再查 Prometheus 的 Targets 页面,最后才调 Grafana 查询表达式。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










