Python에서 Prometheus를 사용한 모니터링 및 Prometheus 작동 방식
Takashi Yamamoto
Infrastructure Engineer · Leapcell

Prometheus 데이터 유형 및 원리
1. 서론
Prometheus는 원래 SoundCloud에서 개발된 오픈 소스 시스템 모니터링 및 알림 툴킷입니다. Prometheus의 핵심 구성 요소는 모니터링되는 메트릭을 나타내는 데 사용되는 다양한 데이터 유형을 정의하는 데이터 모델입니다. 이러한 데이터 유형을 이해하는 것은 Prometheus를 사용하여 모니터링 데이터를 효과적으로 수집, 저장 및 쿼리하는 데 필수적입니다. 이 문서에서는 Prometheus 데이터 유형을 자세히 살펴보고 Python 코드 예제를 제공하여 사용법을 설명하고 시간 경과에 따른 변화(1분 및 5분 이내)를 분석하고 기본 변경 원리를 설명하고 마지막으로 영어 bash box 다이어그램을 사용하여 Prometheus 순서도를 제시합니다.
2. Prometheus 데이터 유형
2.1 Counter
Prometheus의 Counter는 단일 숫자 값을 나타내는 누적 메트릭으로, 증가만 합니다. 일반적으로 제공된 요청 수, 완료된 작업 수 또는 발생한 오류 수와 같은 이벤트를 계산하는 데 사용됩니다.
Python 코드 예제
from prometheus_client import Counter # 카운터 메트릭 생성 request_counter = Counter('http_requests_total', '총 HTTP 요청 수') # 일부 HTTP 요청 시뮬레이션 for _ in range(10): request_counter.inc() print(request_counter._value.get())
설명:
prometheus_client
라이브러리에서Counter
클래스를 가져옵니다.- 도움말 문자열과 함께
http_requests_total
이라는 카운터를 만듭니다. - 카운터를 증가시켜 10개의 HTTP 요청을 시뮬레이션합니다.
- 현재 카운터 값을 인쇄합니다.
시간 경과에 따른 데이터 변경
- 1분: 웹 서버가 분당 10개의 요청을 받는다고 가정합니다. 초기 카운터 값이 50이면 1분 후에 60으로 증가합니다.
- 5분: 분당 10개의 일정한 속도로 카운터는 5분 동안 50씩 증가하여 초기 값 50에서 100에 도달합니다.
변경 원리: 카운터는 추적된 이벤트가 발생할 때마다 1씩 증가합니다. Prometheus는 시간 경과에 따른 누적 합계를 저장하며 값은 자연적으로 감소하지 않으므로 장기적인 이벤트 추세를 추적하는 데 이상적입니다.
2.2 Gauge
Gauge는 임의로 증가하거나 감소할 수 있는 단일 숫자 값을 나타내는 메트릭입니다. 온도, 메모리 사용량 또는 동시 연결과 같은 값을 측정하는 데 사용됩니다.
Python 코드 예제
from prometheus_client import Gauge # 게이지 메트릭 생성 memory_usage_gauge = Gauge('memory_usage_bytes', '메모리 사용량(바이트)') # 메모리 사용량 변경 시뮬레이션 memory_usage_gauge.set(1024) memory_usage_gauge.inc(512) memory_usage_gauge.dec(256) print(memory_usage_gauge._value.get())
설명:
Gauge
클래스를 가져오고memory_usage_bytes
라는 게이지를 만듭니다.- 초기 값을 1024바이트로 설정하고 512씩 증가시키고 256씩 감소시킵니다.
- 최종 게이지 값(1280바이트)을 인쇄합니다.
시간 경과에 따른 데이터 변경
- 1분: 메모리 사용량은 빠르게 변동될 수 있습니다. 예를 들어 초기 값이 1024바이트이고 프로세스가 추가로 300바이트를 소비하면 게이지가 1324바이트로 상승합니다. 프로세스가 100바이트를 해제하면 1224바이트로 떨어집니다.
- 5분: 값은 여러 번 변경될 수 있습니다(예: 5분 동안 1024 → 1324 → 1200 → 1500 → 1400 → 1600바이트).
변경 원리: 게이지는 명시적으로 설정, 증가 또는 감소될 수 있습니다. Prometheus는 각 샘플링 간격으로 현재 값을 기록하여 모니터링되는 엔터티의 실시간 상태를 반영합니다.
2.3 Histogram
Histogram은 관찰 값(예: 요청 기간 또는 응답 크기)을 샘플링하고 구성 가능한 버킷에서 계산하는 동시에 모든 값의 합계를 제공합니다.
Python 코드 예제
from prometheus_client import Histogram import random # 지정된 버킷으로 히스토그램 메트릭 생성 request_duration_histogram = Histogram( 'http_request_duration_seconds', 'HTTP 요청 기간(초)', buckets=(0.1, 0.2, 0.3, 0.4, 0.5) ) # 20개의 요청 기간 시뮬레이션 for _ in range(20): duration = random.uniform(0, 0.6) request_duration_histogram.observe(duration) # 결과 인쇄 print(f"Sum: {request_duration_histogram._sum.get()}") print(f"Count: {request_duration_histogram._count.get()}") for bucket, count in request_duration_histogram._buckets.items(): print(f"Bucket {bucket}: {count.get()}")
설명:
- 0.1~0.5초의 버킷으로 히스토그램을 정의합니다.
- 20개의 요청 기간을 시뮬레이션하고
observe()
를 사용하여 기록합니다. - 총 합계, 개수 및 버킷 분포를 인쇄합니다.
시간 경과에 따른 데이터 변경
- 1분: 새로운 관찰(예: 1분 동안 25개의 요청)은 개수와 합계를 늘리고 실제 기간에 따라 버킷 개수가 업데이트됩니다.
- 5분: 누적된 관찰은 더 큰 개수와 합계로 이어지고 더 긴 기간의 요청이 발생하면 버킷 분포가 변경됩니다.
변경 원리: 각 관찰은 버킷에 할당되고 합계가 업데이트됩니다. 히스토그램은 시간 경과에 따라 데이터 분포를 구축하여 값 범위와 크기를 분석할 수 있습니다.
2.4 Summary
Summary는 고정 버킷을 사용하는 히스토그램과 달리 데이터 분포를 요약하기 위해 관찰 값을 샘플링하고 분위수(예: 중앙값, 90번째 백분위수)를 계산합니다.
Python 코드 예제
from prometheus_client import Summary # 엔드포인트에 대한 레이블이 있는 요약 생성 response_size_summary = Summary( 'http_response_size_bytes', 'HTTP 응답 크기(바이트)', labelnames=['endpoint'] ) # 다른 엔드포인트에 대한 관찰 기록 response_size_summary.labels(endpoint='/api/v1/users').observe(1024) response_size_summary.labels(endpoint='/api/v1/posts').observe(2048) # 결과 인쇄 print(f"Sum: {response_size_summary._sum.get()}") print(f"Count: {response_size_summary._count.get()}") for quantile, sum_val in response_size_summary._quantile_sum.items(): print(f"Quantile {quantile}: {sum_val.get()}")
설명:
- API 경로를 구별하기 위해
endpoint
레이블이 있는 요약을 만듭니다. - 두 엔드포인트에 대한 응답 크기를 기록하고 합계, 개수 및 분위수 데이터를 인쇄합니다.
시간 경과에 따른 데이터 변경
- 1분: 새로운 요청은 개수, 합계 및 분위수를 업데이트합니다. 예를 들어 더 큰 응답은 90번째 백분위수 값을 늘릴 수 있습니다.
- 5분: 누적된 데이터는 분위수 정확도를 향상시키고 개수와 합계가 증가하고 분포는 장기 추세를 반영합니다.
변경 원리: 관찰은 실행 합계, 개수 및 분위수 계산(이동 창과 같은 알고리즘 사용)을 업데이트합니다. 분위수는 최신 데이터 분포를 반영하기 위해 동적으로 조정됩니다.
3. Prometheus 순서도(영어 Bash Box 다이어그램)
+-------------------+
| Prometheus Server |
+-------------------+
| |
| Data Collection |
| (Pull Model) |
| |
| Targets |<---+
| (Exporters) | |
| | |
+-------------------+ |
|
+-------------------+
| Exporter |
| (e.g., Node |
| Exporter) |
+-------------------+ |
|
| Metrics | |
| (Counter, Gauge, |
| Histogram, |
| Summary) | |
+-------------------+ |
|
| Push Metrics |<---+
| to Prometheus |
+-------------------+
| |
| Data Storage |
| (TSDB - Time - |
| Series Database) |
| |
+-------------------+
| |
| Querying |
| (PromQL) |
| |
+-------------------+
| |
| Visualization |
| (e.g., Grafana) |
| |
+-------------------+
순서도 설명:
- Prometheus Server는 풀 기반 모델을 사용하여 대상(exporter)에서 메트릭을 가져옵니다.
- Exporter(예: Node Exporter)는 시스템에서 메트릭을 수집하고 Prometheus 호환 형식으로 노출합니다.
- 메트릭(Counter, Gauge, Histogram, Summary)은 Prometheus Server로 푸시됩니다.
- 서버는 메트릭을 시계열 데이터베이스(TSDB)에 저장합니다.
- 사용자는 PromQL을 사용하여 메트릭을 쿼리합니다.
- 쿼리된 데이터는 Grafana와 같은 도구를 통해 시각화됩니다.
4. 결론
Prometheus 데이터 유형을 이해하는 것은 효과적인 시스템 모니터링에 매우 중요합니다.
- Counter는 누적 이벤트를 추적합니다.
- Gauge는 변동하는 값을 모니터링합니다.
- Histogram은 버킷에서 데이터 분포를 분석합니다.
- Summary는 분위수 기반 통찰력을 제공합니다.
Python 예제는 구현 및 시간적 변화를 보여주고 순서도는 수집에서 시각화까지 Prometheus의 데이터 흐름을 간략하게 설명합니다. 이 지식을 통해 사용자는 Prometheus를 활용하여 시스템을 효율적으로 모니터링하고 관리할 수 있습니다.
Leapcell: 최고의 서버리스 웹 호스팅
Leapcell은 Python 서비스를 배포하기 위한 이상적인 플랫폼입니다.
🚀 좋아하는 언어로 빌드
JavaScript, Python, Go 또는 Rust로 간편하게 개발하십시오.
🌍 무료로 무제한 프로젝트 배포
리소스 사용량에 대해서만 지불하십시오. 요청이나 요금은 없습니다.
⚡ 사용한 만큼 지불, 숨겨진 비용 없음
유휴 요금 없이 원활한 확장성만 제공됩니다.
📖 문서 탐색 🔹 Twitter에서 팔로우하세요: @LeapcellHQ