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 定义了四种主要的指标类型:
- Counter(计数器):只增不减的数值,常用于记录请求次数、错误次数等。
- 示例:
http_requests_total
- 示例:
- Gauge(仪表盘):可增可减的数值,常用于记录当前值,如并发连接数、内存使用量等。
- 示例:
memory_usage_bytes
- 示例:
- Histogram(直方图):对观察值(如请求延迟)进行采样,并在可配置的桶中计数。同时提供所有观察值的总和。
- 示例:
http_request_duration_seconds
- 示例:
- Summary(摘要):类似于直方图,但直接在客户端计算分位数(quantiles)。
- 示例:
http_request_duration_quantiles
- 示例:
标签(Labels)
标签是指标的维度,用于区分同一指标的不同维度。例如,可以为 http_requests_total 添加 method、endpoint、status 等标签,以便按这些维度进行筛选和聚合。
/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'