在现代应用开发中,日志记录和监控是确保系统健康和可维护性的重要组成部分。FastAPI 提供了内置的日志功能,而 Prometheus 和 Grafana 则是常见的开源监控工具组合,广泛用于应用性能监控和可视化。
本文将介绍如何配置 FastAPI 的日志记录,并结合 Prometheus 和 Grafana 进行应用监控和数据可视化。
1. 配置 FastAPI 的日志记录
1.1 使用 Python 内置的 logging
模块
FastAPI 默认使用 Python 的 logging
模块进行日志记录。你可以自定义日志记录的格式、级别、输出位置等,以便更好地满足生产环境中的需求。
1.1.1 基本日志配置
首先,创建一个基础的日志配置。你可以在应用启动时配置日志,示例如下:
import logging
from fastapi import FastAPI
# 配置日志
logging.basicConfig(
level=logging.INFO, # 设置日志级别为 INFO
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", # 设置日志格式
)
app = FastAPI()
@app.get("/")
async def root():
app.logger = logging.getLogger(__name__)
app.logger.info("Handling request for root endpoint")
return {"message": "Hello World"}
1.1.2 自定义日志处理器
在生产环境中,通常会使用多个日志处理器,分别输出到控制台、文件、远程服务器等。可以自定义多个 Handler
来完成这项任务。
import logging
# 创建日志记录器
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
# 创建控制台输出处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
# 创建文件输出处理器
file_handler = logging.FileHandler("app.log")
file_handler.setLevel(logging.ERROR)
# 设置日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# 将处理器添加到记录器
logger.addHandler(console_handler)
logger.addHandler(file_handler)
1.1.3 记录不同级别的日志
日志级别(从低到高):DEBUG
< INFO
< WARNING
< ERROR
< CRITICAL
。根据业务需求,可以调整日志级别,记录不同类型的信息。
logger.debug("This is a debug message")
logger.info("This is an info message")
logger.warning("This is a warning message")
logger.error("This is an error message")
logger.critical("This is a critical message")
1.2 集成日志中间件
为了更加自动化地记录每个请求的日志,FastAPI 提供了中间件的机制,你可以通过自定义中间件来记录每个请求的详细信息,如请求路径、方法、状态码等。
from starlette.middleware.base import BaseHTTPMiddleware
class LogMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
logger.info(f"Request: {request.method} {request.url}")
response = await call_next(request)
logger.info(f"Response: {response.status_code}")
return response
app.add_middleware(LogMiddleware)
1.3 记录请求和响应日志
结合日志中间件,记录请求和响应的相关信息,有助于诊断和排查问题。
@app.middleware("http")
async def log_request(request: Request, call_next):
logger.info(f"Request {request.method} {request.url}")
response = await call_next(request)
logger.info(f"Response {response.status_code}")
return response
通过这些方式,你可以方便地记录应用的运行情况,为后续的调试和监控提供数据支持。
2. 集成 Prometheus 进行监控
Prometheus 是一个开源的系统监控工具,它通过拉取模式收集度量指标数据,并支持高效的查询语言。为了集成 Prometheus,我们可以使用 prometheus_fastapi_instrumentator 这个库,它能够自动监控 FastAPI 应用的关键指标。
2.1 安装依赖
首先,安装 prometheus_fastapi_instrumentator
库:
pip install prometheus_fastapi_instrumentator
2.2 集成 Prometheus 到 FastAPI 应用
然后,集成 Prometheus 到 FastAPI 中。以下是如何配置 Prometheus 来收集 FastAPI 应用的性能指标:
from fastapi import FastAPI
from prometheus_fastapi_instrumentator import Instrumentator
app = FastAPI()
# 初始化 Prometheus 监控
instrumentator = Instrumentator()
# 将 Prometheus 中间件添加到 FastAPI 应用
instrumentator.instrument(app).expose(app, "/metrics")
@app.get("/")
async def read_root():
return {"message": "Hello World"}
代码解析:
Instrumentator()
创建一个 Prometheus 监控对象。instrumentator.instrument(app)
将 Prometheus 中间件集成到 FastAPI 应用中。instrumentator.expose(app, "/metrics")
使 Prometheus 能够通过/metrics
路径获取监控数据。
Prometheus 将会自动收集 FastAPI 的 HTTP 请求数据,如请求数、响应时间、状态码等。
2.3 Prometheus 配置
Prometheus 的核心是拉取(pull)模式,它会定期访问你的应用的 /metrics
路径,获取性能数据并存储。你需要在 Prometheus 配置文件 prometheus.yml
中添加 FastAPI 应用作为一个 scrape target。
scrape_configs:
- job_name: "fastapi"
static_configs:
- targets: ["your-fastapi-app-url:8000"]
3. 使用 Grafana 可视化监控数据
Grafana 是一个开源的可视化监控平台,它可以连接到 Prometheus 来显示性能指标数据。你可以使用 Grafana 创建仪表板,实时显示 FastAPI 应用的性能数据。
3.1 安装 Grafana
你可以使用以下命令安装 Grafana(在 Ubuntu 上为例):
# 添加 Grafana 官方仓库
sudo apt-get install -y software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
sudo apt-get update
# 安装 Grafana
sudo apt-get install grafana
# 启动 Grafana 服务
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
3.2 配置 Grafana 数据源
- 打开 Grafana Web 界面(默认地址为
http://localhost:3000
)。 - 登录 Grafana,默认的用户名和密码都是
admin
。 - 配置 Prometheus 作为数据源:
- 在左侧菜单中,点击 Configuration > Data Sources。
- 选择 Prometheus 并设置 URL 为
http://localhost:9090
(Prometheus 的默认地址)。 - 点击 Save & Test 来验证连接。
3.3 创建 Grafana 仪表板
- 在左侧菜单中点击 Create > Dashboard。
- 创建一个新面板,并选择 Prometheus 作为数据源。
- 通过查询语言(PromQL)获取指标数据并设置图表。
例如,要查看请求数的总量,可以使用以下 PromQL 查询:
sum(http_requests_total) by (status_code)
通过这样的查询,你可以在 Grafana 中实时可视化 FastAPI 应用的性能数据,如请求数、响应时间、错误率等。
在本文中,我们学习了如何:
- 配置 FastAPI 的日志记录,包括日志格式、级别、输出位置等。
- 使用 Prometheus 来收集 FastAPI 应用的性能指标,并将数据暴露到
/metrics
路径。 - 使用 Grafana 来可视化 Prometheus 收集的监控数据,实时监控 FastAPI 应用的性能。
通过这些日志记录和监控工具的集成,你可以更好地了解应用的健康状况,及时发现并解决问题,确保生产环境中的高可用性和高性能。
更多请关注“学GIS的小宝同学”