Prometheus로 메트릭을 수집했다면, 이제 그 데이터를 눈에 보이는 정보로 만들 차례입니다.
Grafana는 단순한 그래프 툴이 아니라, 시스템의 상태를 한눈에 파악하게 해주는 관측 플랫폼입니다.
Grafana는 다양한 데이터 소스로부터 메트릭, 로그, 트레이스를 수집하여 대시보드로 시각화하는 오픈소스 플랫폼입니다.
현재 여러분의 환경처럼 Prometheus + Grafana 조합은 백엔드 모니터링에서 가장 널리 사용되는 표준 스택입니다.
데이터 흐름
[ 애플리케이션 ]
↓ 메트릭 노출 (/actuator/prometheus)
[ Prometheus ] ← 주기적으로 스크래핑(Scraping)
↓ 데이터 소스로 연결
[ Grafana ] → 대시보드로 시각화
↓
[ 브라우저에서 확인 ]
본격적으로 활용하기 전에 반드시 알아야 할 개념들입니다.
Grafana가 데이터를 가져오는 연결 대상입니다.
현재 여러분이 연결한 Prometheus가 바로 데이터 소스입니다.
Grafana는 Prometheus 외에도 다양한 데이터 소스를 지원합니다.
| 데이터 소스 | 용도 |
|---|---|
| Prometheus | 메트릭 (현재 연결 중) |
| Loki | 로그 |
| Tempo | 분산 트레이싱 |
| MySQL / PostgreSQL | DB 데이터 |
| Elasticsearch | 로그 / 검색 |
💡 Prometheus(메트릭) + Loki(로그) + Tempo(트레이싱) 조합을 PLG 스택 또는 Grafana LGTM 스택이라고 부르며, 완전한 관측 가능성(Observability)을 구현할 수 있습니다.
여러 개의 패널을 모아 하나의 화면으로 구성한 모니터링 뷰입니다.
대시보드 구조
┌─────────────────────────────────────────┐
│ My Service Dashboard │
├──────────────┬──────────────┬────────────┤
│ CPU 사용률 │ 메모리 사용률 │ 요청 수 │
│ [그래프] │ [게이지] │ [숫자] │
├──────────────┴──────────────┴────────────┤
│ HTTP 응답 시간 (Time Series) │
│ [────────────────────────────────────] │
├──────────────────────────────────────────┤
│ 에러율 (%) │
│ [────────────────────────────────────] │
└──────────────────────────────────────────┘
대시보드를 구성하는 개별 시각화 단위입니다.
각 패널은 하나의 쿼리(PromQL)와 하나의 시각화 타입으로 구성됩니다.
| 패널 타입 | 언제 사용하나 |
|---|---|
| Time Series | 시간에 따른 변화 추이 (CPU, 메모리, 응답 시간) |
| Gauge | 현재 값의 비율/상태 (사용률 %) |
| Stat | 단일 숫자 강조 표시 (총 요청 수, 에러 수) |
| Bar Chart | 항목별 비교 |
| Table | 상세 데이터 표 형태로 표시 |
| Logs | 로그 출력 (Loki 연동 시) |
| Heatmap | 분포도 (응답 시간 히트맵) |
Grafana에서 Prometheus 데이터를 조회할 때 사용하는 쿼리 언어입니다.
패널을 만들 때 반드시 PromQL을 작성해야 합니다.
# JVM 힙 메모리 사용률 (Spring Boot)
jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"} * 100
# 초당 HTTP 요청 수
rate(http_server_requests_seconds_count[1m])
# HTTP 에러율 (5xx)
rate(http_server_requests_seconds_count{status=~"5.."}[1m])
/ rate(http_server_requests_seconds_count[1m]) * 100
# 평균 응답 시간
rate(http_server_requests_seconds_sum[1m])
/ rate(http_server_requests_seconds_count[1m])
# CPU 사용률
rate(process_cpu_seconds_total[1m]) * 100
실제 프로젝트에서 가장 먼저 만들어야 할 패널 목록입니다.
| 패널명 | 타입 | PromQL 핵심 키워드 |
|---|---|---|
| CPU 사용률 | Time Series | process_cpu_seconds_total |
| JVM 힙 메모리 사용량 | Gauge | jvm_memory_used_bytes |
| 스레드 수 | Stat | jvm_threads_live_threads |
| GC 횟수/시간 | Time Series | jvm_gc_pause_seconds |
| 패널명 | 타입 | PromQL 핵심 키워드 |
|---|---|---|
| 초당 요청 수 (RPS) | Time Series | http_server_requests_seconds_count |
| 평균 응답 시간 | Time Series | http_server_requests_seconds_sum/count |
| HTTP 상태 코드 분포 | Bar Chart | http_server_requests_seconds_count |
| 에러율 (5xx %) | Stat | status=~"5.." 필터링 |
| 패널명 | 타입 | PromQL 핵심 키워드 |
|---|---|---|
| 활성 커넥션 수 | Gauge | hikaricp_connections_active |
| 대기 중인 커넥션 수 | Time Series | hikaricp_connections_pending |
| 커넥션 획득 시간 | Time Series | hikaricp_connections_acquire_seconds |
Grafana는 단순 시각화를 넘어, 이상 징후를 감지하면 자동으로 알림을 보낼 수 있습니다.
다음 프로젝트에서 반드시 설정해야 할 기능입니다.
Alert Rule (임계값 조건 정의)
↓ 조건 충족 시
Contact Point (알림 수신 채널)
↓
Slack / Email / PagerDuty / Discord 등으로 알림 발송
# Grafana Alert Rule 설정 (UI에서 설정)
Alert 이름 : [WARN] HTTP 에러율 5% 초과
쿼리 : rate(http_server_requests_seconds_count{status=~"5.."}[5m])
/ rate(http_server_requests_seconds_count[5m]) * 100
조건 : IS ABOVE 5 ← 5% 초과 시 발동
평가 주기 : every 1m
알림 채널 : Slack #alert-channel
| 알림명 | 조건 | 심각도 |
|---|---|---|
| 에러율 급증 | HTTP 5xx 에러율 > 5% | 🔴 Critical |
| 응답 시간 저하 | 평균 응답 시간 > 2초 | 🟠 Warning |
| 메모리 부족 | JVM 힙 사용률 > 85% | 🟠 Warning |
| DB 커넥션 고갈 | 활성 커넥션 수 > 최대치의 90% | 🔴 Critical |
| 인스턴스 다운 | up == 0 | 🔴 Critical |
처음부터 대시보드를 직접 만들 필요가 없습니다.
Grafana 공식 대시보드 공유 사이트(Grafana Labs)에서 검증된 템플릿을 가져와서 활용할 수 있습니다.
Grafana UI
└── Dashboards → Import
└── Dashboard ID 입력 or JSON 파일 업로드
| 대시보드명 | ID | 용도 |
|---|---|---|
| Spring Boot 2.1 Statistics | 11378 | Spring Boot 전용 종합 대시보드 |
| JVM (Micrometer) | 4701 | JVM 메트릭 상세 모니터링 |
| Node Exporter Full | 1860 | 서버 OS 리소스 모니터링 |
| Kubernetes Cluster | 7249 | k8s 클러스터 모니터링 |
💡
https://grafana.com/grafana/dashboards에서 다양한 템플릿을 검색할 수 있습니다.
여러 서비스나 인스턴스가 있을 때, 드롭다운으로 필터링이 가능한 동적 대시보드를 만들 수 있습니다.
대시보드 상단에 드롭다운 변수 추가
[ 서비스: order-service ▼ ] [ 인스턴스: 10.0.0.1:8080 ▼ ]
→ 선택한 서비스/인스턴스의 메트릭만 표시
Variables 설정 (Dashboard Settings → Variables)
변수명 : service
타입 : Query
쿼리 : label_values(up, job) ← Prometheus에서 job 목록 가져오기
패널 쿼리에서 $service 로 참조:
rate(http_server_requests_seconds_count{job="$service"}[1m])
현재 상태에서 단계적으로 발전시키는 방향을 정리했습니다.
[ 현재 ] Prometheus + Grafana 연동 완료 ✅
↓ Step 1
기본 대시보드 구성
└── CPU / 메모리 / HTTP 트래픽 / DB 커넥션 패널 추가
↓ Step 2
알림(Alerting) 설정
└── 에러율, 응답 시간, 인스턴스 다운 알림 → Slack 연동
↓ Step 3
동적 대시보드
└── Variables로 서비스/환경(dev, prod)별 필터링
↓ Step 4 (심화)
로그 연동 (Loki)
└── 메트릭과 로그를 같은 대시보드에서 연결해서 확인
↓ Step 5 (심화)
분산 트레이싱 (Tempo)
└── 특정 요청의 전체 처리 흐름을 추적
Grafana 핵심 개념
├── 데이터 소스 → Prometheus, Loki, DB 등 연결 대상
├── 대시보드 → 여러 패널을 모아 구성한 모니터링 화면
├── 패널 → 개별 시각화 단위 (그래프, 게이지, 숫자 등)
└── PromQL → Prometheus 데이터를 조회하는 쿼리 언어
다음 프로젝트 필수 구성
├── 시스템 리소스 대시보드 (CPU, 메모리, GC, 스레드)
├── HTTP 트래픽 대시보드 (RPS, 응답 시간, 에러율)
├── DB 커넥션 대시보드 (HikariCP 모니터링)
└── Alerting 설정 (에러율/응답시간 임계값 알림)
활용 팁
├── Grafana Labs에서 검증된 템플릿 Import해서 빠르게 시작
├── Variables로 서비스/환경별 동적 필터링
└── 장기적으로 Loki(로그) + Tempo(트레이싱) 추가하여
완전한 Observability 구현
| 용어 | 설명 |
|---|---|
| 메트릭 (Metric) | 시스템 상태를 수치로 표현한 데이터 (CPU 사용률, 요청 수 등) |
| 스크래핑 (Scraping) | Prometheus가 주기적으로 서비스에서 메트릭을 수집하는 동작 |
| PromQL | Prometheus 전용 쿼리 언어 |
| RPS (Requests Per Second) | 초당 요청 수 |
| Observability (관측 가능성) | 메트릭 + 로그 + 트레이싱으로 시스템 내부 상태를 파악하는 능력 |
| HikariCP | Spring Boot 기본 DB 커넥션 풀 라이브러리 |
| Loki | Grafana Labs에서 만든 로그 수집/저장 시스템 |
| Tempo | Grafana Labs에서 만든 분산 트레이싱 시스템 |
| Contact Point | Grafana 알림이 발송될 채널 (Slack, Email 등) |