Kodeloka
  1. Kodeloka
  2. Kelas Prometheus
  3. Materi

Modul 10 · Modul 10 dari 15

Scrape Config, Service Discovery & Relabeling

Menemukan target secara otomatis, dan mengendalikan label serta metrik mana yang disimpan — kunci utama menjaga Prometheus tetap sehat.

Dari Static ke Service Discovery

Menulis daftar IP satu per satu hanya bertahan sampai infrastruktur Anda berubah otomatis. Prometheus menyediakan puluhan mekanisme service discovery.

MekanismeCocok untuk
static_configsServer tetap yang jumlahnya sedikit
file_sd_configsDaftar target dari berkas JSON/YAML — bisa digenerate skrip, tanpa reload
kubernetes_sd_configsKubernetes (pod, service, endpoints, node, ingress)
consul_sd_configsConsul service registry
dns_sd_configsDNS SRV/A record
ec2_sd_configs / gce_sd_configs / azure_sd_configsInstance cloud
docker_sd_configsContainer Docker di host

file_sd — Jalan Tengah yang Sangat Praktis

prometheus.ymlyaml
  - job_name: api
    file_sd_configs:
      - files: ["/etc/prometheus/targets/*.json"]
        refresh_interval: 30s
targets/api.jsonjson
[
  {
    "targets": ["10.0.1.5:8080", "10.0.1.6:8080"],
    "labels": { "lingkungan": "produksi", "tim": "checkout", "region": "jkt" }
  },
  {
    "targets": ["10.0.2.5:8080"],
    "labels": { "lingkungan": "staging", "tim": "checkout", "region": "jkt" }
  }
]
💡 Kelebihan file_sd

Prometheus memantau berkasnya dan memuat ulang otomatis — tanpa perlu reload konfigurasi. Berkas JSON-nya bisa digenerate oleh Ansible, Terraform, atau skrip cron sederhana. Ini pilihan terbaik untuk infrastruktur VM yang tidak memakai Kubernetes maupun Consul.

Kubernetes Service Discovery

k8s-sd.ymlyaml
  - job_name: kubernetes-pods
    kubernetes_sd_configs:
      - role: pod          # pod | service | endpoints | node | ingress
    relabel_configs:
      # 1. Hanya scrape pod yang punya anotasi prometheus.io/scrape=true
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: "true"

      # 2. Ambil path metrik dari anotasi (default /metrics)
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)

      # 3. Ambil port dari anotasi, gabungkan dengan IP pod
      - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
        action: replace
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
        target_label: __address__

      # 4. Salin label Kubernetes menjadi label Prometheus
      - source_labels: [__meta_kubernetes_namespace]
        target_label: namespace
      - source_labels: [__meta_kubernetes_pod_name]
        target_label: pod
      - source_labels: [__meta_kubernetes_pod_label_app]
        target_label: app

Relabeling — Alat Paling Kuat sekaligus Paling Membingungkan

Ada dua tahap relabeling, dan membedakannya itu penting:

TahapKapan berjalanUntuk apa
relabel_configsSebelum scrapeMemilih target mana yang di-scrape, mengubah alamat & label target
metric_relabel_configsSesudah scrape, sebelum disimpanMembuang metrik yang tidak perlu, memangkas label berkardinalitas tinggi

Action yang Tersedia

actionyaml
    # keep   : lanjutkan HANYA bila regex cocok
    - source_labels: [__meta_kubernetes_namespace]
      action: keep
      regex: "produksi|staging"

    # drop   : buang bila regex cocok
    - source_labels: [__name__]
      action: drop
      regex: "go_gc_duration_seconds.*"

    # replace: tulis nilai baru ke target_label  (aksi default)
    - source_labels: [__meta_kubernetes_pod_label_tim]
      target_label: tim
      action: replace

    # labeldrop / labelkeep : buang atau pertahankan LABEL (bukan metrik)
    - action: labeldrop
      regex: "id_container|pod_template_hash"

    # hashmod: membagi target ke beberapa Prometheus (sharding)
    - source_labels: [__address__]
      modulus: 4
      target_label: __tmp_shard
      action: hashmod
    - source_labels: [__tmp_shard]
      action: keep
      regex: "0"        # shard ini hanya menangani sisa bagi 0
⛔ metric_relabel_configs adalah rem darurat kardinalitas Anda

Ketika sebuah exporter mengekspos ribuan metrik yang tidak Anda butuhkan (cAdvisor dan kube-state-metrics terkenal boros), metric_relabel_configs adalah cara membuangnya sebelum masuk ke TSDB.

yaml
    metric_relabel_configs:
      # Buang metrik yang tidak pernah dipakai
      - source_labels: [__name__]
        action: drop
        regex: "container_(network_tcp|blkio|tasks_state).*"

      # Buang label berkardinalitas tinggi tapi PERTAHANKAN metriknya
      - action: labeldrop
        regex: "id|image_id|container_id"

Perubahan ini hanya berlaku untuk data baru. Data lama tetap ada sampai retensinya habis.

Membatasi Target yang Nakal

batasyaml
  - job_name: aplikasi-pihak-ketiga
    # Tolak target yang mengekspos terlalu banyak series -> lindungi Prometheus
    sample_limit: 20000
    label_limit: 30
    label_name_length_limit: 200
    label_value_length_limit: 500
    target_limit: 200
    static_configs:
      - targets: ["app:9090"]
⚠️ sample_limit menyelamatkan, tapi diam-diam

Bila target melewati batas, seluruh scrape-nya dibuang dan target ditandai gagal. Ini melindungi Prometheus, tetapi Anda kehilangan data tanpa peringatan jelas. Pasangkan dengan alert:

promql
up == 0 and on (job) (scrape_samples_scraped > 0)