배치 조작을 위한 메트릭 푸싱

배치 조작을 위한 메트릭 푸싱 (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)