APM을 구성하면 Actuator가 데이터를 내보내고 Prometheus가 그것을 모아 보관한다. 하지만 Prometheus가 대시보드나 무제한 보관까지 다 해주는 것은 아니다. 이 글은 Prometheus가 무엇을 해주고 무엇을 해주지 않는지를 실무 관점에서 정리한다.
토론 요약
- Prometheus는 Pull 기반 시계열 수집기 + 내장 TSDB + 규칙/알림 평가기다.
- 저장·질의는 Prometheus가 하지만, 리치 대시보드와 중앙 알림 라우팅 UI는 Grafana/Alertmanager가 담당한다.
- 장기 보관·수평 확장은 내장 TSDB 한계를 넘어서기 위해 remote_write/remote_read로 외부 TSDB를 붙인다(공식 문서: remote_write).
제공하는 것 (Prometheus가 해주는 일)
- 스크레이프(Pull):
scrape_configs에 따라 대상의/metrics(Spring Boot는/actuator/prometheus)를 주기적으로 수집. - 내장 TSDB 저장·압축: 시계열을 로그 구조로 저장해 빠른 쓰기와 시간 범위 쿼리 제공.
- PromQL 질의: 라벨 기반 필터, 집계, 창 연산으로 대시보드·알림에 바로 사용 가능. 기본 문법: PromQL basics.
- 규칙/알림 평가: 녹다운 룰·알림 룰을 주기적으로 평가 후 Alertmanager로 전송(설정 예시: alerting config).
- 페더레이션/리모트 연동: 여러 Prometheus를 계층화하거나 외부 장기보관으로 보내는 federation/remote_write 지원(federation 예시).
제공하지 않는 것 (Prometheus가 못 하는 일)
- 리치 대시보드/탐색 UI: 기본 콘솔은 단순하다. 실사용 대시는 Grafana 등에서 처리.
- 장기 무제한 보관·수평 확장: 단일 Prometheus는 로컬 디스크 보관 기간이 제한적이다. 장기 보관/확장은 remote_write 뒤에 TSDB(VictoriaMetrics, Mimir, Thanos 등)를 둔다.
- 로그·트레이싱 수집: 메트릭만 담당한다. 로그는 Loki, 트레이싱은 Tempo/Jaeger 같은 별도 스택 필요.
- 알림 라우팅 UI: Alertmanager가 라우팅/사일런스/집계를 제공하며, Prometheus는 알림을 “발송”만 한다.
실무 적용 예제
1) 최소 스크레이프 설정 예시
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: "farm-predict-kamis-dev"
metrics_path: /actuator/prometheus
static_configs:
- targets: ["farm.example.com:8080"]
labels:
application: "kamis"
alerting:
alertmanagers:
- static_configs:
- targets: ["alertmanager:9093"]
설정 항목들은 공식 구성 문서에 상세 설명이 있다(configuration).
2) 알림 룰 예시 (에러율 1분 평균이 5% 이상)
groups:
- name: app-rules
rules:
- alert: HighErrorRate
expr: |
sum(rate(http_server_requests_seconds_count{job="farm-predict-kamis-dev",status=~"5.."}[1m]))
/
sum(rate(http_server_requests_seconds_count{job="farm-predict-kamis-dev"}[1m]))
> 0.05
for: 2m
labels:
severity: warning
annotations:
summary: "farm-predict-kamis-dev 5xx error rate > 5%"
알림 라우팅은 Alertmanager에서 담당한다(alertmanager_config).
3) 자주 쓰는 PromQL 스니펫 (job만 교체)
- 수집 상태:
up{job="farm-predict-kamis-dev"} - RPS:
sum by (instance) (rate(http_server_requests_seconds_count{job="farm-predict-kamis-dev"}[5m])) - 에러율:
sum(rate(http_server_requests_seconds_count{job="farm-predict-kamis-dev",status=~"5.."}[5m])) / sum(rate(http_server_requests_seconds_count{job="farm-predict-kamis-dev"}[5m])) - p95 응답시간:
histogram_quantile(0.95, sum by (le) (rate(http_server_requests_seconds_bucket{job="farm-predict-kamis-dev"}[5m]))) - JVM 힙:
jvm_memory_used_bytes{job="farm-predict-kamis-dev",area="heap"} - 스크레이프 샘플 수:
scrape_samples_post_metric_relabeling{job="farm-predict-kamis-dev"}
4) 데이터가 정말 들어오는지 확인하는 빠른 절차
- Prometheus UI → Status → Targets에서 해당 job이
UP인지 확인. - Graph/콘솔에서
up{job="farm-predict-kamis-dev"}실행(1이면 수집 중). - 주요 메트릭 쿼리로 값이 그려지는지 확인. 없으면 라벨 불일치나 인증/네트워크를 점검.
/actuator/prometheus를 직접 curl로 열어 실제 메트릭이 노출되는지 확인.
흐름 한눈에 보기
결론/팁
- Prometheus는 메트릭 수집·저장·PromQL 평가까지가 역할이다. 대시보드와 알림 라우팅은 Grafana/Alertmanager에 맡긴다.
- 장기 보관·확장이 필요하면 remote_write 뒤에 TSDB를 붙인다.
- 라벨 설계와 스크레이프 주기를 조정해 부하와 카디널리티 폭발을 방지한다.
- 알림은 “조건”을 PromQL로 짜고, 라우팅/사일런스 정책은 Alertmanager에서 다룬다.
다음 단계로 Grafana 편에서 PromQL을 그대로 패널/Alerting에 넣는 방법과, 알림 템플릿/대시보드 구성 포인트를 이어서 다룰 예정이다.
자신만의 철학을 만들어가는 중입니다.
댓글남기기