coredot.today
Prometheus + Grafana: 오픈소스 모니터링의 표준 조합 완전 정복
블로그로 돌아가기
PrometheusGrafana모니터링메트릭알림CNCF관측성

Prometheus + Grafana: 오픈소스 모니터링의 표준 조합 완전 정복

서버가 죽기 5분 전에 알 수 있다면? 전 세계 개발자가 선택한 오픈소스 모니터링 표준 Prometheus와 Grafana를 데이터 모델부터 PromQL, Alertmanager, Kubernetes 클러스터 모니터링까지 완전 정복한다.

코어닷투데이2026-04-0140

들어가며: "서버가 죽기 5분 전에 알 수 있다면"

새벽 3시, 슬랙 채널에 메시지가 올라온다.

"사이트 접속이 안 됩니다." "결제가 안 돼요."

고객이 먼저 알았다. 팀은 30분 뒤에야 확인했고, 원인 파악에 2시간이 걸렸다. 서버 한 대의 메모리가 가득 차 OOM(Out of Memory)으로 죽은 것이었다. 메모리 사용률이 90%를 넘은 건 서버가 죽기 15분 전 — 그때 알았다면 트래픽을 돌리고 재시작하면 끝이었을 것이다.

$5,600 분당 다운타임 비용 Gartner, 기업 평균
70% 장애를 고객이 먼저 발견 모니터링 미비 시
5분 장애 사전 감지 시간 적절한 알림 설정 시

모니터링의 핵심은 단순하다: 사람보다 기계가 먼저 알아채는 것. 그리고 이 역할을 하는 오픈소스 표준이 바로 Prometheus(메트릭 수집)와 Grafana(시각화)다. 유료 서비스도 아니고, 특정 클라우드에 묶이지도 않는다.

서버를 환자처럼 모니터링하는 병원 — CPU 심박수와 메모리 혈압을 보여주는 모니터


1. 모니터링 지형도: 유료 vs 오픈소스

모니터링 도구는 크게 클라우드 네이티브, SaaS, 오픈소스 세 진영으로 나뉜다.

분류대표 서비스장점단점
클라우드 네이티브CloudWatch, Cloud Monitoring, Azure Monitor해당 클라우드와 깊은 통합벤더 종속, 멀티클라우드 불가
SaaSDatadog, New Relic, Splunk강력한 UI, APM 통합메트릭 수 비례 과금, 비용 폭증
오픈소스Prometheus + Grafana무료, 벤더 독립, CNCF 생태계직접 운영 부담

Datadog은 뛰어난 제품이지만, 스케일이 커지면 비용이 급증한다. 호스트당 월 15 15~23, 커스텀 메트릭 100개당 5—서버수십대에메트릭수천개면월수백만원이기본이다.Prometheus+Grafana가사실상표준이된핵심이유는소프트웨어비용5 — 서버 수십 대에 메트릭 수천 개면 **월 수백만 원**이 기본이다. Prometheus + Grafana가 사실상 표준이 된 핵심 이유는 소프트웨어 비용 **0**, 벤더 독립, 그리고 Kubernetes와의 완벽한 궁합이다.


2. Prometheus: CNCF가 인정한 메트릭의 표준

탄생: SoundCloud의 절박함 (2012)

2012년, 베를린의 음악 스트리밍 회사 SoundCloud는 수백 개의 마이크로서비스를 운영하고 있었다. 기존 도구(StatsD + Graphite)로는 다차원 데이터 모델도, 서비스 디스커버리도, 강력한 쿼리 언어도 없었다.

SoundCloud의 엔지니어 Matt T. ProudJulius Volz — Google 출신이었다. Google 내부 모니터링 시스템 Borgmon의 아이디어를 가져와 Prometheus를 시작했다.

2012
SoundCloud에서 개발 시작
Borgmon에서 영감을 받아 설계. Pull 기반 수집 모델 채택
2016.5
CNCF 두 번째 프로젝트로 합류
Kubernetes 다음으로 CNCF에 합류
2018.8
CNCF Graduated 달성
Kubernetes에 이어 두 번째 졸업. 업계 표준 인증
2020~현재
사실상 업계 표준
OpenMetrics 표준화, 원격 쓰기 프로토콜 확립

Pull 모델: Prometheus의 핵심 설계

Prometheus를 공장을 순회하며 데이터를 수집하는 검사관 로봇으로 표현한 모습

대부분의 모니터링(Datadog, StatsD)은 Push 모델 — 서버가 메트릭을 모니터링 시스템으로 밀어 넣는다. Prometheus는 반대다. Prometheus가 각 타겟에 HTTP GET을 보내 메트릭을 당겨온다(Pull).

Push vs Pull 모델
Push 모델 Datadog, StatsD 서버 → 메트릭 → 모니터링. 서버가 능동적으로 전송
Pull 모델 Prometheus Prometheus → HTTP GET → 타겟. 주기적으로 수집

Pull의 장점: 스크래핑 실패 자체가 "타겟이 죽었다"는 시그널이고, 브라우저에서 http://target:9090/metrics에 접속하면 어떤 메트릭이 노출되는지 바로 확인할 수 있다.

💡
Pull의 예외 — Pushgateway: 수명이 짧은 배치 작업은 Prometheus가 스크래핑하기 전에 끝나버릴 수 있다. 이런 경우 배치 작업이 Pushgateway에 메트릭을 push하고, Prometheus가 Pushgateway를 pull한다.

3. 데이터 모델: 메트릭, 레이블, 시계열

Prometheus의 모든 데이터는 시계열(Time Series) — 타임스탬프가 찍힌 숫자 값의 연속이다. 하나의 시계열은 메트릭 이름 + 레이블 집합으로 식별된다:

Prometheus 시계열 형식
metric_name{label1="value1", label2="value2"} → (timestamp, value)

http_requests_total{method="GET", status="200"} → 142857
http_requests_total{method="POST", status="500"} → 23
node_memory_MemAvailable_bytes{instance="web-01:9100"} → 4294967296

같은 http_requests_total이라도 레이블 조합이 다르면 별개의 시계열이다. 이것이 Prometheus의 다차원 데이터 모델이다.

4가지 메트릭 타입

Prometheus 메트릭 타입
Counter 단조 증가 누적 요청 수, 에러 수. 절대 감소하지 않음
Gauge 현재 값 CPU 사용률, 메모리, 동시 접속자 수. 오르내림
Histogram 분포 측정 응답 시간 분포. 버킷별 카운트로 p50, p99 계산
Summary 사전 계산 분위수 클라이언트에서 직접 분위수 계산. 집계 불가가 단점

Counter는 "지금까지 총 몇 번?" — 요청 수, 에러 수처럼 계속 증가하는 값. rate()로 "초당 변화율"로 변환해서 쓴다. Gauge는 "지금 얼마?" — CPU, 메모리처럼 현재 값 자체가 의미 있는 값. Histogram은 응답 시간의 분포를 버킷으로 나눠 p99(상위 1% 지연)를 계산할 수 있게 한다.


4. PromQL: 시계열 데이터의 SQL

핵심 함수 4가지

이 4개만 익히면 실무 쿼리의 80%를 작성할 수 있다.

rate() — Counter의 초당 변화율. Counter 메트릭은 반드시 rate()로 변환해야 의미가 생긴다.

hljs language-promql
# 지난 5분간 초당 HTTP 요청 수
rate(http_requests_total[5m])

# 5xx 에러만 필터
rate(http_requests_total{status=~"5.."}[5m])

sum() — 여러 시계열의 합계. by 절로 그룹핑한다.

hljs language-promql
# 서비스별 초당 요청 수
sum by (service)(rate(http_requests_total[5m]))

avg() — 평균값.

hljs language-promql
# 전체 인스턴스의 평균 CPU 사용률
avg(node_cpu_usage_percent)

histogram_quantile() — Histogram에서 백분위수를 계산. 응답 시간 모니터링의 핵심.

hljs language-promql
# 응답 시간 p99 (상위 1%가 경험하는 지연)
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))

실전 PromQL 레시피

목적PromQL
에러율 (%)sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) * 100
CPU 사용률100 - avg by (instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100
메모리 사용률(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
Pod 재시작 횟수increase(kube_pod_container_status_restarts_total[1h])

5. Alertmanager: 알림의 두뇌

Prometheus가 이상을 감지하면, 알림 전송은 별도 컴포넌트인 Alertmanager가 담당한다.

Prometheus 알림 규칙
Alertmanager
Slack / PagerDuty / Email

알림 규칙 예시:

hljs language-yaml
groups:
  - name: service-alerts
    rules:
      - alert: HighCPUUsage
        expr: 100 - (avg by (instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m          # 5분 지속 시에만 발동 (순간 스파이크 무시)
        labels:
          severity: warning
        annotations:
          summary: "CPU 사용률 {{ $value }}% ({{ $labels.instance }})"

Alertmanager의 3대 기능

1
그루핑 (Grouping)
100개 서버에서 동시에 CPU 알림이 발생하면, 100개가 아닌 1개의 그룹 메시지로 묶어 전송한다
2
라우팅 (Routing)
severity=critical은 PagerDuty로, warning은 Slack으로, DB 이슈는 DBA 팀 채널로 분류
3
사일런싱 (Silencing)
예정된 점검 시간에 알림을 끈다. 알림 피로(alert fatigue) 방지의 핵심
알림 피로 주의: 알림이 너무 많으면 팀이 무감각해진다. 경험상 주간 critical 5건 이하, warning 20건 이하가 건강한 수준이다. 이를 넘기면 임계값 재조정이나 근본 원인 해결이 필요하다.

6. Grafana: 데이터를 눈에 보이게 만드는 도구

Grafana 대시보드를 비행기 조종석의 계기판으로 표현한 모습

탄생: 한 명의 개발자에서 시작 (2014)

2014년, 스웨덴의 개발자 Torkel Odegaard가 Kibana의 포크로 Grafana를 시작했다. 이름은 Graphite + Kibana의 합성어. 처음에는 Graphite 전용이었지만, 데이터 소스 플러그인 아키텍처를 도입하면서 어떤 데이터 소스든 연결할 수 있게 되었다.

현재 Grafana Labs는 기업 가치 $6B 이상의 유니콘, GitHub 스타 65,000개 이상으로 가장 많이 사용되는 관측성 대시보드다.

핵심 개념

Grafana 계층 구조
Dashboard 대시보드 여러 패널을 배치한 화면. 서비스별·팀별로 생성
Panel 패널 하나의 그래프/테이블/게이지. PromQL 쿼리 연결
Variable 변수 드롭다운으로 환경·인스턴스 전환. 하나의 대시보드로 여러 환경 조회
Data Source 데이터 소스 Prometheus, Loki, MySQL 등. 여러 소스 혼합 가능

킬러 기능은 템플릿 변수다. 대시보드 상단 드롭다운에서 production, staging을 선택하면 전체 패널이 해당 환경의 메트릭으로 전환된다. 환경별 대시보드를 따로 만들 필요가 없다.


7. Grafana 데이터 소스: LGTM 스택

Grafana가 단순한 그래프 도구가 아닌 통합 관측성 플랫폼이 된 이유는 Grafana Labs가 만든 오픈소스 생태계 때문이다.

LGTM 스택 — 관측성의 세 기둥 + 장기 저장
Loki 로그 (Logs) "Prometheus for Logs." 레이블만 인덱싱하여 ELK 대비 1/10 비용
Grafana 시각화 메트릭+로그+트레이스를 하나의 대시보드에서 통합 조회
Tempo 트레이스 (Traces) 분산 추적. Jaeger 호환. 오브젝트 스토리지에 저장하여 저비용
Mimir 장기 메트릭 저장 Prometheus의 장기 저장 한계 해결. 멀티테넌시, 수평 확장
💡
LGTM: Loki(L) + Grafana(G) + Tempo(T) + Mimir(M). 코드 리뷰에서 "Looks Good To Me"라는 뜻의 LGTM과 발음이 같아서 붙은 이름이다. 네 컴포넌트 모두 오픈소스이며, Grafana Labs가 관리형 서비스(Grafana Cloud)도 제공한다.

Loki는 전통적 로그 시스템(ELK)과 달리 로그 내용을 인덱싱하지 않고 레이블만 인덱싱한다. 비용이 ELK 대비 극적으로 낮으면서도, "이 서비스의 최근 에러 로그" 같은 실무 조사에는 충분하다.

Tempo는 마이크로서비스에서 요청이 서비스 A → B → C를 거치는 경로를 추적하는 분산 추적 시스템이다. 백엔드를 S3/GCS에 직접 저장하여 운영 비용이 낮다.


8. 실전 구축: Kubernetes 클러스터 모니터링

Kubernetes와 Prometheus는 둘 다 CNCF 프로젝트이며, Kubernetes가 자체적으로 /metrics 엔드포인트를 노출하고, Prometheus의 서비스 디스커버리가 K8s API와 연동되어 새 Pod이 뜨면 자동으로 스크래핑 대상에 추가된다.

K8s 클러스터 + node-exporter
Prometheus
Grafana 대시보드
kube-state-metrics
Alertmanager
Slack / PagerDuty
컴포넌트역할
Prometheus Server메트릭 수집, 저장, 쿼리, 알림 규칙 평가
node-exporter각 노드의 CPU, 메모리, 디스크, 네트워크 메트릭
kube-state-metricsK8s 오브젝트 상태 (Pod 수, Deployment 상태)
Alertmanager알림 라우팅, 그루핑, 전송
Grafana대시보드 시각화

9. kube-prometheus-stack: 원클릭 설치

Kubernetes에서 Prometheus + Grafana를 처음부터 설정하는 것은 번거롭다. kube-prometheus-stack Helm 차트 하나로 Prometheus, Grafana, Alertmanager, node-exporter, kube-state-metrics가 모두 설치된다.

hljs language-bash
# Helm 리포지토리 추가
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

# 설치
helm install kube-prometheus prometheus-community/kube-prometheus-stack \
  --namespace monitoring --create-namespace \
  --set grafana.adminPassword='YourSecurePassword' \
  --set prometheus.prometheusSpec.retention=30d \
  --set prometheus.prometheusSpec.storageSpec.volumeClaimTemplate.spec.resources.requests.storage=50Gi

설치 후 Grafana에는 20개 이상의 사전 구성된 대시보드가 포함된다 — Kubernetes Cluster Overview, Node Exporter, Pod Resources 등을 바로 볼 수 있다.

hljs language-bash
# Grafana 접속
kubectl port-forward -n monitoring svc/kube-prometheus-grafana 3000:80
# http://localhost:3000 → admin / YourSecurePassword
💡
ServiceMonitor CRD: 새 서비스의 메트릭을 수집하려면 Prometheus 설정을 건드릴 필요 없이 ServiceMonitor CRD를 배포하면 된다. Kubernetes 네이티브한 방식으로 스크래핑 대상을 관리할 수 있다.

커뮤니티 대시보드도 활용하자:

대시보드ID용도
Node Exporter Full1860서버 하드웨어 메트릭
K8s Cluster Monitoring3119K8s 클러스터 전체
NGINX Ingress Controller9614Ingress 트래픽
PostgreSQL Database9628PostgreSQL 모니터링

10. Prometheus vs CloudWatch vs Datadog

비용 비교

월 비용 (서버 20대, 커스텀 메트릭 500개 기준)
Prometheus + Grafana
$150
CloudWatch
$700
Datadog
$2,100

기능 비교

항목Prometheus + GrafanaCloudWatchDatadog
비용무료 (인프라 비용만)종량제호스트+메트릭 과금
운영 부담직접 설치·운영AWS 내장SaaS, 관리 불필요
쿼리PromQL (강력)Metrics Insights (제한적)독자 쿼리 (강력)
멀티클라우드완벽AWS 전용모든 클라우드
K8s 통합네이티브 (CNCF 형제)Container Insights (추가 비용)강력
APMTempo 별도 구축X-Ray 별도기본 내장
로그Loki 별도 구축CloudWatch Logs 통합기본 내장

어떤 상황에 어떤 도구를?

A
Prometheus + Grafana
비용에 민감한 스타트업, K8s 기반, 멀티클라우드/하이브리드, 벤더 종속을 피하고 싶을 때
B
CloudWatch
100% AWS 환경, 소규모 팀(운영 인력 부족), 빠른 시작이 필요할 때
C
Datadog
예산 충분한 중대형 기업, 올인원 APM+로그+메트릭 통합이 필요할 때
💡
실무의 진실 — 혼합 사용: 현실에서는 하나만 쓰는 경우가 드물다. AWS 인프라 기본은 CloudWatch, K8s 클러스터는 Prometheus + Grafana, APM은 Datadog을 쓰는 조합이 한국 기업에서 흔하다.

마치며: 모니터링은 "보험"이 아니라 "눈"이다

많은 팀이 모니터링을 보험으로 생각한다. "장애 대비용이니 나중에 하자." 하지만 모니터링은 보험이 아니라 이다. 눈이 없으면 서비스가 지금 어떤 상태인지 알 수 없다.

주제핵심
PrometheusCNCF Graduated, Pull 기반 수집, 다차원 레이블
데이터 모델Counter, Gauge, Histogram, Summary
PromQLrate(), sum(), avg(), histogram_quantile()
Alertmanager그루핑, 라우팅, 사일런싱
Grafana데이터 소스 독립, 변수 기반 동적 대시보드
LGTM 스택Loki + Grafana + Tempo + Mimir
kube-prometheus-stackHelm 한 줄로 전체 스택 설치

시작은 간단하다. kube-prometheus-stack을 설치하고, 기본 대시보드로 클러스터 상태를 확인하고, 앱에 /metrics를 추가하고, Slack 알림을 연결하면 된다.

코어닷투데이의 AI 서비스에서도 Prometheus + Grafana는 핵심 인프라다. AI 모델 서빙의 응답 시간, GPU 사용률, 추론 요청 처리량 — 이 모든 메트릭이 Grafana 대시보드에서 실시간으로 확인되고, 이상이 감지되면 Alertmanager가 즉시 알려준다. 서버가 죽기 5분 전에 아는 것과 5시간 뒤에 아는 것 — 그 차이는 모니터링 하나에 달려 있다.