You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Flask与Prometheus Client自定义指标声明位置咨询

在Flask中添加自定义Prometheus指标的正确位置

你的代码已经搭好了基础的Prometheus metrics路由,接下来自定义指标的声明其实很清晰——必须放在全局作用域(或者请求处理流程之外的作用域),不能在路由函数内部定义,不然每次请求都会尝试创建新的指标,Prometheus会抛出重复注册的错误。

给你一个完整的示例,包含自定义Counter指标的声明和使用:

from flask import Flask
from werkzeug.middleware.dispatcher import DispatcherMiddleware
from prometheus_client import make_wsgi_app, Counter

# 全局声明自定义指标:记录Flask请求总数,按endpoint标签区分
REQUEST_COUNT = Counter(
    'flask_requests_total',
    'Total number of incoming Flask requests',
    ['endpoint']
)

app = Flask(__name__)

# 挂载Prometheus metrics路由
app.wsgi_app = DispatcherMiddleware(app.wsgi_app, {
    '/metrics': make_wsgi_app()
})

@app.route('/')
def home():
    # 在路由处理逻辑中更新指标
    REQUEST_COUNT.labels(endpoint='/').inc()
    return "Hello from Flask!"

@app.route('/api/user')
def get_user():
    REQUEST_COUNT.labels(endpoint='/api/user').inc()
    return {"user_id": 123, "name": "John Doe"}

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

关键注意点:

  • 全局作用域声明:指标需要在应用启动时就完成注册,所以要放在路由函数之外,比如文件顶部、app实例创建前后都可以,只要是全局可见的位置。
  • 指标类型选择:根据你的需求选合适的指标类型:
    • Counter:只增不减的计数器(比如请求数、错误数)
    • Gauge:可以增减的仪表盘(比如当前在线用户数、内存使用率)
    • Histogram:记录分布情况(比如请求耗时)
    • Summary:类似Histogram,但会计算分位数
  • 自定义Registry(可选):如果需要隔离不同的指标集合,可以创建自定义CollectorRegistry,然后在声明指标和创建wsgi应用时指定:
    from prometheus_client import CollectorRegistry, Gauge
    
    # 创建自定义注册表
    custom_registry = CollectorRegistry()
    # 把指标注册到自定义注册表
    ONLINE_USERS = Gauge('online_users', 'Current number of online users', registry=custom_registry)
    
    # 挂载时指定自定义注册表
    app.wsgi_app = DispatcherMiddleware(app.wsgi_app, {
        '/metrics': make_wsgi_app(registry=custom_registry)
    })
    

启动应用后,访问http://localhost:5000/metrics就能看到你自定义的flask_requests_total指标了。

内容的提问来源于stack exchange,提问作者Nicolas Berthier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 11:47:49