#!/bin/bash
# 실습 #19 ④ — 다중 타겟 + file_sd + relabel
# - static_configs : 손으로 적는 타겟
# - file_sd_configs: JSON/YAML 파일에서 동적 로드 (반영 30초)
# - relabel       : 타겟 라벨을 운영 표준으로 정리 (env / region / role)
set -e

DIR="$(cd "$(dirname "$0")" && pwd)"

# 1) file_sd 타겟 디렉터리
sudo mkdir -p /etc/prometheus/targets
sudo cp "$DIR/configs/04_targets_node.json" /etc/prometheus/targets/node.json
sudo cp "$DIR/configs/04_prometheus_multitarget.yml" /etc/prometheus/prometheus.yml
sudo chown -R prometheus:prometheus /etc/prometheus

# 2) 설정 문법 검증
echo "=== promtool check config ==="
sudo -u prometheus promtool check config /etc/prometheus/prometheus.yml

# 3) reload (sd_file_check_interval 보다 빠르게)
sudo systemctl reload prometheus 2>/dev/null || sudo systemctl restart prometheus
sleep 5

# 4) 검증 — targets API
echo
echo "=== /api/v1/targets/active (job 별 그룹) ==="
curl -s 'http://localhost:9090/api/v1/targets?state=active' | python3 -c "
import json, sys
d = json.load(sys.stdin)
for t in d['data']['activeTargets']:
    print(f\"  {t['labels'].get('job','-'):12s} {t['scrapeUrl']:<40s} {t['health']:7s} env={t['labels'].get('env','-')}\")
"

# 5) file_sd 동적 갱신 시연 — 새 타겟 한 줄 추가
echo
echo "=== file_sd 갱신 시연 ==="
TMPF=$(sudo mktemp /etc/prometheus/targets/node_extra.json)
sudo tee "$TMPF" >/dev/null <<'EOF'
[
  {
    "targets": ["127.0.0.1:9101"],
    "labels": {"env": "lab", "role": "extra", "region": "kr-cen-1"}
  }
]
EOF
sudo chown prometheus:prometheus "$TMPF"
echo "→ $TMPF 추가. 30초 이내 자동 반영. Down 으로 뜨는 게 정상 (실제 9101 안 떠 있어서)"
sleep 35

curl -s 'http://localhost:9090/api/v1/targets?state=any' | python3 -c "
import json, sys
d = json.load(sys.stdin)
for t in d['data']['activeTargets'] + d['data'].get('droppedTargets',[]):
    lbl = t.get('labels') or t.get('discoveredLabels',{})
    print(f\"  {lbl.get('job','-'):12s} {t.get('scrapeUrl', lbl.get('__address__','?')):<40s} {t.get('health','-'):7s}\")
"

# 6) 정리
sudo rm -f "$TMPF"
sudo systemctl reload prometheus 2>/dev/null || true

cat <<'EOF'

관전 포인트:
  - file_sd_configs: 파일만 수정해도 Prometheus 가 30초 안에 자동 감지
  - relabel_configs: instance 라벨을 "192.168.56.10:9100" → "node-01" 같이 정리
  - 운영 SD: Kubernetes / Consul / EC2 / DNS — 인프라가 곧 SD source
  - 라벨 표준: env (prod/stage/lab) · region · role · service
EOF
