fastapi 프로메테우스 도입

Hoonkii·2024년 6월 28일
0

Intro

fastapi 로 개발된 백엔드 서버의 메트릭을 측정하기 위해 prometheus 관련 설정을 해보았다. 회사에서 운영중인 EKS 클러스터에는 프로메테우스가 설치되어 있고, node exporter가 daemonset으로 설치되어 있어서 노드 그리고 pod 관련 메모리, cpu usage 등은 측정할 수 있었으나, 백엔드 애플리케이션의 RPS, 에러 수, 처리 시간 등을 구체적으로 알기 힘든 상황이었다. (로그로는 어느 정도 파악할 수 있으나 한계가 있다)

데이터독, 뉴렐릭 같은 APM 솔루션을 통해서 측정이 가능하지만, 비용이 비싸기도 하고 아직 서비스 규모가 크지 않으며, 우린 이미 Loki, Prometheus, Grafana 스택을 잘 쓰고 있었기 때문에 굳이? 라는 생각이 들었다.

앞으로 EKS 클러스터에 올라갈 많은 애플리케이션들을 RED, USE 방법론에 따라 일관되게 시스템/서비스 성능을 모니터링할 수 있도록 하는 것을 주요 목표로 잡았기에, 먼저 우리 팀에서 운영하고 있는 fastapi로 된 ai serving 서버의 메트릭을 프로메테우스 exporter를 통해 측정할 수 있도록 설정하였다.

오늘 포스트에서는 fastapi 로 구현된 서버에서 프로메테우스 exporter를 어떻게 도입했는지 과정을 간략히 소개하려고 한다.

fastapi prometheus intrumentator 설정 및 service monitor 배포

  • 의존성 설치
pip install prometheus_fastapi_instrumentator
  • 프로메테우스 Instrumentator를 fastapi app에 추가
from prometheus_fastapi_instrumentator import Instrumentator, metrics

def setup_prometheus(app_: FastAPI):
		# 성능 측정에 제외할 path 추가	
		Instrumentator(excluded_handlers=["/metrics", "/openapi.json", "/docs", "/redoc"]).add(
		    metrics.default(),
		).instrument(app_).expose(app_)

app_ = FastAPI(
    title="Backend service",
    version="0.0.1",
)
setup_prometheus(app_)

로컬에서 서버를 실행시킨 후 /metrics 에 접근해보자.

http_request_duration_seconds_sum{handler="/health",method="GET"} 33.55118447793939
http_requests_total{handler="/health",method="GET",status="2xx"} 12084.0
http_response_size_bytes_count{handler="/health"} 12084.0
http_request_size_bytes_count{handler="/health"} 12084.0

http 요청에 대한 메트릭들을 리턴하는 것을 볼 수 있다.

  • 프로메테우스 multiproc_dir 환경변수 설정

현재 fastapi 서버는 gunicorn, uvicorn 을 통해 실행된다. gunicorn worker 개수는 2개이기 때문에 위 환경변수를 설정하지 않으면 worker process 마다 프로메테우스 메트릭을 따로 저장하여 메트릭이 일관되게 집계되지 않는 문제가 발생한다.

따라서 프로메테우스 메트릭을 공유해서 저장할 폴더를 생성하고 해당 폴더를 환경변수로 추가하는 설정을 도커파일에 추가하였다.

Dockerfile

RUN mkdir multiproc-tmp
ENV PROMETHEUS_MULTIPROC_DIR=multiproc-tmp
  • 프로메테우스 Service monitor 추가

클러스터에 있는 프로메테우스가 해당 애플리케이션의 메트릭을 수집하게 하려면 ServiceMonitor 배포가 필요하다. 프로메테우스는 해당 서비스의 /metrics url에 pull 하여 메트릭을 수집하기 때문이다.

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    app: manager-server
    release: prometheus-stack
  name: manager-server
  namespace: prometheus
spec:
  endpoints:
    - path: /metrics
      port: http
  namespaceSelector:
    matchNames:
      - develop
  selector:
    matchLabels:
      app: manager-server

배포한 앱의 레이블을 매칭하도록 설정하여 배포한다.

kubectl apply -f service-monitor.yaml

대시보드 구성

http_request_duration_seconds_sum, http_requests_total 등의 메트릭을 활용해서 대시보드를 구성할 수 있다.

profile
개발 공부 내용 정리

0개의 댓글