본문 바로가기
프로젝트

Prometheus와 Grafana 이해하기

by jucheol 2025. 11. 6.

서비스 운영을 위한 모니터링 기초: Prometheus와 Grafana 이해하기

서비스 운영 환경에서 장애를 빠르게 발견하고 성능 저하 문제를 사전에 대응하기 위해서는 모니터링 시스템이 필요하다. 특히 트래픽이 증가하고 시스템이 복잡해질수록, 단순히 로그만 확인해서 문제를 찾는 방식으로는 한계가 발생한다. 이때 사용하는 대표적인 오픈소스 도구가 Prometheus와 Grafana다.


Prometheus란?

Prometheus는 애플리케이션과 서버에서 발생하는 상태 데이터를 주기적으로 수집하고 저장하는 시스템이다.
이 데이터는 시계열(Time-series) 형태이며, 특정 시점의 값을 지속적으로 저장한다.

주요 특징

  • 애플리케이션 또는 시스템에서 노출되는 /metrics 엔드포인트 데이터를 주기적으로 수집
  • 수집된 데이터를 자체 저장소에 보관
  • PromQL이라는 쿼리 언어를 통해 저장된 데이터를 조회 가능
  • 알림 시스템(Alertmanager)과 연동 가능

Prometheus를 사용하면 CPU 사용량, 메모리 사용량, 애플리케이션 요청 수, 오류 비율과 같은 운영 지표를 자동으로 수집하고 분석할 수 있다.


Grafana란?

Grafana는 Prometheus가 수집한 데이터를 시각화하는 도구다.
대시보드 형태로 데이터를 보여주기 때문에, 현재 시스템 상태를 쉽게 파악할 수 있다.

주요 기능

  • Prometheus 데이터 조회
  • 그래프, 테이블, 게이지 등 다양한 시각화 방식 제공
  • 대시보드 저장 및 공유 가능
  • 알람 설정 및 대시보드 템플릿 제공

Prometheus가 데이터를 수집/저장한다면, Grafana는 데이터를 보여주는 역할을 한다.


모니터링 시 확인해야 하는 핵심 메트릭

모니터링의 목적은 서비스가 정상적으로 운영되고 있는지 확인하는 것이다.
이를 위해 아래 항목을 중점적으로 확인해야 한다.

1. 애플리케이션 메트릭

항목설명
요청 수 (Request Count) 특정 기간에 서버가 처리한 요청 수
응답 시간 (Latency) P50, P90, P95, P99 요청 처리에 걸린 시간의 분포값. 고 Percentile이 높으면 일부 요청이 매우 느린 상태
오류율 (Error Rate) 전체 요청 중 실패 요청 비율
처리량 (Throughput) 단위 시간당 처리 요청 수

특히 평균 응답 시간만 확인하는 것은 부족하다.
일부 요청이 매우 느린 경우 평균에 묻히기 때문이다.
따라서 P90, P95, P99 같은 Percentile 지표가 필요하다.


2. JVM 메트릭 (Spring Boot 기준)

항목설명
jvm_memory_used_bytes JVM이 사용 중인 메모리
jvm_gc_pause_seconds GC 실행 시간
jvm_threads_live 현재 실행 중인 스레드 수
jvm_classes_loaded JVM에 로드된 클래스 수

JVM 기반 서버에서는 메모리 관리가 중요하다.
GC 시간이 증가하거나 메모리 사용량이 한계에 가까워지면 애플리케이션 성능이 저하된다.


3. 시스템 리소스 메트릭

항목설명
CPU 사용률 서버 처리 성능 부하
메모리 사용률 메모리 부족 여부
Disk I/O 디스크 읽기/쓰기 처리 속도
네트워크 사용량 네트워크 병목 여부

시스템 리소스는 애플리케이션 성능과 직결되므로 지속적인 관찰이 필요하다.


모니터링 시스템 구성 요소

구성 요소역할
Prometheus 메트릭 수집 및 저장
Grafana 메트릭 시각화
Exporter (node exporter 등) 서버/DB 등에서 메트릭 노출
Spring Actuator + Micrometer Spring Boot 애플리케이션 메트릭 제공
Alertmanager 조건 기반 알림 전송

Spring Boot 환경에서는 /actuator/prometheus 엔드포인트를 통해 Prometheus가 데이터를 수집한다.


PromQL 예시

아래는 주로 사용하는 PromQL 쿼리 예시이다.

요청 수 확인

sum(rate(http_server_requests_seconds_count[1m]))

5xx 오류율 확인

sum(rate(http_server_requests_seconds_count{status_code=~"5.."}[5m])) / 
sum(rate(http_server_requests_seconds_count[5m]))

P95 응답 시간

histogram_quantile(0.95, sum(rate(http_server_requests_seconds_bucket[5m])) by (le))
 
 

이러한 쿼리를 활용하면 서비스의 상태와 성능을 빠르게 판단할 수 있다.