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

📊 히스토그램 vs 서머리: 당신의 선택은? 서버냐 클라이언트냐, 그것이 문제로다!

by gasbugs 2025. 10. 11.

안녕하세요! 오늘은 모니터링 시스템, 특히 프로메테우스(Prometheus)와 같은 시스템에서 자주 사용되는 두 가지 중요한 메트릭 타입, 히스토그램(Histogram)과 서머리(Summary)의 결정적인 차이점에 대해 알아보려고 합니다.

 

둘 다 요청 지연 시간(request latency)이나 응답 크기(response size)와 같은 값의 분포를 측정하는 데 사용되지만, 동작 방식에는 아주 중요한 차이가 있습니다. 바로 어디서 계산이 이루어지느냐 하는 점이죠! 🤔

 


🚀 핵심 차이점: 계산의 주체

결론부터 말씀드리자면, 둘의 가장 큰 차이점은 다음과 같습니다.

  • 히스토그램 (Histogram): 데이터 수집 및 계산이 서버 측(Server-side)에서 이루어집니다. 🖥️
  • 서머리 (Summary): 데이터 계산이 클라이언트 측(Client-side)에서 이루어집니다. 💻

이 간단한 차이가 왜 그렇게 중요할까요? 지금부터 자세히 파헤쳐 보겠습니다.

🖥️ 히스토그램 (Histogram): 서버의 힘을 빌리자!

히스토그램은 클라이언트(여러분의 애플리케이션)가 관찰한 값을 그대로 서버(예: 프로메테우스 서버)로 전송하는 방식입니다.

어떻게 동작하나요?

  1. 클라이언트 (애플리케이션) 💻: 요청이 들어올 때마다 응답 시간(예: 150ms)을 측정합니다.
  2. 측정값 전송: 이 150ms라는 값을 서버로 그냥 보냅니다. 클라이언트는 복잡한 계산을 하지 않아요!
  3. 서버 (프로메테우스) 🖥️: 서버는 미리 정의된 '버킷(bucket)'을 가지고 있습니다. 예를 들어, (0-100ms, 100-200ms, 200-300ms, ...) 와 같은 구간들이죠.
  4. 서버에서 계산: 서버는 클라이언트로부터 받은 150ms 값을 보고 '100-200ms' 버킷의 카운트를 1 증가시킵니다.
  5. 분위수 계산: 수집된 모든 버킷의 데이터를 기반으로 서버가 직접 백분위수(Quantile, 예: 99%, 95%)를 추정하여 계산합니다.

장점 👍

  • 낮은 클라이언트 부하: 클라이언트는 단순히 측정값만 보내면 되므로, CPU나 메모리 부담이 거의 없습니다. 가볍고 빨라요! 🕊️
  • 유연한 집계(Aggregation): 여러 클라이언트(인스턴스)에서 수집된 데이터를 서버에서 합산하여 전체 서비스의 분위수를 계산할 수 있습니다. A서버의 99% + B서버의 99%가 아닌, (A+B)서버 전체의 99%를 알 수 있죠. 이것이 히스토그램의 가장 강력한 장점입니다! 💯
  • 자유로운 쿼리: 수집된 데이터를 바탕으로 서버에서 다양한 조건으로 쿼리하고 분석하기 용이합니다.

단점 👎

  • 정확도 한계: 미리 정의된 버킷을 사용하기 때문에, 백분위수 계산이 정확한 값이 아닌 근사치입니다. 버킷의 범위가 넓을수록 오차는 커질 수 있습니다.

💻 서머리 (Summary): 클라이언트가 직접 해결한다!

서머리는 클라이언트(애플리케이션)가 직접 분위수를 계산한 후, 그 결과값을 서버로 전송하는 방식입니다.

어떻게 동작하나요?

  1. 클라이언트 (애플리케이션) 💻: 일정 시간 동안 들어온 모든 요청의 응답 시간 값들을 자체적으로 저장하고 있습니다. (예: [120ms, 150ms, 90ms, 210ms, ...])
  2. 자체 계산: 클라이언트는 이 데이터들을 바탕으로 직접 분위수(예: 99%는 210ms, 50%는 135ms)를 정확하게 계산합니다.
  3. 결과 전송: 계산이 완료된 결과값(quantile="0.99", value="210")을 서버로 전송합니다.

장점 👍

  • 높은 정확도: 클라이언트가 직접 모든 측정값을 가지고 계산하므로, 백분위수 값이 매우 정확합니다. ✅
  • 직관적인 결과: 내가 원하는 분위수(p50, p90, p99 등)를 명확하게 설정하고 확인할 수 있습니다.

단점 👎

  • 높은 클라이언트 부하: 모든 측정값을 일정 시간 동안 메모리에 보관하고, 분위수를 계산해야 하므로 CPU와 메모리 사용량이 높습니다. 😥
  • 집계(Aggregation) 불가능: 각 클라이언트가 이미 계산을 끝낸 결과를 서버로 보내기 때문에, 여러 클라이언트의 데이터를 합쳐 전체 서비스의 분위수를 계산할 수 없습니다. (A서버의 99%와 B서버의 99%를 평균 내는 것은 통계적으로 의미가 없습니다.) ❌

🎯 한눈에 보는 비교표

구분히스토그램 (Histogram)서머리 (Summary)

계산 위치 서버 측 🖥️ 클라이언트 측 💻
클라이언트 부하 낮음 (Low) 🕊️ 높음 (High) 🐘
데이터 집계 가능 (Possible) 불가능 (Impossible)
분위수 정확도 근사치 (Approximate) 정확함 (Accurate)
주요 사용처 전반적인 서비스 지표 (ex: API 응답 시간) 개별 인스턴스의 정확한 성능 측정

✨ 그래서 뭘 써야 할까요?

  • 대부분의 경우, 히스토그램을 추천합니다. 🚀 마이크로서비스 아키텍처처럼 여러 인스턴스가 실행되는 환경에서는 전체 서비스의 성능을 파악하는 것이 중요합니다. 히스토그램은 데이터를 유연하게 집계할 수 있어 SLO/SLA를 측정하고 전반적인 서비스 상태를 모니터링하는 데 훨씬 유용합니다.
  • 서머리는 특별한 경우에 사용하세요. 🎯 정확한 분위수 계산이 반드시 필요하고, 여러 인스턴스 간의 데이터 집계가 중요하지 않은 경우에 적합합니다. 예를 들어, 단일 배치(batch) 작업의 실행 시간 분포를 정확하게 알고 싶을 때 유용할 수 있습니다.

이제 히스토그램과 서머리의 차이점이 명확하게 이해되셨나요? 모니터링 시스템을 구축할 때 여러분의 상황에 맞는 올바른 메트릭 타입을 선택하여 더 효과적인 관찰 가능성(Observability)을 확보하시길 바랍니다!