跳到主要内容

Flask集成Prometheus客户端

前言

Prometheus 是一个开源的系统监控和警报工具包,广泛应用于云原生和微服务架构中。在 Flask 应用中集成 Prometheus 客户端可以让您轻松地收集和暴露应用指标,例如请求次数、响应时间、错误率等,从而实现对应用性能的实时监控和预警。

通过本文,您将学习到如何在 Flask 应用中集成 prometheus-flask-exporter 扩展,配置基本的指标收集,并将指标暴露给 Prometheus 服务器进行抓取。

安装

在 Flask 应用中集成 Prometheus 监控,主要依赖 prometheus-flask-exporter 包,它封装了 prometheus_client 并提供了 Flask 专用的中间件和装饰器。

使用 pip 安装

pip install prometheus-flask-exporter

依赖说明

  • prometheus-flask-exporter:Flask 专用的 Prometheus 指标收集器,自动生成 HTTP 请求、响应时间等指标。
  • prometheus_client:Prometheus 官方 Python 客户端库,通常由上述包自动引入。

环境要求

  • Python 3.7+
  • Flask 1.0+

基本概念

在开始集成之前,了解几个 Prometheus 的核心概念会帮助您更好地理解后续的配置和使用。

指标(Metrics)

指标是 Prometheus 监控的基本单位,代表被监控系统的某个可测量属性。例如:HTTP 请求总数、请求延迟、内存使用量等。

指标类型

Prometheus 定义了四种主要的指标类型:

  1. Counter(计数器):只增不减的数值,常用于记录请求次数、错误次数等。
    • 示例:http_requests_total
  2. Gauge(仪表盘):可增可减的数值,常用于记录当前值,如并发连接数、内存使用量等。
    • 示例:memory_usage_bytes
  3. Histogram(直方图):对观察值(如请求延迟)进行采样,并在可配置的桶中计数。同时提供所有观察值的总和。
    • 示例:http_request_duration_seconds
  4. Summary(摘要):类似于直方图,但直接在客户端计算分位数(quantiles)。
    • 示例:http_request_duration_quantiles

标签(Labels)

标签是指标的维度,用于区分同一指标的不同维度。例如,可以为 http_requests_total 添加 methodendpointstatus 等标签,以便按这些维度进行筛选和聚合。

/metrics 端点

Prometheus 客户端会暴露一个 HTTP 端点(默认为 /metrics),其中包含所有已注册指标的当前值,格式为纯文本。Prometheus 服务器定期抓取该端点以收集指标数据。

prometheus-flask-exporter 提供的默认指标

prometheus-flask-exporter 会自动为 Flask 应用生成以下指标:

  • flask_http_request_total:请求总数(Counter)
  • flask_http_request_duration_seconds:请求耗时分布(Histogram)
  • flask_http_request_exceptions_total:异常次数(Counter)

基本使用

快速开始

以下是一个最简单的 Flask 应用集成 Prometheus 的示例:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)
metrics = PrometheusMetrics(app)

@app.route('/')
def index():
return 'Hello, World!'

@app.route('/health')
def health():
return 'OK', 200

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

启动应用后,访问 http://localhost:5000/metrics 即可看到 Prometheus 格式的指标数据。

指标端点自定义

默认情况下,指标端点位于 /metrics。您可以通过 defaults 参数修改路径:

metrics = PrometheusMetrics(app, defaults_prefix='myapp')

此时端点将变为 /myapp/metrics

添加自定义指标

除了默认的 HTTP 指标,您还可以定义自己的业务指标。

使用装饰器记录函数调用

from prometheus_flask_exporter import Counter

custom_counter = Counter('my_custom_counter', 'Description of my counter')

@app.route('/custom')
@metrics.counter('custom_endpoint_counter', 'Number of visits to custom endpoint')
def custom():
custom_counter.inc() # 手动增加计数器
return 'Custom endpoint'

使用 Gauge 记录当前值

from prometheus_client import Gauge

active_users = Gauge('app_active_users', 'Number of active users')

@app.route('/user/login')
def login():
# 用户登录时增加
active_users.inc()
return 'Logged in'

@app.route('/user/logout')
def logout():
# 用户登出时减少
active_users.dec()
return 'Logged out'

按路由分组指标

prometheus-flask-exporter 默认会为每个路由生成带 path 标签的指标。您可以通过 group_by 参数控制分组逻辑:

metrics = PrometheusMetrics(app, group_by='url_rule')

排除特定路由

有些路由(如健康检查、监控端点本身)可能不需要记录指标,可以通过 excluded_paths 参数排除:

metrics = PrometheusMetrics(app, excluded_paths=['/health', '/metrics'])

与工厂函数模式结合

如果您的 Flask 应用使用工厂函数模式,可以按以下方式初始化:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

metrics = PrometheusMetrics()

def create_app():
app = Flask(__name__)
metrics.init_app(app)
return app

保护 /metrics 端点

在生产环境中,您可能希望限制对 /metrics 端点的访问。可以通过 Flask 的基本认证或 IP 白名单来实现:

from flask_httpauth import HTTPBasicAuth
from werkzeug.security import generate_password_hash, check_password_hash

auth = HTTPBasicAuth()
users = {
"prometheus": generate_password_hash("your_password")
}

@auth.verify_password
def verify_password(username, password):
if username in users and check_password_hash(users.get(username), password):
return username

@app.route('/metrics')
@auth.login_required
def metrics_endpoint():
return metrics.generate_metrics()

配置 Prometheus 抓取

在 Prometheus 的配置文件 prometheus.yml 中添加如下抓取配置:

scrape_configs:
- job_name: 'flask_app'
static_configs:
- targets: ['localhost:5000']
metrics_path: '/metrics'
# 如果设置了认证,可以添加 basic_auth
# basic_auth:
# username: 'prometheus'
# password: 'your_password'

使用 Grafana 可视化

将 Prometheus 作为数据源添加到 Grafana,然后导入相应的 Dashboard(如 ID 3662)即可查看 Flask 应用的实时监控图表。

常见问题

指标重复或丢失

确保 PrometheusMetrics 实例只初始化一次,并在整个应用生命周期中重复使用。

高并发下的性能影响

prometheus-flask-exporter 的设计对性能影响极小,但在极端高并发场景下,可以考虑将指标收集设置为异步或降低抓取频率。

自定义标签过多

避免为高基数(high-cardinality)的维度添加标签,例如用户ID、会话ID等,否则可能导致 Prometheus 存储压力过大。

参考资料