17.3 指标收集:Prometheus + Grafana
FastAPI监控教程:使用Prometheus和Grafana实现指标收集和可视化
通过本教程,学习如何在FastAPI应用中集成Prometheus和Grafana,实现高效指标收集和可视化监控。从安装到配置,适合初学者快速掌握监控实践。
推荐工具
FastAPI指标收集与监控:使用Prometheus和Grafana
引言
在现代Web开发中,应用的性能和可靠性至关重要。指标收集和监控可以帮助我们实时了解应用状态,快速定位问题。本教程将详细指导您如何在FastAPI应用中集成Prometheus和Grafana,实现强大的指标收集和可视化监控。适合初学者,从基础概念到实际操作,一步步带您上手。
第一部分:指标收集和监控简介
什么是指标收集?
- 指标:指应用的性能数据,如请求数量、响应时间、内存使用等。
- 收集:通过工具自动抓取这些数据,用于分析和监控。
为什么在FastAPI中使用Prometheus和Grafana?
- Prometheus:一个开源的监控和警报工具,擅长收集时间序列数据。
- Grafana:一个可视化平台,可以将Prometheus的数据以图表形式展示。
- 结合FastAPI,可以构建一个完整的监控解决方案,提升应用的可观察性。
第二部分:安装和设置
前置条件
- Python 3.7或更高版本。
- 基础FastAPI知识(建议先学习FastAPI官方文档)。
安装所需库
打开终端,使用pip安装必要的库:
pip install fastapi uvicorn prometheus-client
- prometheus-client:Python的Prometheus客户端库,用于在FastAPI中暴露指标。
安装Prometheus和Grafana
由于Prometheus和Grafana通常是独立服务,您可以选择以下方式之一:
- 使用Docker(推荐,简单快捷):
- 安装Docker和Docker Compose。
- 创建
docker-compose.yml文件配置Prometheus和Grafana。
- 手动安装:
- 从官方网站下载Prometheus和Grafana,并按照指南安装。
为简化教程,我们将使用Docker方式。创建一个docker-compose.yml文件:
version: '3'
services:
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
command:
- '--config.file=/etc/prometheus/prometheus.yml'
grafana:
image: grafana/grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin # 设置Grafana管理员密码
volumes:
- ./grafana:/var/lib/grafana
创建一个Prometheus配置文件prometheus.yml:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'fastapi'
static_configs:
- targets: ['localhost:8000'] # FastAPI应用运行的地址
启动服务
在项目目录下运行:
docker-compose up -d
这将在后台启动Prometheus(端口9090)和Grafana(端口3000)。
第三部分:集成Prometheus到FastAPI
在FastAPI应用中添加Prometheus客户端
创建一个新的FastAPI应用文件,例如main.py:
from fastapi import FastAPI
from prometheus_client import make_wsgi_app, Counter, Histogram
from prometheus_client.core import REGISTRY
import time
app = FastAPI()
# 定义一些指标
REQUEST_COUNT = Counter('fastapi_requests_total', 'Total number of requests')
REQUEST_LATENCY = Histogram('fastapi_request_latency_seconds', 'Request latency in seconds')
# 添加Prometheus WSGI中间件以暴露指标端点
app.mount("/metrics", make_wsgi_app())
@app.get("/")
def read_root():
REQUEST_COUNT.inc() # 递增请求计数器
with REQUEST_LATENCY.time(): # 测量请求延迟
# 模拟一些处理
time.sleep(0.1)
return {"message": "Hello, World!"}
@app.get("/health")
def health_check():
return {"status": "healthy"}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
代码解释
- 导入库:
prometheus_client用于创建和暴露指标。 - 定义指标:
Counter用于计数请求,Histogram用于测量延迟。 - 暴露端点:使用
app.mount("/metrics", make_wsgi_app())将指标暴露在/metrics路径,供Prometheus抓取。
运行FastAPI应用
在终端运行:
python main.py
访问 http://localhost:8000/metrics 应该能看到Prometheus格式的指标数据。
第四部分:配置Grafana可视化
访问Grafana
- 打开浏览器,访问
http://localhost:3000。 - 使用默认用户名
admin和密码admin登录(基于docker-compose.yml设置)。
添加Prometheus数据源
- 在Grafana左侧菜单,点击 Configuration > Data Sources。
- 点击 Add data source,选择 Prometheus。
- 设置URL为
http://prometheus:9090(或http://localhost:9090)。 - 点击 Save & Test,确认连接成功。
创建仪表板
- 在左侧菜单,点击 Dashboards > New Dashboard。
- 点击 Add new panel。
- 在查询编辑器输入PromQL查询,例如:
rate(fastapi_requests_total[5m]):显示5分钟内请求率。fastapi_request_latency_seconds_sum:显示总延迟。
- 自定义图表类型和样式,然后保存。
示例仪表板
您可以创建多个面板,监控不同指标,如请求数、延迟、错误率等。
第五部分:完整示例和测试
测试监控流程
- 确保所有服务运行:
- FastAPI应用(
python main.py)。 - Prometheus和Grafana(通过Docker Compose)。
- FastAPI应用(
- 访问FastAPI端点(如
http://localhost:8000/)生成一些请求。 - 在Prometheus UI(
http://localhost:9090)查看抓取的数据。 - 在Grafana仪表板查看可视化图表。
扩展指标
您可以根据需要添加更多指标,例如:
- 错误计数:使用
Counter跟踪HTTP错误。 - 内存使用:集成系统指标库如
psutil。
第六部分:总结和最佳实践
总结
本教程演示了如何在FastAPI应用中集成Prometheus和Grafana,实现指标收集和监控。关键步骤包括:安装工具、暴露指标端点、配置可视化。
最佳实践
- 安全性:在生产中,保护
/metrics端点,避免公开敏感数据。 - 指标设计:定义清晰的指标名称和标签,便于查询和分析。
- 持续监控:设置警报,基于指标触发通知。
- 优化性能:监控指标本身可能引入开销,确保不影响应用性能。
进一步学习
- 阅读Prometheus和Grafana官方文档。
- 探索高级功能,如自定义告警规则和仪表板共享。
通过本教程,您应该能够为FastAPI应用建立一个基本的监控系统。随着项目增长,可以根据需求扩展和优化。
开发工具推荐