Dari Static ke Service Discovery
Menulis daftar IP satu per satu hanya bertahan sampai infrastruktur Anda berubah otomatis. Prometheus menyediakan puluhan mekanisme service discovery.
| Mekanisme | Cocok untuk |
|---|---|
static_configs | Server tetap yang jumlahnya sedikit |
file_sd_configs | Daftar target dari berkas JSON/YAML — bisa digenerate skrip, tanpa reload |
kubernetes_sd_configs | Kubernetes (pod, service, endpoints, node, ingress) |
consul_sd_configs | Consul service registry |
dns_sd_configs | DNS SRV/A record |
ec2_sd_configs / gce_sd_configs / azure_sd_configs | Instance cloud |
docker_sd_configs | Container Docker di host |
file_sd — Jalan Tengah yang Sangat Praktis
- job_name: api
file_sd_configs:
- files: ["/etc/prometheus/targets/*.json"]
refresh_interval: 30s[
{
"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" }
}
]file_sdPrometheus 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
- 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: appRelabeling — Alat Paling Kuat sekaligus Paling Membingungkan
Ada dua tahap relabeling, dan membedakannya itu penting:
| Tahap | Kapan berjalan | Untuk apa |
|---|---|---|
relabel_configs | Sebelum scrape | Memilih target mana yang di-scrape, mengubah alamat & label target |
metric_relabel_configs | Sesudah scrape, sebelum disimpan | Membuang metrik yang tidak perlu, memangkas label berkardinalitas tinggi |
Action yang Tersedia
# 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 0metric_relabel_configs adalah rem darurat kardinalitas AndaKetika 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.
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
- 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-diamBila target melewati batas, seluruh scrape-nya dibuang dan target ditandai gagal. Ini melindungi Prometheus, tetapi Anda kehilangan data tanpa peringatan jelas. Pasangkan dengan alert:
up == 0 and on (job) (scrape_samples_scraped > 0)