怎样在Python中为Flask API添加Prometheus监控

轻丽酱_9457

轻丽酱_9457

2026-11-01

999人浏览

原创

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

怎样在python中为flask api添加prometheus监控

用 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应用能力赋能!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1851

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4964

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1789

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

29837

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3547

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3567

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1223

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2763

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习