배치 조작을 위한 메트릭 푸싱
배치 조작을 위한 메트릭 푸싱 (Pushing metrics)
이 문서는 Prometheus에 메트릭을 "밀어 넣는"(push) 방식인 Pushgateway를 설명해요. Prometheus는 기본적으로 풀(pull) 방식으로 메트릭을 수집하지만, 수명이 짧은 배치 작업(batch job)이나 직접 스크레이프할 수 없는 작업은 메트릭을 Pushgateway로 푸시하고, Prometheus가 Pushgateway를 스크레이프하는 패턴을 사용합니다.
Pushgateway는 일괄 작업이 끝날 때 메트릭을 보내고, 그 메트릭을 시간이 지나도 유지해 Prometheus가 계속 스크레이프할 수 있게 해줍니다. PUSH의 사용 사례와 주의점, 그리고 각 언어 클라이언트에서 푸시하는 방법을 정리해요.
출처: 문서
본문
풀 방식이 기본
Prometheus의 기본 설계는 풀(pull) 방식입니다. Prometheus가 각 엑스포터의 /metrics를 주기적으로 스크레이프합니다. 이 방식은 대부분의 상시 실행(long-running) 서비스에 적합합니다.
언제 푸시를 쓸까
다음 같은 경우 메트릭을 푸시하는 것이 적합합니다:
- 수명이 짧은 배치 작업 — 작업이 실행되는 동안에만 존재하므로 Prometheus가 스크레이프할 시간에 접근할 수 없음.
- 네트워크 경계 너머 — 방화벽 등으로 Prometheus가 직접 접근할 수 없는 대상.
이때 작업은 종료 시점에 메트릭을 Pushgateway로 푸시하고, Prometheus는 Pushgateway를 스크레이프합니다.
작동 방식
배치 작업 --push--> Pushgateway <--scrape-- Prometheus
Pushgateway는 푸시된 메트릭을 저장해 두고, Prometheus가 정기적으로 스크레이프해 갑니다.
클라이언트에서 푸시하기
대부분의 공식 클라이언트 라이브러리가 Pushgateway 푸시를 지원합니다.
Go:
import "github.com/prometheus/client_golang/prometheus/push"
pusher := push.New("http://pushgateway:9091", "my_batch_job").
Collector(myMetric).
Grouping("instance", "hostname")
err := pusher.Add()
if err != nil { panic(err) }
Python:
from prometheus_client import CollectorRegistry, Gauge, push_to_gateway
registry = CollectorRegistry()
g = Gauge('job_last_success_unixtime', 'Last time a batch job successfully finished', registry=registry)
g.set_to_current_time()
push_to_gateway('localhost:9091', job='batch_job', registry=registry)
주의점
- pushgateway는 배치 작업의 수명이 끝나도 메트릭을 유지하므로, 각 실행에서 그룹화 라벨(예:
instance)을 고정해 실행 간 메트릭이 덮어쓰이거나 남지 않도록 해야 합니다. - 푸시된 메트릭에는
push_gateway가 아닌 원래 작업의job라벨이 붙습니다. - Pushgateway 자체는 스크레이프 대상이므로 Prometheus에 등록해야 합니다.
더 알아보기 (Learn more)
- Pushgateway 리포지토리 — 설치와 실행 방법
- Go 클라이언트 푸시 —
push패키지 문서 - Python 클라이언트 푸시 —
push_to_gateway함수 - 엑스포저 작성 가이드 — 풀 방식 엑스포저 만들기