본문 바로가기
클라우드/prometheus

Prometheus 모범 사례: 올바른 메트릭과 레이블 설계하기 🚀

by gasbugs 2025. 10. 11.

안녕하세요! 오늘은 모니터링 시스템의 핵심, Prometheus를 사용하면서 가장 중요하고 기본적인 부분인 '메트릭 이름과 레이블 설계'에 대해 이야기해보려고 합니다. 애플리케이션의 상태를 정확하고 효율적으로 파악하기 위해서는 처음부터 메트릭을 올바르게 설계하는 것이 정말 중요해요.

 

HTTP 요청 수를 추적하는 흔한 시나리오를 통해 어떤 방법이 가장 좋은지 함께 알아볼까요? 🤔

 

❌ 흔히 저지르는 실수: 모든 정보를 이름에 담기

애플리케이션에서 처리된 HTTP 요청을 메소드(GET, POST)와 상태 코드(200, 404, 500)별로 추적하고 싶다고 가정해 봅시다. 가장 직관적으로 떠오르는 방법은 아마 이런 식일 겁니다.

http_requests_get_200_total
http_requests_post_500_total
http_requests_get_404_total
...

얼핏 보면 명확해 보이지만, 이 방식은 Prometheus의 강력한 기능을 제대로 활용하지 못하게 만드는 치명적인 단점이 있습니다. 바로 '메트릭 폭발(Metric Explosion)' 💣 현상입니다.

HTTP 메소드와 상태 코드의 모든 조합마다 새로운 메트릭이 생성됩니다. 만약 여기에 사용자 ID나 엔드포인트 경로 같은 다른 속성까지 추가된다면? 관리해야 할 메트릭의 수는 기하급수적으로 늘어나고, 시스템에 큰 부담을 주게 됩니다. 또한 "상태 코드가 500인 모든 요청의 합계"와 같은 단순한 집계 쿼리조차 매우 복잡하고 지저분해집니다. 🤯

 

✅ Prometheus 방식: 레이블로 차원을 부여하라!

Prometheus가 권장하는 가장 이상적인 방법은 바로 이것입니다.

http_requests_total{method="GET", code="200"}

이 방식이 왜 뛰어난지 하나씩 살펴볼까요?

1. 의미 있는 메트릭 이름 📝

http_requests_total 이라는 이름은 두 부분으로 나눌 수 있습니다.

  • http_requests: 측정하려는 대상이 'HTTP 요청'임을 명확하게 알려줍니다. 기본 이름은 최대한 일반적이고 포괄적으로 짓는 것이 좋습니다.
  • _total: 이 메트릭이 '카운터(Counter)' 타입임을 알려주는 표준 접미사입니다. 카운터는 계속해서 누적 증가하는 값을 의미하죠. 📈 이렇게 접미사를 통해 메트릭의 타입을 명시해 주면, 누구든 이 메트릭의 특성을 쉽게 파악할 수 있습니다.

2. 강력하고 유연한 레이블 ✨

여기서 핵심은 바로 {method="GET", code="200"} 부분, 즉 레이블(Label) 입니다. 레이블은 메트릭에 다차원적인 속성(Dimension)을 부여하는 역할을 합니다.

  • 속성 분리: method나 code처럼 다양한 값을 가질 수 있는 속성들을 메트릭 이름에서 분리하여 레이블로 만듭니다.
  • 유연한 쿼리: 레이블을 사용하면 PromQL을 통해 데이터를 자유자재로 자르고, 필터링하고, 집계할 수 있습니다. 예를 들어, 5분 동안 상태 코드별로 요청률을 보고 싶다면 아래와 같이 간단한 쿼리 하나로 충분합니다.
# 상태 코드(code)별로 그룹화하여 5분간의 초당 요청률 계산
sum by (code) (rate(http_requests_total[5m]))

만약 첫 번째 방식처럼 메트릭 이름을 사용했다면, http_requests_..._200_total, http_requests_..._500_total 등 모든 메트릭을 +로 더해야 하는 끔찍한 상황이 발생했을 겁니다. 😱

 

🤔 다른 잘못된 예시들

왜 다른 방식들이 좋지 않은지도 간단히 짚어보겠습니다.

  • http_requests{method="GET", code="200", status="total"}
    • _total 접미사가 이미 카운터임을 나타내고 있는데, status="total" 이라는 레이블을 추가하는 것은 불필요한 중복입니다. 메트릭은 최대한 간결하고 명확하게 유지하는 것이 좋습니다.
  • application_http_requests(method='GET', code='200')
    • 이것은 Prometheus의 메트릭 및 레이블 구문 자체에 맞지 않는 표기법입니다. 괄호 ()나 작은따옴표 ''는 사용하지 않습니다. ❌

 

💡 정리하며

Prometheus 메트릭을 설계할 때 기억해야 할 핵심 원칙은 다음과 같습니다.

  1. 메트릭 이름은 측정 대상을 나타내도록 일반화하세요.
  2. 다양한 값을 가질 수 있는 속성(차원)은 레이블로 분리하세요.
  3. 카운터 메트릭에는 _total과 같은 표준 접미사를 사용하세요.

이 원칙들만 잘 지켜도 훨씬 더 유연하고, 확장 가능하며, 강력한 모니터링 시스템을 구축할 수 있습니다. 여러분의 Prometheus 여정에 이 글이 작은 도움이 되기를 바랍니다! 💪