안녕하세요! 👋 프로메테우스(Prometheus)를 도입해서 기본 노드나 데이터베이스 모니터링은 시작하셨나요? 그렇다면 다음 단계는 바로 '우리 애플리케이션에 직접 메트릭 심기', 즉 인스트루멘테이션(Instrumentation)일 겁니다.
하지만 막상 시작하려고 하면 "메트릭 이름은 어떻게 짓지?", "어떤 타입을 써야 할까?", "레이블은 막 추가해도 되나?" 같은 고민에 빠지게 됩니다.
오늘은 여러분의 고민을 덜어드리고, "프로메테우스 좀 쓸 줄 아네!" 라는 말을 들을 수 있는 애플리케이션 인스트루멘테이션 핵심 베스트 프랙티스를 알기 쉽게 정리해 드릴게요!

1. 일관성 있는 이름 짓기: 나중을 위한 최고의 투자
가장 기본이지만 가장 중요한 규칙입니다. 메트릭 이름이 중구난방이면 나중에 PromQL로 쿼리할 때 큰 혼란이 생깁니다. 아래의 표준 명명 규칙을 따르는 것이 좋습니다.
[라이브러리/애플리케이션 접두사]_[측정 대상]_[단위]
- 접두사 (Prefix): 어떤 애플리케이션이나 라이브러리의 메트릭인지 명확히 합니다. (예: http_, prometheus_, api_)
- 측정 대상 (Metric Name): 무엇을 측정하는지 명확하게 나타냅니다. (예: requests_total, request_duration_seconds)
- 단위 (Unit): 메트릭의 단위를 명시합니다. 특히 시간을 나타낼 때는 seconds, 데이터 크기는 bytes 와 같이 기본 단위를 사용하는 것을 강력히 권장합니다. (ms, KB 대신)
✅ 좋은 예:
- api_http_requests_total: API 서버의 전체 HTTP 요청 수 (카운터는 _total 접미사)
- process_resident_memory_bytes: 프로세스의 물리 메모리 사용량 (바이트 단위)
- http_request_duration_seconds: HTTP 요청 처리 시간 (초 단위)
❌ 나쁜 예:
- requests: 무엇의 요청인지 알 수 없음.
- memory: 단위가 없어 MB인지, KB인지 알 수 없음.
- http_latency_ms: 기본 단위가 아닌 밀리초(ms)를 사용함.
2. 알맞은 메트릭 타입 선택하기: 올바른 도구 사용 🛠️
프로메테우스에는 네 가지 메트릭 타입이 있습니다. 상황에 맞는 타입을 선택해야 데이터의 의미가 정확해집니다.
- 카운터 (Counter) 📈: 오직 증가만 하는 값에 사용합니다. (예: 누적 요청 수, 누적 에러 수)
- rate(), increase() 함수와 함께 사용해 '분당 요청 수' 등을 계산합니다.
- 게이지 (Gauge) 🌡️: 값이 오르내릴 수 있는 현재 상태 값에 사용합니다. (예: 현재 접속자 수, CPU 사용률, 큐에 쌓인 작업 수)
- 히스토그램 (Histogram) 📊: 관찰 값의 분포를 파악할 때 사용합니다. 주로 응답 시간(Latency) 측정에 쓰입니다.
- histogram_quantile() 함수로 "요청의 95%는 몇 초 안에 처리되었나?"와 같은 백분위수(Percentile) 계산에 최적화되어 있습니다. 대부분의 응답 시간 측정에는 히스토그램이 정답입니다.
- 서머리 (Summary) 📝: 히스토그램과 유사하지만, 클라이언트 측에서 직접 백분위수를 계산합니다. 집계가 어려워 특수한 경우 외에는 히스토그램 사용이 권장됩니다.
3. ⚠️ 가장 중요! 레이블과 카디널리티 관리하기
레이블(Label)은 프로메테우스의 강력한 기능이지만, 잘못 사용하면 서버를 파괴할 수도 있는 양날의 검입니다. 핵심은 카디널리티(Cardinality)를 관리하는 것입니다.
카디널리티란, 레이블 값의 고유한 조합이 몇 개나 되는지를 나타내는 척도입니다.
- 낮은 카디널리티 (Low Cardinality) 👍: 레이블 값의 종류가 한정적입니다. (예: method="GET", "POST", status="200", "404", "500")
- 높은 카디널리티 (High Cardinality) 💣: 사용자 ID, 이메일, 세션 ID, 요청 ID처럼 무한히 늘어날 수 있는 값을 레이블로 사용하는 경우입니다.
높은 카디널리티는 프로메테우스 서버의 메모리 사용량을 폭발적으로 증가시키고, 성능을 극심하게 저하시키는 주범입니다! 절대로 고유 식별자를 레이블 값으로 사용해서는 안 됩니다.
✅ 좋은 레이블
예: http_requests_total{method="POST", path="/api/v1/login", status="200"} (method, path, status는 종류가 한정적입니다.)
❌ 절대 피해야 할 레이블
예: http_requests_total{user_id="user12345", session_id="a1b2c3d4e5f6g7"} (사용자가 늘어날 때마다 새로운 시계열(time series)이 무한정 생성됩니다.)
4. 무엇을 측정할까? 4대 핵심 지표 (Four Golden Signals) ✨
"그래서 도대체 뭘 측정해야 하나요?"에 대한 최고의 답변은 구글 SRE가 제시한 **'4대 핵심 지표'**입니다. 사용자 경험에 직접적인 영향을 주는 이 네 가지 지표를 중심으로 측정하면 실패하지 않습니다.
- 지연 시간 (Latency) 🐢: 요청을 처리하는 데 걸리는 시간. 성공한 요청과 실패한 요청의 시간을 구분해서 측정하는 것이 중요합니다.
- 트래픽 (Traffic) 🚦: 서비스가 받고 있는 요청의 양. (예: 초당 HTTP 요청 수)
- 에러 (Errors) 💥: 실패한 요청의 비율. 시스템에서 발생하는 모든 종류의 에러를 명시적으로 추적해야 합니다.
- 포화도 (Saturation) 🈵: 서비스가 얼마나 '가득 찼는지'를 나타내는 지표. CPU, 메모리, 디스크 공간 등 시스템의 가장 제약이 심한 리소스의 부하를 측정합니다.
5. 계산은 PromQL에게 맡기기: 애플리케이션은 단순하게 🧠
애플리케이션 코드에서는 복잡한 계산을 하지 마세요. '초당 요청 수' 같은 비율을 계산해서 메트릭으로 노출할 필요가 없습니다.
- 애플리케이션의 역할: 그저 원시 데이터(raw data)를 노출하는 데 집중합니다. 요청이 올 때마다 카운터를 1씩 증가시키기만 하면 됩니다. (http_requests_total.inc())
- PromQL의 역할: rate(http_requests_total[5m]) 처럼 강력한 쿼리 언어인 PromQL을 사용해 원하는 모든 계산, 집계, 분석을 수행합니다.
이렇게 역할을 분리하면 애플리케이션 코드는 단순해지고, 수집된 데이터는 훨씬 유연하게 활용될 수 있습니다.
마치며
훌륭한 모니터링 시스템은 잘 구축된 관측 가능성(Observability)에서 시작되고, 그 첫걸음은 바로 올바른 방법으로 메트릭을 심는 것입니다. 오늘 소개해드린 5가지 베스트 프랙티스를 꼭 기억하셔서, 안정적이고 분석하기 쉬운 모니터링 환경을 구축하시길 바랍니다!
태그: 프로메테우스, 모니터링, Instrumentation, 베스트 프랙티스, SRE, DevOps, Observability, 카디널리티
'클라우드 > prometheus' 카테고리의 다른 글
| 프로메테우스 성능 저하의 주범? 라벨(Label) 똑똑하게 사용하는 방법 🧐 (0) | 2025.10.11 |
|---|---|
| Prometheus 모범 사례: 올바른 메트릭과 레이블 설계하기 🚀 (0) | 2025.10.11 |
| 📊 Prometheus 메트릭 타입, 완벽 정복 가이드! (1) | 2025.10.11 |
| 황금 쿠버스트로넛(Golden Kuberstroaunut)을 아시나요? 쿠버네티스 전문가의 새로운 상징! ✨ (1) | 2025.09.28 |
| 🚀 Observability의 완성! LGTM 스택으로 그라파나 생태계 정복하기 (0) | 2025.09.26 |