Prometheus Metrics: 앱 성능 모니터링

Prometheus Metrics: 앱 성능 모니터링
Prometheus란 무엇인가요?
Prometheus는 소프트웨어 시스템의 성능과 상태를 추적하는 오픈 소스 도구입니다. 메트릭이라고 알려진 데이터 포인트를 수집하여 시스템이 얼마나 잘 실행되는지에 대한 인사이트를 제공합니다. 이러한 메트릭은 문제를 조기에 감지하고 시스템 동작을 분석하는 데 도움이 됩니다. Prometheus를 사용하면 팀은 문제가 사용자에게 영향을 미치기 전에 이를 발견하여 안정적이고 효율적인 서비스를 유지할 수 있습니다.
Prometheus의 메트릭이란 무엇인가요?
Prometheus에서 메트릭은 시간 경과에 따라 시스템 동작과 성능의 특정 측면을 추적하는 숫자 값입니다. 이러한 메트릭은 다양한 조건에서 시스템이 얼마나 잘 작동하는지 이해하는 데 도움이 되며, 갑작스러운 트래픽 급증이나 시스템 성능 저하와 같이 문제를 나타낼 수 있는 조건에서 알림도 제공합니다. 웹사이트의 활성 사용자 수부터 애플리케이션이 사용하는 메모리 양까지 광범위한 데이터를 모니터링할 수 있습니다.
Prometheus의 메트릭 형식
Prometheus의 메트릭은 시계열 형식으로 저장되며, 각 메트릭은 이름과 레이블이라고 불리는 선택적 키-값 쌍으로 식별됩니다. 레이블은 서비스 이름이나 오류 유형과 같은 추가 컨텍스트를 제공합니다. Prometheus에서 메트릭 데이터의 기본 형식은 Prometheus Exposition Format입니다. 이 일반 텍스트 형식은 생성하고 파싱하기 쉬우며, 메트릭 이름, 선택적 레이블, 메트릭 값, 타임스탬프를 포함하는 데이터 라인으로 구성됩니다.
Prometheus의 네 가지 메트릭 유형
Prometheus는 메트릭을 카운터, 게이지, 히스토그램, 요약이라는 네 가지 주요 유형으로 분류합니다. 각 유형은 모니터링에서 특정 기능을 수행하며 시스템 동작에 대한 서로 다른 인사이트를 제공합니다.
카운터 메트릭
Prometheus의 카운터 메트릭은 특정 이벤트가 발생한 횟수를 기록합니다. 시간이 지남에 따라 증가하기만 하거나 프로세스가 재시작될 때 0으로 재설정됩니다. 따라서 처리된 요청 수, 완료된 작업 수, 기록된 오류 수와 같은 누적 수량을 추적하는 데 사용됩니다.
서버가 수신한 요청 수를 추적하는 카운터를 구현하려면 다음 코드 스니펫을 사용할 수 있습니다. 이 예시는 수신된 HTTP 요청의 총 수를 모니터링하는 카운터를 설정합니다. handle_request 함수가 호출될 때마다 카운터가 증가합니다.
from prometheus_client import Counter
# Create a counter metric for tracking received requests
request_counter = Counter('http_requests_received_total', 'Total HTTP requests received')
def handle_request(request):
# Process the request
# ...
# Increment the counter by 1 each time this function is called
request_counter.inc()
카운터 사용 모범 사례
재설정 인식: 프로세스가 재시작될 때 카운터가 0으로 재설정된다는 점을 인식하세요. 이러한 재설정을 고려하도록 모니터링을 설계하세요.
레이블 사용: 서로 다른 유형의 오류나 요청을 구분하는 등 더 자세한 인사이트를 제공하려면 카운터와 함께 레이블을 사용하세요.
일관된 증가: 추적하는 이벤트를 정확하게 반영하도록 코드의 올바른 위치에서 카운터가 증가하는지 확인하세요.
재설정 모니터링: 쿼리에서 rate 함수를 사용하여 카운터 증가의 초당 평균 속도를 계산하세요. 이는 재설정이 있더라도 추세를 이해하고 문제를 감지하는 데 도움이 될 수 있습니다.
게이지 메트릭
Prometheus의 게이지 메트릭은 CPU 온도, 현재 실행 중인 프로세스 수, 여유 메모리 양처럼 증가하거나 감소할 수 있는 값을 측정합니다. 증가만 하는 카운터와 달리, 게이지는 특정 시점의 시스템 현재 상태를 반영하므로 변동하는 메트릭을 추적하는 데 필수적입니다.
시스템의 여유 메모리 양을 모니터링하는 게이지를 구현하려면 다음 코드 스니펫을 사용할 수 있습니다. 이 예제는 여유 메모리를 모니터링하도록 게이지를 설정하며, 시스템 변경 사항을 반영하도록 트리거되어야 하는 update_free_memory() 함수를 호출하여 게이지의 값을 업데이트합니다.
from prometheus_client import Gauge
# Create a gauge metric to track free memory
free_memory_gauge = Gauge('system_free_memory_bytes', 'Amount of free memory in bytes')
def update_free_memory():
# Assume get_free_memory() is a function that fetches the current free memory
free_memory = get_free_memory()
free_memory_gauge.set(free_memory)
# Update gauge regularly or upon specific system events
update_free_memory()
게이지 활용 팁
정기적인 업데이트: 시스템의 현재 상태를 정확하게 반영하도록 게이지가 정기적으로 업데이트되는지 확인하세요.
상황에 맞는 사용: 로드 평균이나 사용 가능한 시스템 리소스처럼 시간에 따른 증가와 감소를 추적해야 하는 메트릭에 게이지를 사용하세요.
오용 방지: 카운터나 히스토그램이 더 적절할 수 있는, 증가 또는 감소만 해야 하는 메트릭에는 게이지를 사용하지 않도록 주의하세요.
히스토그램 메트릭
Prometheus의 히스토그램은 미리 정의된 버킷 집합에 걸쳐 숫자 데이터의 분포를 요약합니다. 각 버킷은 값의 범위를 나타내며, 히스토그램은 각 버킷에 몇 개의 값이 속하는지 계산합니다. 이 메트릭 유형은 요청 지연 시간이나 응답 크기와 같은 측정값을 추적하는 데 유용하며, 분포를 이해하면 단순히 평균을 아는 것보다 더 많은 통찰을 얻을 수 있습니다.
HTTP 요청의 지연 시간을 추적하는 히스토그램을 구현하려면 다음 코드 스니펫을 사용할 수 있습니다. 이 예제는 각 HTTP 요청을 처리하는 데 걸리는 시간을 측정하기 위해 여러 버킷이 있는 히스토그램을 설정합니다. with 블록은 요청 처리 시간을 자동으로 측정하고 적절한 버킷에 기록합니다.
from prometheus_client import Histogram
# Define a histogram with buckets for request latency
request_latency_histogram = Histogram('http_request_latency_seconds', 'HTTP request latencies', buckets=[0.1, 0.2, 0.5, 1, 2, 5])
def handle_request(request):
with request_latency_histogram.time():
# Process the request
# This automatically measures the time taken by this block and records it in the histogram
pass
히스토그램 버킷과 그 중요성
버킷 설계: 유용한 히스토그램을 위해서는 올바른 버킷을 선택하는 것이 중요합니다. 버킷은 애플리케이션의 성능 목표 및 임계값과 일치해야 합니다. 예를 들어, 0.1초가 걸리는 요청과 1초가 걸리는 요청을 구분하는 것이 중요하다면, 버킷은 이러한 간격을 반영해야 합니다.
세분성: 버킷이 많을수록 히스토그램의 세분성은 증가하지만 메모리 사용량도 증가합니다. 세부 정보와 리소스 효율성 사이의 균형을 맞추세요.
누적 계산: Prometheus의 히스토그램은 누적 방식입니다. 이는 각 버킷이 해당 범위와 이전 모든 범위에 속하는 관측값의 총수를 계산한다는 의미입니다. 이를 통해 백분위수를 계산할 수 있으며, 이는 평균보다 데이터 분포에 대해 더 유익한 정보를 제공합니다.
쿼리에서의 사용: 히스토그램을 쿼리할 때 histogram
_quantile()과 같은 함수는 누적 버킷에서 분위수를 계산하여 시스템의 성능 특성에 대한 강력한 통찰을 제공할 수 있습니다.
요약 메트릭
Prometheus의 요약 메트릭은 요청 지연 시간의 90번째 백분위수와 같은 관측값의 분위수를 클라이언트 내에서 직접 계산하는 방법을 제공합니다. 데이터를 수집하여 버킷으로 분류하는 히스토그램과 달리, 요약은 미리 정의된 버킷 없이 스트리밍 분위수를 계산합니다. 따라서 요약은 정확한 분위수 계산이 필요한 상황, 특히 서비스 수준 계약(SLA) 보고처럼 정확한 임계값이 중요한 경우에 이상적입니다.
데이터베이스 쿼리의 지연 시간을 측정하는 요약을 구현하려면 다음 코드 스니펫을 사용할 수 있습니다. 이 예제는 데이터베이스 쿼리에 걸리는 시간을 모니터링하기 위한 요약을 설정합니다. with 블록은 쿼리의 지속 시간을 측정하고 이 새로운 관측값으로 요약을 업데이트하여 분위수 계산을 용이하게 합니다.
from prometheus_client import Summary
# 데이터베이스 쿼리 지연 시간을 측정하기 위한 요약 생성
db_query_latency = Summary('db_query_latency_seconds', 'Database query latencies')
def query_database(query):
with db_query_latency.time():
# 데이터베이스 쿼리 실행
# 이 블록에 걸린 시간은 자동으로 기록되어 요약에서 계산됩니다
pass
히스토그램과 요약의 차이점
분위수 계산: 히스토그램은 정의된 버킷을 기반으로 분위수를 추정하며, 버킷 구성에 따라 부정확성이 발생할 수 있습니다. 요약은 관측된 데이터에서 직접 분위수를 계산하므로 잠재적으로 더 높은 정밀도를 제공할 수 있습니다.
클라이언트 측 부하: 요약은 클라이언트 측에서 분위수를 계산하므로, 특히 관측값 수가 많을 때 계산 부하가 증가할 수 있습니다. 히스토그램은 미리 정의된 버킷을 사용하므로 클라이언트 측 계산을 줄일 수 있습니다.
구성: 히스토그램은 적절한 버킷을 설정하기 위해 분포에 대한 사전 지식이 필요합니다. 요약은 버킷 구성이 필요하지 않으므로 초기 배포가 더 쉽지만 잠재적으로 더 많은 리소스를 사용할 수 있습니다.
사용 사례: 정확한 실시간 분위수가 중요한 메트릭에 필요한 경우 요약이 선호되는 반면, 정확한 임계값이 덜 중요한 메트릭의 더 넓은 분포를 포착하는 데는 히스토그램이 더 적합한 경우가 많습니다.
레이블 지정 및 메트릭 그룹화 모범 사례
레이블의 적절한 사용
Prometheus의 레이블은 더 상세하고 대상화된 쿼리를 위해 메트릭에 메타데이터를 첨부하는 키-값 쌍입니다. 서비스 이름, 호스트 이름 또는 오류 유형과 같은 차원 전반에서 메트릭을 구성하고 식별하는 데 중요합니다. 다음은 레이블 사용에 대한 몇 가지 모범 사례입니다.
설명적이고 일관성 있게: 목적을 명확하게 설명하는 레이블 이름을 선택하고 메트릭 전반에서 일관성을 유지하세요. 예를 들어, 해당 메트릭이 속한 서비스를 식별하는 모든 메트릭에 service를 사용하세요.
필요한 세분성: 레이블은 메트릭에 상당한 세부 정보를 추가할 수 있지만, 너무 많은 레이블은 저장 비용을 증가시키고 쿼리 성능을 저하시킬 수 있습니다. 세분성과 성능의 균형을 맞추기 위해 신중하게 레이블을 사용하세요.
높은 카디널리티 피하기: 개별 사용자나 이메일 주소마다 레이블을 지정할 수 있는 것과 같은 높은 카디널리티 레이블은 데이터 크기를 증가시키고 성능을 저하시킬 수 있습니다. 적절한 수의 고유 값을 가진 레이블을 사용하세요.
이 예제는 상세한 분석 및 모니터링을 위해 서로 다른 HTTP 메서드와 상태를 구분하는 레이블을 사용하는 카운터를 보여줍니다.
from prometheus_client import Counter
# HTTP 메서드 및 응답 상태에 대한 레이블이 있는 카운터 생성
http_requests_total = Counter('http_requests_total', 'Total HTTP requests',
['method', 'status'])
def handle_request(request):
# 적절한 레이블로 카운터 증가
http_requests_total.labels(method=request.method, status=request.response.status_code).inc()
메트릭 그룹화 전략
메트릭을 논리적으로 그룹화하면 명확성을 높이고 모니터링 시스템의 성능을 개선할 수 있습니다. 다음은 몇 가지 전략입니다.
유형별 분류: 오류, 트래픽, 지연 시간 등 유형별로 메트릭을 그룹화하여 관련 메트릭을 더 쉽게 찾고 분석할 수 있도록 합니다.
서비스 기반 그룹화: 측정하는 서비스별로 메트릭을 구성합니다. 이를 통해 특정 서비스 내의 문제를 빠르게 격리하는 데 도움이 됩니다.
계층적 명명 사용: 메트릭 이름을 지정할 때
service_database_queries_total또는service_http_requests_total과 같이 그룹화를 반영하는 계층적 구조를 고려하세요.
효과적인 그룹화의 이점
향상된 쿼리 성능: 논리적 그룹화는 각 쿼리마다 스캔해야 하는 메트릭 수를 줄여 더 효율적인 쿼리로 이어질 수 있습니다.
더 쉬운 알림 관리: 유사한 메트릭을 그룹화하면 알림 규칙 생성이 단순해지고 시스템의 여러 부분에 걸쳐 알림을 더 쉽게 관리할 수 있습니다.
더 나은 시각화: 그룹화된 메트릭은 관련 메트릭을 함께 표시할 수 있어 대시보드에서 더 쉽게 시각화할 수 있으며, 시스템 성능에 대한 일관된 보기를 제공합니다.
PromQL로 메트릭 쿼리하기
PromQL의 기본 사항과 구문
PromQL, 즉 Prometheus Query Language는 Prometheus에서 데이터를 탐색하고 알림을 생성하는 데 사용하는 강력한 쿼리 언어입니다. PromQL은 메트릭에서 필요한 정확한 데이터를 계산하기 위해 단순한 쿼리와 복잡한 쿼리를 모두 허용합니다. PromQL의 구문은 메트릭 이름, 레이블, 시간 간격을 기반으로 시계열 데이터를 선택하고 집계하는 것을 지원합니다.
PromQL의 주요 기능:
즉시 쿼리와 범위 쿼리: 즉시 쿼리는 특정 시점의 시계열 현재 값을 제공하는 반면, 범위 쿼리는 일정 시간 범위에 대한 시계열 값을 반환합니다.
함수와 연산자: PromQL에는 메트릭 간 비율, 평균, 산술 연산을 계산하기 위한 다양한 내장 함수와 연산자가 포함되어 있습니다.
코드 스니펫: 각 메트릭 유형별 일반적인 쿼리
카운터 메트릭
이 쿼리는 지난 5분 동안 HTTP 요청의 초당 평균 비율을 계산하며, 서버의 트래픽 부하를 모니터링하는 데 유용합니다.
rate(http_requests_total[5m])
게이지 메트릭
이 즉시 쿼리는 현재 사용 가능한 메모리 양을 가져와 시스템 리소스의 스냅샷을 제공합니다.
node_memory_MemFree_bytes
히스토그램 메트릭
다음 쿼리는 지난 10분 동안 요청 지연 시간의 95번째 백분위수를 계산하며, 웹 서버 성능의 이상값을 식별하는 데 도움이 됩니다.
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[10m]))
요약 메트릭
아래 쿼리는 처리된 이벤트의 중앙값 지연 시간을 계산하며, 이는 이벤트 처리 시스템의 성능을 평가하는 데 매우 중요합니다.
quantile(0.5, rate(processed_events_latency_seconds_sum[5m]) / rate(processed_events_latency_seconds_count[5m]))
PromQL로 효과적인 쿼리를 작성하기 위한 팁:
적절한 시간 범위 사용: 긴 과거 데이터 쿼리로 시스템에 과부하를 주지 않으면서 의미 있는 인사이트를 제공하는 시간 범위를 선택하세요.
레이블 필터링 활용: 레이블을 사용하여 결과를 필터링하고 세분화하여 특정 데이터 하위 집합에 집중하세요.
성능 최적화: 특히 대시보드나 알림을 위한 쿼리를 작성할 때 성능 영향을 고려하고 효율적으로 실행되도록 최적화하세요.
Prometheus로 Milvus Vector Database의 성능 모니터링하기
Milvus는 고차원 vector embeddings를 통해 수십억 규모의 unstructured data를 저장, 인덱싱, 검색할 수 있는 오픈 소스 고성능 고확장성 vector database입니다. 검색 증강 생성(RAG), 시맨틱 검색, multimodal search, 추천 시스템과 같은 최신 AI 애플리케이션을 구축하는 데 적합합니다. Milvus는 노트북과 엣지 디바이스부터 대규모 분산 시스템에 이르기까지 다양한 environments에서 효율적으로 실행됩니다.
Prometheus는 Milvus 벡터 데이터베이스의 성능을 감독하기 위한 포괄적인 기능을 제공합니다. Milvus는 다음을 통해 Prometheus와 원활하게 통합됩니다:
Prometheus Endpoint: 다양한 exporter에서 데이터를 수집합니다.
Prometheus Operator: Prometheus 모니터링 설정 관리를 간소화합니다.
Kube-Prometheus: 안정적인 운영을 위해 전체 Kubernetes 클러스터 모니터링을 단순화합니다.
Prometheus를 활용하면 쿼리 응답 시간 및 리소스 사용량(CPU, GPU, 메모리)과 같은 Milvus 성능의 핵심 메트릭을 추적할 수 있어, 사전 예방적 문제 해결과 시스템 최적화가 가능합니다. 또한 Prometheus를 Grafana와 통합하면 모니터링 프레임워크가 더욱 향상되어, GenAI 및 similarity search 애플리케이션에 맞춘 Milvus 배포의 심층 분석과 효율적인 유지 관리를 위한 상세한 대시보드를 제공합니다.
Milvus용 Prometheus 설정과 Grafana를 통한 메트릭 시각화에 대한 종합적인 안내는 아래 리소스를 살펴보세요:
결론
결론적으로, Prometheus는 시스템의 상태와 성능을 반영하는 다양한 메트릭을 모니터링하는 데 유용한 도구입니다. Prometheus의 기능을 사용하여 중요한 운영 데이터를 추적, 분석, 시각화함으로써 팀은 모니터링 관행을 개선하고 시스템이 안정적일 뿐만 아니라 효율성 측면에서도 최적화되도록 보장할 수 있습니다. 잠재적인 문제를 조기에 포착하기 위해 알림을 설정하든, 시스템 메트릭을 명확하게 보기 위해 상세한 대시보드를 사용하든, Prometheus는 개발자와 관리자가 고성능의 신뢰할 수 있는 서비스를 유지할 수 있도록 지원합니다.
FAQ
- Prometheus의 네 가지 메트릭 유형은 무엇인가요?
Prometheus는 메트릭을 counter, gauge, histogram, summary의 네 가지 유형으로 분류합니다. 각 유형은 이벤트 발생 횟수 계산부터 시간 경과에 따른 측정값 분포 캡처까지 특정 모니터링 목적을 수행합니다.
- histogram과 summary 중 무엇을 사용할지 어떻게 선택하나요?
분포를 캡처해야 하고 의미 있는 bucket을 미리 정의할 수 있을 때는 histogram을 선택하세요. 정확한 quantile 계산이 필요하고 사전 정의된 bucket이 필요하지 않을 때는 summary를 사용하세요. 선택은 특정 사용 사례와 성능 고려 사항에 따라 달라집니다.
- PromQL이란 무엇이며 Prometheus에서 어떻게 사용되나요?
PromQL, 즉 Prometheus Query Language는 Prometheus에서 메트릭을 쿼리하는 데 사용되는 강력한 언어입니다. 사용자는 이를 통해 시계열 데이터를 선택하고 집계하며, 특정 조건과 시간 범위를 기반으로 메트릭에서 계산을 수행하고 인사이트를 도출할 수 있습니다.
- 마이크로서비스 아키텍처로 구축되지 않은 애플리케이션도 Prometheus로 모니터링할 수 있나요?
예, Prometheus는 마이크로서비스 아키텍처를 사용해 구축되었든 더 전통적인 모놀리식 접근 방식으로 구축되었든 다양한 애플리케이션을 모니터링할 수 있을 만큼 다재다능합니다. Prometheus Exposition Format으로 데이터를 노출하는 거의 모든 소스에서 메트릭을 스크레이핑하도록 구성할 수 있습니다.
- Prometheus에서 메트릭에 레이블을 지정하고 그룹화할 때의 모범 사례에는 어떤 것이 있나요?
메트릭에 레이블을 지정하고 그룹화할 때는 레이블이 설명적이며 메트릭 전반에서 일관되도록 하세요. 성능을 저하시킬 수 있는 높은 카디널리티의 레이블은 피하세요. 명확성을 높이고 쿼리 효율성을 개선하기 위해 유형 또는 서비스별로 메트릭을 논리적으로 그룹화하세요. 이는 쿼리하고 관리하기 더 쉬운 체계적인 모니터링 시스템을 유지하는 데 도움이 됩니다.


