본문으로 건너뛰기

4.1 Scrape와 Target

Prometheus는 등록된 target 목록을 기준으로 exporter를 scrape합니다. Static target은 lab에 적합하고, instance가 자주 바뀌는 Kubernetes에서는 service discovery나 ServiceMonitor를 사용합니다.

Static configuration​

scrape_configs:
- job_name: postgres
scrape_interval: 15s
scrape_timeout: 10s
static_configs:
- targets:
- db-a-exporter.internal:9187
- db-b-exporter.internal:9187
labels:
environment: prod
cluster: orders

scrape_interval보다 scrape_timeout을 짧게 둡니다. 한 번의 수집이 다음 주기까지 겹치지 않게 하고, exporter와 database에 느린 connection이 쌓이는 것을 막습니다.

Target label 정규화​

기본 instance는 scrape 주소입니다. Exporter 주소와 실제 database 정체성이 다르면 relabeling으로 읽기 쉬운 label을 만듭니다.

relabel_configs:
- source_labels: [__address__]
regex: db-a-exporter\.internal:9187
target_label: instance
replacement: db-a:5432

Label은 dashboard 편의를 넘어 alert routing과 장기 비교의 key가 됩니다. Host 교체 때도 같은 cluster 이름을 유지하고, 실제 instance는 별도 label로 남기는 방식을 고려합니다.

Kubernetes ServiceMonitor​

Prometheus Operator 환경에서는 ServiceMonitor가 scrape 설정을 선언합니다.

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: postgres-exporter
namespace: monitoring
spec:
namespaceSelector:
matchNames: [database]
selector:
matchLabels:
app: postgres-exporter
endpoints:
- port: metrics
path: /metrics
interval: 30s
scrapeTimeout: 10s

ServiceMonitor가 존재해도 Prometheus custom resource의 serviceMonitorSelector가 이를 선택하지 않으면 target에 들어오지 않습니다. 문제를 볼 때는 Service, Endpoints, ServiceMonitor, Prometheus selector 순서로 확인합니다.

up과 scrape 내부 metric​

Prometheus는 target마다 자체 metric을 만듭니다.

up{job="postgres"}
scrape_duration_seconds{job="postgres"}
scrape_samples_scraped{job="postgres"}
scrape_samples_post_metric_relabeling{job="postgres"}

scrape_duration_seconds가 timeout에 가까워지면 collector query나 database 응답이 느린 상태입니다. 새 collector를 활성화한 전후의 duration과 sample 수를 비교하면 비용을 수치로 확인할 수 있습니다.

Metric relabeling​

불필요한 series는 저장 전에 제거합니다. 다만 drop 규칙은 데이터 손실이므로 사용 query와 alert를 먼저 검색합니다.

metric_relabel_configs:
- source_labels: [__name__]
regex: 'go_.*'
action: drop

Exporter process metric을 모두 지우면 memory leak이나 GC 문제를 진단할 증거도 사라집니다. 저장 비용과 진단 가치 사이에서 결정합니다.

Target 장애 진단 순서​

  1. Prometheus /targets의 Last Error 확인
  2. Prometheus host 또는 Pod에서 exporter URL 호출
  3. Exporter log와 pg_up 확인
  4. Exporter에서 PostgreSQL DNS/TCP/TLS/인증 확인
  5. Collector query 시간과 database lock 확인

Prometheus target 오류에서 collector query까지 좁혀 가는 장애 진단 순서

Prometheus server에서 접근 가능한 경로와 로컬 노트북에서 접근 가능한 경로는 다를 수 있습니다. 반드시 scrape 주체의 network 위치에서 확인합니다.

참고: Prometheus configuration, Prometheus Operator ServiceMonitor