[파이썬] aiohttp로 만든 애플리케이션 모니터링

애플리케이션 모니터링은 소프트웨어 시스템의 성능, 가용성, 이슈를 추적하고 관찰하는 프로세스입니다. 이는 애플리케이션의 안정성과 운영을 보장하고 문제를 신속하게 해결하는 데 도움이 됩니다. 이번 블로그 글에서는 aiohttp를 사용하여 애플리케이션을 모니터링하는 방법에 대해 알아보겠습니다.

aiohttp란?

aiohttp는 Python에서 비동기 웹 서버 및 클라이언트를 구현하기 위한 라이브러리입니다. asyncio 라이브러리를 기반으로 하며, 높은 수준의 성능과 확장성을 제공합니다. aiohttp는 HTTP 요청 및 응답 처리를 위한 유연하고 강력한 도구를 제공하며, 애플리케이션의 모니터링에도 사용할 수 있습니다.

애플리케이션 모니터링을 위한 aiohttp 사용하기

aiohttp를 사용하여 애플리케이션 모니터링을 구현하는 것은 간단하고 효과적입니다. 아래는 aiohttp를 이용하여 애플리케이션의 HTTP 요청 및 응답을 로깅하는 예시 코드입니다.

import logging
from aiohttp import web

async def handle(request):
    app.logger.info(f"Received request: {request.url}")
    return web.Response(text="Hello, World!")

app = web.Application()
app.router.add_get("/", handle)

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)
    web.run_app(app)

이 예시 코드에서는 aiohttp의 web 모듈을 사용하여 웹 애플리케이션을 정의하고, / 경로에 대한 GET 요청을 처리하는 핸들러를 등록했습니다. 핸들러 내에서는 app.logger를 사용하여 로깅을 수행하고, web.Response를 통해 응답을 반환합니다.

위 코드에서는 logging 모듈을 이용하여 기본적인 로깅 설정을 하였습니다. logging.basicConfig(level=logging.INFO)를 통해 INFO 레벨 이상의 로그 메시지를 출력하도록 설정했습니다.

이제 애플리케이션을 실행하면, 제공하는 API 엔드포인트를 통해 HTTP 요청이 들어올 때마다 로깅이 수행될 것입니다.

추가적인 모니터링 기능 적용하기

aiohttp를 통해 애플리케이션을 모니터링하는 방법은 다양합니다. 몇 가지 추가적인 기능을 예시로 알아보겠습니다.

1. Prometheus로 메트릭 수집하기

Prometheus는 애플리케이션의 성능 및 상태를 모니터링하는데 사용되는 인기 있는 오픈 소스 모니터링 솔루션입니다. aiohttp 애플리케이션에서 Prometheus 클라이언트 라이브러리인 prometheus_client를 이용하여 메트릭을 수집하고 노출하는 예제 코드를 작성해보겠습니다.

from prometheus_client import start_http_server, Counter
from aiohttp import web

app = web.Application()
counter = Counter("http_requests_total", "Total HTTP Requests")

async def handle(request):
    counter.inc()
    return web.Response(text="Hello, World!")

app.router.add_get("/", handle)

if __name__ == "__main__":
    start_http_server(8000)
    web.run_app(app)

위 예시 코드에서는 prometheus_client 모듈의 Counter 클래스를 이용하여 http_requests_total이라는 카운터 메트릭을 정의하고, 핸들러 내에서 카운터를 증가시키도록 했습니다. start_http_server(8000)을 통해 메트릭을 노출할 HTTP 서버를 시작합니다. 이렇게 하면 Prometheus 서버에서 애플리케이션의 메트릭을 수집할 수 있습니다.

2. Sentry로 오류 모니터링하기

Sentry는 애플리케이션에서 발생하는 오류 및 예외를 실시간으로 모니터링하는 서비스입니다. aiohttp 애플리케이션에서 Sentry를 사용하여 오류를 모니터링하는 예제 코드를 작성해보겠습니다.

import sentry_sdk
from aiohttp import web

sentry_sdk.init("<YOUR_SENTRY_DSN>")

app = web.Application()

async def handle(request):
    try:
        # 애플리케이션 로직
        return web.Response(text="Hello, World!")
    except Exception as e:
        sentry_sdk.capture_exception(e)
        raise

app.router.add_get("/", handle)

if __name__ == "__main__":
    web.run_app(app)

위 예시 코드에서는 sentry_sdk 모듈을 이용하여 Sentry를 초기화하고, 핸들러 내에서 예외가 발생하면 sentry_sdk.capture_exception()을 통해 오류를 Sentry로 전송합니다. 이렇게 하면 애플리케이션에서 발생한 오류를 즉시 식별하고 추적할 수 있습니다.

결론

aiohttp를 사용하여 애플리케이션을 모니터링하는 것은 매우 유용합니다. 애플리케이션의 성능을 추적하고, 메트릭을 수집하고, 오류를 모니터링함으로써 애플리케이션의 안정성과 운영을 개선할 수 있습니다. 이 블로그 글에서 소개한 예시 코드를 기반으로, aiohttp로 애플리케이션 모니터링을 구현해보세요.