FastAPI 서버개발, FastAPI 성능 분석 및 모니터링 도구

FastAPI는 Python으로 작성된 현대적인 웹 프레임워크로, 높은 성능과 쉬운 사용성을 제공합니다. 비동기 I/O를 지원하며, Python 타입 힌트를 활용해 API 문서화를 자동으로 처리합니다. 이번 글에서는 FastAPI 서버를 개발하는 방법과 성능 분석 및 모니터링을 위한 도구에 대해 자세히 다루겠습니다.

1. FastAPI 서버 개발

1.1 FastAPI 설치

FastAPI를 사용하기 위해서는 먼저 필요한 패키지를 설치해야 합니다. 다음 명령어를 사용하여 FastAPI와 ASGI 서버인 Uvicorn을 설치할 수 있습니다.

pip install fastapi uvicorn

1.2 기본 FastAPI 애플리케이션 생성하기

FastAPI 애플리케이션을 생성하는 것은 매우 간단합니다. 아래는 간단한 “Hello, World!” 애플리케이션의 예입니다.

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"Hello": "World"}

위 코드를 main.py 파일로 저장한 다음, 아래의 명령어로 서버를 실행할 수 있습니다.

uvicorn main:app --reload

서버가 실행되면 http://127.0.0.1:8000/docs 에서 자동으로 생성된 API 문서를 확인할 수 있습니다.

1.3 경로 매개변수와 쿼리 매개변수

FastAPI에서는 경로 매개변수와 쿼리 매개변수를 손쉽게 정의할 수 있습니다. 아래는 두 가지 매개변수를 사용하는 예시입니다.

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

1.4 데이터 모델링

FastAPI는 Pydantic을 사용하여 데이터 모델을 정의합니다. 이를 통해 입력 데이터의 유효성을 검사할 수 있습니다.

from pydantic import BaseModel

class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = None

@app.post("/items/")
async def create_item(item: Item):
    return item

2. FastAPI 성능 분석

FastAPI는 기본적으로 비동기적으로 동작하여 높은 성능을 자랑합니다. 하지만 성능을 더욱 향상시키기 위해 여러 가지 방법을 사용할 수 있습니다.

2.1 성능 테스트 도구

성능을 분석하기 위해 다양한 도구를 사용할 수 있습니다. 가장 흔히 사용되는 도구는 LocustApache Benchmark입니다.

Locust 설치 및 사용 예제

pip install locust

아래는 Locust를 사용하여 FastAPI 애플리케이션의 부하 테스트를 수행하는 예제입니다.

from locust import HttpUser, task

class FastAPIUser(HttpUser):
    @task
    def index(self):
        self.client.get("/")

위 코드를 locustfile.py 파일로 저장한 후, 다음 명령어로 Locust를 실행할 수 있습니다.

locust -f locustfile.py

웹 브라우저에서 http://localhost:8089에 접속하여 원하는 수의 사용자를 설정하고 테스트를 진행할 수 있습니다.

2.2 APM(애플리케이션 성능 모니터링) 도구

애플리케이션의 성능을 모니터링하기 위해 APM 도구를 사용하는 것이 효과적입니다. 대표적인 APM 도구로는 New Relic, Datadog, Sentry가 있습니다.

New Relic 설치 및 설정

New Relic을 사용하기 위해서는 먼저 계정을 생성한 후, 아래의 명령어로 New Relic Python 에이전트를 설치해야 합니다.

pip install newrelic

설치 후, newrelic-admin generate-config YOUR_NEW_RELIC_LICENSE_KEY newrelic.ini 명령어를 통해 설정 파일을 생성합니다. 이후 FastAPI 애플리케이션을 실행할 때 아래와 같이 설정할 수 있습니다.

NEW_RELIC_CONFIG_FILE=newrelic.ini newrelic-admin run-program uvicorn main:app --reload

3. FastAPI 모니터링 도구

서버의 상태를 모니터링하기 위해 다양한 도구를 사용할 수 있습니다. 여러 유형의 로그 및 메트릭을 수집하는 것이 중요합니다.

3.1 Prometheus와 Grafana

Prometheus는 시계열 데이터베이스로, 데이터를 수집하고 쿼리할 수 있는 역량을 제공합니다. Grafana는 그 데이터를 시각화하는 도구입니다.

FastAPI와 Prometheus 연동

먼저, prometheus_fastapi_instrumentator 패키지를 설치합니다.

pip install prometheus-fastapi-instrumentator

다음으로, FastAPI 애플리케이션에 Prometheus 미들웨어를 추가하는 예제입니다.

from prometheus_fastapi_instrumentator import Instrumentator

instrumentator = Instrumentator()

@app.on_event("startup")
def startup():
    instrumentator.instrument(app).expose(app)

이렇게 설정한 후, Prometheus는 FastAPI 애플리케이션의 상태를 자동으로 수집합니다.

3.2 ELK 스택(Elasticsearch, Logstash, Kibana)

ELK 스택은 저장된 로그 데이터의 검색 및 분석을 가능하게 합니다. FastAPI 애플리케이션의 로그 데이터를 ELK 스택과 연결하는 방법은 다음과 같습니다.

FastAPI 로깅 설정

파이썬의 logging 모듈을 사용하여 FastAPI의 로그를 설정할 수 있습니다.

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

@app.get("/")
async def read_root():
    logger.info("Root endpoint accessed")
    return {"Hello": "World"}

이렇게 설정한 로그를 Logstash를 통해 Elasticsearch로 전송하고, Kibana를 통해 분석할 수 있습니다.

결론

FastAPI는 빠르고 효율적인 API 서버 개발을 지원하며, 성능 분석 및 모니터링 도구와의 연동을 통해 애플리케이션의 상태를 실시간으로 확인할 수 있습니다. 이 글에서는 FastAPI 서버 개발을 위한 기본적인 내용과 각종 성능 분석 및 모니터링 도구를 소개했습니다. 이를 통해 더 나은 FastAPI 애플리케이션을 개발해보시기 바랍니다.