1. Push Gateway 의 동작 원리와 역할
Prometheus 의 기본 수집 방식은 클라이언트로부터 직접 데이터를 요청하는 Pull 방식입니다. 하지만 배치 처리나 짧은 수명의 컨테이너와 같은 경우, 스캐퍼가 접속할 수 있는 지속적인 타겟이 존재하지 않을 수 있습니다. 이때 사용하는 것이 PushGateway입니다.
이는 외부 시스템이 메트릭을 주입할 수 있는 API 엔드포인트를 제공하는 중간 계층 역할을 수행합니다. 데이터 생산자가 정보를 여기로 보내면, PushGateway 는 이를 임시 저장소에 보관하며 Prometheus 서버의 다음 스캐프 주기까지 대기합니다. 자체적으로 수집 기능을 갖지 않고纯粹的으로 전달 및 보관 중개자로서 작동합니다.
# 주요 실행 옵션 설명
--web.listen-address=:9091 # 수신 포트 지정 (기본값 9091)
--persistence.file=/var/lib/pushgateway/data.db # 중단 시 데이터 복구용 DB 파일 경로
--max-connections=1000 # 동시 연결 제한 설정
2. 이진 파일 배포 및 실행
Docker 나 Kubernetes 환경도 지원되지만, 디버깅과 빠른 테스트를 위해 네이티브 바이너리를 설치하여 구성하는 과정을 먼저 살펴봅니다.
# 최신 릴리스 패키지 다운로드
curl -sL https://github.com/prometheus/pushgateway/releases/latest/download/pushgateway-v1.6.0.linux-amd64.tar.gz -o pg_archive.tar.gz
# 압축 해제 및 이동
tar xzvf pg_archive.tar.gz
mv pushgateway-1.6.0.linux-amd64 /opt/tools/push-gw
cd /opt/tools/push-gw
# 데몬 모드 없이 직접 실행 확인 후 백그라운드로 전환
./pushgateway &
# 포트 바인딩 상태 확인
ss -tulnp | grep 9091
기본 설정으로는 메모리 상에 데이터가 유지되므로 서비스 재시동 시 정보가 손실될 수 있습니다. 영구적인 보관이 필요하다면 위 옵션에 파일 경로를 명시해야 합니다.
3. Prometheus 본체 연동 설정
데이터가 PushGateway 에 들어온 이후에는 Prometheus 가 해당 주소를 정기적으로 조회하도록 설정해야 합니다. prometheus.yml 파일에 다음과 같은 스크랩 잡을 추가합니다.
scrape_configs:
- job_name: 'external_push_targets'
static_configs:
- targets: ['10.0.0.50:9091'] # Gateway 호스트 주소
honor_labels: true # 푸시 시 포함된 라벨 정보 보호
변경 사항을 적용하기 위해 재시작 없이 리로드 신호를 보낼 수 있습니다.
curl -X POST http://localhost:9090/-/reload
4. 클라이언트 측 메트릭 전송 예제
사용자는 표준 포맷의 텍스트 데이터를 생성하여 HTTP POST 방식으로 전송하면 됩니다. URL 경로에는 JOB 이름과 인스턴스 식별자를 포함하여 데이터를 분류합니다.
단일 지표 전송
특정 상태 값을 한 번만 보내는 경우입니다.
# 값: 150ms 지연 시간, Metric: http_req_duration_ms
printf "http_req_duration_ms 0.15\n" \
| curl -X POST --data-binary @- http://10.0.0.50:9091/metrics/job/backend_api/instance/api-server-01
이 과정에서 Gateway 는 자동으로 push_timestamp 와 같은 보조 메트릭을 생성하여 데이터의 신선도를 나타냅니다.
다중 지표 묶음 전송
여러 개의 메트릭을 하나의 요청으로 패키징할 수도 있습니다.
cat <<EOF | curl -X POST --data-binary @- http://10.0.0.50:9091/metrics/job/batch_proc/instance/node-alpha
#TYPE cpu_system_pct gauge
cpu_system_pct 12.5
#TYPE disk_free_gb gauge
disk_free_gb 45.2
EOF
자동화 모니터링 스크립트
시스템 리소스를定期检查하여 전송하는 Shell 스크립트의 예를 보여줍니다. 기존 메모리 중심 로직을 CPU 부하 체크로 변경하고 변수명을 완전히 교차하였습니다.
#!/bin/bash
# load_balancer_watcher.sh
# 1분 평균 부하 획득
load_avg=$(awk '{print $1}' /proc/loadavg)
# 현재 시스템 시간 획득
ts_epoch=$(date +%s)
# 목표 설정
gw_host="http://172.16.0.10:9091"
job_tag="system_health_check"
inst_id=$(hostname -i | awk '{print $1}')
# 메트릭 형식 작성 및 전송
payload=$(cat <<EODATA
#TYPE sys_load_1min gauge
sys_load_1min $load_avg
#TIME collection_epoch_seconds $ts_epoch
EODATA
)
curl -X POST --data-binary "$payload" "${gw_host}/metrics/job/${job_tag}/instance/${inst_id}"
5. 메트릭 데이터 제거 관리
임시적으로 올라간 데이터를 정리하거나 오류 데이터 발생 시 삭제할 수 있습니다.
# 특정 Job 및 인스턴스 라벨 조합에 해당하는 메트릭 전체 삭제
curl -X DELETE http://10.0.0.50:9091/metrics/job/batch_proc/instance/node-alpha
위와 같이 RESTful 방식을 통해 원하는 범위의 데이터를 무효화할 수 있으며, 웹 UI 를 통째로 다시 초기화하지 않아도 국부적인 정리가 가능합니다.