Membangun mata infrastruktur: membedakan monitoring dan observability, mengumpulkan metrics dengan Prometheus, memvisualisasikannya di Grafana, mengelola logs terpusat, dan merancang alerting yang efektif tanpa alert fatigue

Setelah di episode 8 kita mengotomasi infrastruktur, kini saatnya membangun penglihatan: monitoring & observability. Infrastruktur yang dibangun tapi tidak dipantau adalah seperti mengemudikan pesawat tanpa instrumen — terbang boleh, tapi tidak tahu ketinggian, arah, atau bahan bakar.
Mengapa topik ini penting? Karena di produksi, kalian tidak akan menyadari banyak masalah sebelum user mengeluh — kecuali kalian punya sistem yang melihat lebih dulu. Episode ini membangun tumpukan observability standar industri: metrics (Prometheus), visualisasi (Grafana), logs terpusat, dan alerting yang tidak membuat kalian mati rasa karena terlalu banyak notifikasi.
Sering dianggap sama, padahal bedanya fundamental:
| Aspek | Monitoring | Observability |
|---|---|---|
| Pertanyaan | "Apakah sistem sehat?" | "Mengapa sistem tidak sehat?" |
| Data | Metrics yang sudah dikenal | Menjelajah data apa pun yang ada |
| Metode | Dashboards + alerts | Query ad-hoc, tracing, correlation |
| Fokus | Yang diketahui | Yang belum diketahui |
Praktiknya keduanya saling melengkapi: monitoring menjawab "kapan", observability menjawab "mengapa". Dasbor monitoring memberi tahu ada yang aneh; log dan trace terdistribusi menjelaskan penyebabnya.
Prometheus menarik metrics dari target melalui exporters dan menyimpannya sebagai time series. Pola pull-nya memudahkan penemuan target secara otomatis (service discovery).
global:
scrape_interval: 15s
scrape_configs:
- job_name: node
static_configs:
- targets:
- web-01.lab.local:9100
- web-02.lab.local:9100
- job_name: apache
static_configs:
- targets:
- web-01.lab.local:9117Target :9100 adalah node_exporter — exporter standar untuk metrics sistem (CPU, memory, disk, network). Setiap host Linux yang dimonitoring wajib menjalankannya.
wget https://github.com/prometheus/node_exporter/releases/latest/download/node_exporter-*-linux-amd64.tar.gz
tar xvf node_exporter-*.tar.gz
./node_exporter &
curl -s localhost:9100/metrics | headUntuk menyimpan metrics dari banyak target, gunakan prometheus.yml di atas lalu jalankan Prometheus:
docker run -d --name prometheus -p 9090:9090 \
-v "$PWD/prometheus.yml":/etc/prometheus/prometheus.yml \
prom/prometheusPromQL adalah bahasa query Prometheus. Contoh yang wajib dikuasai:
# Rata-rata pemakaian CPU host
100 - avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100
# Rata-rata memory terpakai
100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)
# Request rate per detik
sum(rate(http_requests_total[5m])) by (service)Grafana menampilkan data Prometheus dalam dasbor. Komponen dasbor yang baik:
| Komponen | Contoh |
|---|---|
| Time series | CPU/memory per host |
| Stat | Uptime, jumlah request |
| Gauge | Disk usage persen |
| Bar gauge | Health per service |
| Alert rule | Dipicu oleh query tertentu |
Praktik dasbor yang benar: jangan membuat satu dasbor raksasa. Buat dasbor berlapis — satu per layanan, satu untuk infrastruktur, satu untuk business metrics — dan setiap dasbor punya judul jelas serta annotasi saat deploy terjadi (agar spike bisa dikorelasikan dengan perubahan).
docker run -d --name grafana -p 3000:3000 \
-e GF_SECURITY_ADMIN_PASSWORD=admin123 \
grafana/grafanaBuka http://localhost:3000, tambahkan data source Prometheus, dan mulai buat dasbor pertama kalian.
journalctl per host tidak cukup untuk produksi — kalian butuh satu tempat untuk semua log. Tumpukan standar (misal ELK: Elasticsearch + Logstash + Kibana, atau alternatif modern Loki + Grafana):
scrape_configs:
- job_name: system
static_configs:
- targets: [localhost]
labels:
job: syslog
__path__: /var/log/*.logDengan logging terpusat, pencarian lintas host menjadi satu query:
{job="syslog"} |= "ERROR"
{app="api"} |= "timeout" | jsonNote
Jangan log semua hal tanpa berpikir. Log yang terlalu banyak membuat penyimpanan mahal dan pencarian lambat. Mulai dari: log error dengan stack trace, log autentikasi, dan log perubahan kritis. Sisanya bisa ditingkatkan bertahap.
Alerting adalah bagian yang paling sering gagal — bukan karena teknis, tapi karena desain. Dua kegagalan klasik: alert terlalu banyak (alert fatigue, semua diabaikan) dan alert terlalu sedikit (masalah ditemukan oleh user).
Prinsip alerting yang benar:
Contoh aturan alert yang baik di Prometheus:
groups:
- name: node.rules
rules:
- alert: HostDown
expr: up == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Host {{ $labels.instance }} mati"
- alert: HighDiskUsage
expr: (1 - node_filesystem_free_bytes / node_filesystem_size_bytes) * 100 > 90
for: 30m
labels:
severity: warning
annotations:
summary: "Disk {{ $labels.mountpoint }} di {{ $labels.instance }} di atas 90%"Perhatikan for: 30m — alert tidak langsung berbunyi; ia menunggu kondisi bertahan 30 menit untuk menghindari false positive dari spike sementara.
Pada episode 9 ini kalian telah membangun tumpukan observability:
Di episode 10 selanjutnya kita memastikan infrastruktur bisa selamat dari bencana: backup & disaster recovery — strategi backup, RPO/RTO, DR site, dan DR drill yang benar-benar diuji. Sampai jumpa di episode 10!