22 FastAPI日志与监控

在现代应用开发中,日志记录和监控是确保系统健康和可维护性的重要组成部分。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 数据源

  1. 打开 Grafana Web 界面(默认地址为 http://localhost:3000)。
  2. 登录 Grafana,默认的用户名和密码都是 admin
  3. 配置 Prometheus 作为数据源:
    • 在左侧菜单中,点击 Configuration > Data Sources
    • 选择 Prometheus 并设置 URL 为 http://localhost:9090(Prometheus 的默认地址)。
    • 点击 Save & Test 来验证连接。

3.3 创建 Grafana 仪表板

  1. 在左侧菜单中点击 Create > Dashboard
  2. 创建一个新面板,并选择 Prometheus 作为数据源。
  3. 通过查询语言(PromQL)获取指标数据并设置图表。

例如,要查看请求数的总量,可以使用以下 PromQL 查询:

sum(http_requests_total) by (status_code)

通过这样的查询,你可以在 Grafana 中实时可视化 FastAPI 应用的性能数据,如请求数、响应时间、错误率等。

在本文中,我们学习了如何:

  1. 配置 FastAPI 的日志记录,包括日志格式、级别、输出位置等。
  2. 使用 Prometheus 来收集 FastAPI 应用的性能指标,并将数据暴露到 /metrics 路径。
  3. 使用 Grafana 来可视化 Prometheus 收集的监控数据,实时监控 FastAPI 应用的性能。

通过这些日志记录和监控工具的集成,你可以更好地了解应用的健康状况,及时发现并解决问题,确保生产环境中的高可用性和高性能。
更多请关注“学GIS的小宝同学”
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值