Prometheus와 Grafana를 활용한 서버 메트릭 모니터링 구축하기: 안정적인 서비스를 위한 시각화 전략
1. 서론: 왜 단순 로그만으로는 부족한가?
시스템을 운영하다 보면 에러 로그만으로는 원인을 파악하기 힘든 상황에 직면합니다. “갑자기 왜 느려졌지?”, “메모리가 부족한 건 아닐까?”, “현재 동시 접속자 수는 얼마인가?“와 같은 질문에 답하기 위해 필요한 것이 바로 메트릭(Metric) 모니터링입니다.
로그가 **사건(Event)**에 대한 기록이라면, 메트릭은 **상태(State)**에 대한 수치적 기록입니다. 이번 포스트에서는 수치 데이터를 수집하는 Prometheus와 이를 대시보드로 시각화하는 Grafana의 조합을 통해 서비스의 생애 주기를 추적하는 방법을 상세히 알아보겠습니다.
2. 모니터링 스택의 작동 원리
전형적인 모니터링 스택은 Pull 방식을 기반으로 합니다.
- Target Application (Spring Boot): 애플리케이션의 현재 상태(JVM, CPU, Memory 등)를 HTTP 엔드포인트(
.actuator/prometheus)로 노출합니다. - Prometheus: 정해진 주기(예: 15초)마다 타겟 애플리케이션에 접속하여 메트릭 데이터를 긁어와(Scrape) 자신의 DB(TSDB)에 저장합니다.
- Grafana: Prometheus를 데이터 소스(Data Source)로 설정하고, 쿼리 언어인 PromQL을 사용하여 데이터를 조회하고 아름다운 그래프로 그려줍니다.
3. Spring Boot와 Micrometer 설정
Spring Boot는 Micrometer 라이브러리를 통해 Prometheus 포맷의 메트릭을 기본 제공합니다.
3.1. 의존성 추가 (build.gradle)
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
}
3.2. 엔드포인트 개방 (application.yml)
보안상 기본적으로 닫혀 있는 /actuator/prometheus 엔드포인트를 열어줍니다. 실무에서는 이 경로에 대한 접근을 특정 IP(Prometheus 서버)로 제한하는 보안 설정이 동반되어야 합니다.
management:
endpoints:
web:
exposure:
include: prometheus, health, info
endpoint:
prometheus:
enabled: true
4. Prometheus 설정 및 실행
Prometheus 설정 파일(prometheus.yml)은 메트릭을 어디서 가져올지를 정의합니다.
global:
scrape_interval: 15s # 데이터를 수집할 주기
scrape_configs:
- job_name: 'spring-boot-app'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['172.17.0.1:8080'] # 애플리케이션 서버 주소
5. Grafana를 활용한 대시보드 구축
Grafana의 강점은 커뮤니티 대시보드입니다. 처음부터 모든 그래프를 그릴 필요 없이, 이미 잘 만들어진 템플릿을 가져와(Import) 수정하는 것이 효율적입니다.
5.1. 추천 대시보드 (ID: 11378)
Spring Boot 애플리케이션을 위한 표준 대시보드 중 하나인 11378(JVM Micrometer)을 임포트하면 다음과 같은 정보를 즉시 모니터링할 수 있습니다.
- JVM Memory Usage: Heap 및 Non-Heap 메모리 사용량 추이.
- Garbage Collection: GC 발생 횟수와 소요 시간(Stop-the-world 감지).
- Thread Count: 활성 스레드 수 및 최대 스레드 도달 여부.
- HTTP Request Statistics: API별 응답 속도 및 에러율(4xx, 5xx).
6. 실무에서의 알림 설정 (Alerting)
시각화만으로는 충분하지 않습니다. 서버가 죽거나 메모리가 임계치를 넘었을 때 즉시 통보를 받아야 합니다.
- Alertmanager: Prometheus에서 발생한 알림을 필터링하고 슬랙(Slack), 메일, 카카오톡 등으로 전송합니다.
- Grafana Alerts: Grafana 대시보드 상에서 특정 수치가 넘었을 때 알림을 보내는 방식도 최근 많이 사용됩니다.
7. 결론: “측정되지 않는 것은 개선될 수 없다”
모니터링 시스템은 단순히 장애를 찾는 도구가 아닙니다. 리소스 사용량을 분석하여 서버 비용을 최적화하고, 성능 병목 지점을 찾아 사용자 경험을 개선하는 핵심적인 인프라입니다. Prometheus와 Grafana를 통해 여러분의 서비스를 데이터 기반으로 투명하게 운영해 보시기 바랍니다.