[python] FastAPI에서 모니터링 및 성능 최적화하기

FastAPI는 강력한 성능과 모니터링을 위한 다양한 기능을 제공하는 파이썬 웹 프레임워크입니다. 이 글에서는 FastAPI를 사용하여 모니터링 및 성능 최적화를 어떻게 수행할 수 있는지 알아보겠습니다.

1. 로깅 (Logging)

FastAPI는 내장된 로깅 기능을 제공하여 응용 프로그램의 동작을 추적하고, 오류를 디버깅하고, 성능을 분석할 수 있도록 합니다. Logging 라이브러리를 사용하여 로그를 생성하고 관리할 수 있습니다.

예를 들어, 아래와 같이 FastAPI 애플리케이션에서 로깅을 설정할 수 있습니다.

import logging

from fastapi import FastAPI

app = FastAPI()

# 로깅 설정
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

@app.get("/")
async def root():
    logger.info("API 요청이 들어왔습니다.")
    return {"message": "Hello World"}

이 예제에서는 logging 모듈을 사용하여 로깅 기능을 설정하고, logger.info를 통해 로그를 생성합니다. 로그 수준을 조정하여 필요한 정보만 볼 수 있습니다.

2. 성능 모니터링

성능 모니터링은 FastAPI 애플리케이션의 성능을 분석하고 최적화하기 위해 중요한 단계입니다. FastAPI는 다음과 같은 기능을 제공하여 성능 모니터링을 수행할 수 있습니다.

2.1. API 이벤트 후크 (API Event Hooks)

FastAPI에서는 API 요청과 응답 전후에 발생하는 이벤트를 처리할 수 있는 후크(Hooks)를 제공합니다. 이를 사용하여 처리 시간, 응답 코드, 요청 정보 등을 기록하고 분석할 수 있습니다.

from fastapi import FastAPI
from fastapi import Request

app = FastAPI()

@app.middleware("http")
async def log_request(request: Request, call_next):
    logger.info(f"요청 시작: {request.method} {request.url}")
    response = await call_next(request)
    logger.info(f"요청 완료: {request.method} {request.url}")
    return response

이 예제에서는 @app.middleware("http") 데코레이터를 사용하여 모든 HTTP 요청에 대한 후크를 등록하고 있습니다. 후크는 요청 시작 및 요청 완료 시에 실행되며, 로그를 생성하고 응답 시간을 측정할 수 있습니다.

2.2. APM 도구 (Application Performance Monitoring)

FastAPI와 호환되는 다양한 APM 도구를 사용하여 애플리케이션 성능을 모니터링할 수 있습니다. APM 도구는 애플리케이션의 CPU 사용량, 메모리 사용량, 응답 시간 등을 추적하고 분석합니다.

예를 들어, Elastic APM을 사용하여 FastAPI 애플리케이션을 모니터링한다면 다음과 같이 설정할 수 있습니다.

from fastapi import FastAPI
from elasticapm.contrib.starlette import ElasticAPM

app = FastAPI()
app.add_middleware(ElasticAPM, server_url="http://apm-server:8200", service_name="my-fastapi-app")

위 예제에서는 elasticapm.contrib.starlette 모듈을 사용하여 Elastic APM을 FastAPI에 통합하고 있습니다. APM 서버의 URL과 서비스 이름을 설정할 수 있습니다.

3. 성능 최적화

FastAPI에서 성능을 최적화하기 위해 몇 가지 기술과 방법을 사용할 수 있습니다.

3.1. 비동기 프로그래밍 사용 (Using Asynchronous Programming)

FastAPI는 비동기 프로그래밍을 지원합니다. 비동기 코드를 사용하면 동시성을 높여 응답 시간을 단축시킬 수 있습니다.

예를 들어, 다음과 같이 asyncawait을 사용하여 비동기 함수를 정의할 수 있습니다.

from fastapi import FastAPI
import asyncio

app = FastAPI()

async def my_async_function():
    await asyncio.sleep(1)
    return "Hello World"

@app.get("/")
async def root():
    result = await my_async_function()
    return {"message": result}

이 예제에서는 asyncio.sleep 함수를 사용하여 1초 동안 실행을 지연시키고 있습니다. 이렇게 하면 다른 작업을 동시에 수행할 수 있으며, 응답 시간을 단축할 수 있습니다.

3.2. 쿼리 최적화 (Query Optimization)

FastAPI에서 데이터베이스 쿼리를 최적화하여 성능을 개선할 수 있습니다. 쿼리 결과를 캐시하거나, 인덱스를 추가하거나, 쿼리 튜닝을 통해 성능을 향상시킬 수 있습니다.

from fastapi import FastAPI
from fastapi_cache import FastAPICache
from fastapi_cache.backends.redis import CACHE_KEY
from pydantic import BaseModel

app = FastAPI()
FastAPICache.init(app)

class Item(BaseModel):
    id: str
    name: str

items_cache = {}

@app.get("/items/{item_id}")
@FastAPICache(key=CACHE_KEY)
async def get_item(item_id: str):
    if item_id not in items_cache:
        item = await fetch_item_from_database(item_id)
        items_cache[item_id] = item
    return items_cache[item_id]

이 예제에서는 fastapi_cache 패키지를 사용하여 쿼리 결과를 캐싱하고 있습니다. 이를 통해 동일한 요청에 대한 쿼리를 다시 실행하지 않고, 캐시에서 결과를 가지고 옴으로써 성능을 향상시킬 수 있습니다.

결론

FastAPI는 모니터링 및 성능 최적화를 위한 다양한 기능을 제공하여 개발자가 애플리케이션의 동작을 이해하고 성능을 향상시킬 수 있습니다. 로깅, 성능 모니터링, 비동기 프로그래밍, 쿼리 최적화 등의 기술을 활용하여 FastAPI 애플리케이션의 성능을 향상시켜보세요.

참고 문서: