본문 바로가기

백엔드 엔지니어링 일지

마켓 백엔드 엔진 7 : Prometheus + Grafana 모니터링

k6로 부하테스트를 진행 할 예정입니다.

이를 위해서 

Prometheus로 서버 상태를 수집하고

Grafana를 이를 시각화하여 모니터링합니다.

 

먼저 Docker로 Prometheus를 설치합니다. 

데이터를 수집하려면 백엔드에서 스프링부트 액추에이터에서 /prometheus를 열어야 합니다.

 

변경한 파일

build.gradle

  • spring-boot-starter-actuator 추가
  • micrometer-registry-prometheus 추가

application.yml에서 스프링부트 액추에이터 엔드포인트 개방

  •  health
    • 앱 상태 확인용 (/actuator/health)
    • 서버 살아있는지 체크할 때 사용
  • info
    • 앱 정보 노출용 (/actuator/info)
    • 버전/설명 같은 메타 정보(설정했을 때)
  • prometheus
    • Prometheus 수집용 메트릭 (/actuator/prometheus)
    • Grafana 시각화의 원천 데이터

observability/prometheus.yml 추가

  • backend:8080의 /actuator/prometheus를 5초 간격으로 스크랩

 docker-compose.yml

  • prometheus 서비스 추가
  • 포트 9090:9090 오픈

prometheus와 backend 연결 확인

 

다음으로 Grafana를 설치, Prometheus와 연동합니다.

 

docker-compose.yml

  • grafana 서비스 추가
  • 포트 3005:3000 (프론트와 충돌 피함)
  • Prometheus 실행 순서 의존 설정 (depends_on)
  • 프로비저닝 마운트 + grafana-data 볼륨 추가

observability/grafana/provisioning/datasources/datasource.yml

  • Grafana 시작 시 Prometheus(http://prometheus:9090)를 기본 데이터소스로 자동 등록

Grafana와 Prometheus 연동 확인

 

처음에는 대시보드가 비어있는 상태입니다. 템플릿을 추가해보겠습니다.

 

 

JVM Micrometer 템플릿을 import 하겠습니다.

 

 

url을 복사해서 import하여 대시보드를 불러왔습니다.

 

 

현재 패널:

  • HTTP Rate / Errors / Duration
    • API 트래픽량, 에러율, 지연시간(보통 p95/p99)을 보는 핵심 패널
  • JVM Heap / Non-Heap
    • 메모리 사용 추이, 누수 의심 여부 확인
  • GC (Pause / Allocation / Promotion)
    • GC 때문에 응답시간 튀는지 확인
  • CPU / Load / Threads
    • 서버 리소스 압박 상황 확인
  • Hikari/DB connection 관련
    • DB 커넥션 풀 병목 확인

현재 대시보드에서는 서버의 전체적인 성능을 확인할 수 있습니다.

 

특정 api 성능을 분석하기 위해선 커스텀 패널을 추가해야 합니다.

커스텀 패널은 Prometheus Query(PromQL)을 통해 작성합니다.

1000 *
sum(rate(http_server_requests_seconds_sum{uri="/api/products",method="GET"}[1m]))
/
clamp_min(sum(rate(http_server_requests_seconds_count{uri="/api/products",method="GET"}[1m])), 1e-9)

 

 

먼저 search api 에 대한 평균 latency 그래프 패널을 추가 해봤습니다.

 

이후 search에 대한 최적화 및 부하테스트를 진행하면서

검색과 주문에 대한 p99/p95, ErrorRate, RPS, TPS 등을 확인하기 위한 패널을 추가해야 합니다.

 

만약 docker에서 마이그레이션 문제로 volume을 삭제한다면 grafana의 dashboard 데이터도 삭제됩니다.

따라서 저는 dashboard json파일을 export해서 저장했습니다.