Membangun observability dasar untuk server: mengumpulkan metrik dengan Prometheus dan Grafana, mengelola log dengan syslog dan ELK, serta menyusun alerting agar masalah terdeteksi sebelum pengguna mengeluh

Sejauh ini kita membangun dan mengotomasi sistem. Tapi ada pertanyaan yang belum terjawab: bagaimana kalian tahu sistem masih sehat? Episode 10 ini menjawabnya dengan dua pilar observability: monitoring (metrik) dan logging. Tanpa keduanya, System Engineer bekerja buta — baru tahu server down saat pengguna komplain.
Mengapa episode ini penting? Karena insiden terbaik adalah yang tidak pernah terjadi. Monitoring yang baik mendeteksi disk yang menipis, CPU yang meninggi, atau error rate yang naik sebelum menjadi kerusakan. Logging yang baik membuat kalian bisa menelusuri apa yang terjadi setelah sebuah kegagalan. Dua-duanya adalah mata dan telinga kalian di seluruh server.
Prometheus adalah sistem monitoring yang menarik (scrape) metrik dari target secara berkala. Arsitekturnya:
Langkah paling dasar: pasang node_exporter di server yang dipantau.
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar xzf node_exporter-1.8.2.linux-amd64.tar.gz
sudo mv node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/
node_exporter --versionDefinisikan target di konfigurasi Prometheus:
global:
scrape_interval: 15s
scrape_configs:
- job_name: node
static_configs:
- targets: ["localhost:9100", "10.0.1.11:9100", "10.0.1.12:9100"]PromQL adalah bahasa query Prometheus. Beberapa query yang paling sering dipakai:
# CPU usage per host
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# Pemakaian disk per filesystem
100 * (1 - node_filesystem_avail_bytes / node_filesystem_size_bytes)
# Memori yang dipakai (tanpa cache)
node_memory_MemTotal_bytes - node_memory_MemAvailable_bytesMetrik tanpa alert tidak berguna. Definisi alert di Prometheus menggunakan rules:
groups:
- name: host
rules:
- alert: HostDown
expr: up == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Host {{ $labels.instance }} tidak merespons"
- alert: DiskAlmostFull
expr: 100 * (1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) > 90
for: 5m
labels:
severity: warning
annotations:
summary: "Disk {{ $labels.mountpoint }} di {{ $labels.instance }} hampir penuh"Field for: 5m membuat alert hanya terpicu jika kondisi bertahan 5 menit — mencegah notifikasi karena lonjakan sesaat. Alertmanager kemudian meneruskannya ke email, Slack, atau webhook.
Important
Aturan alerting yang sehat: jarang tapi berarti. Jika tim menerima 20 alert per hari dan semuanya palsu, mereka berhenti membaca notifikasi (alert fatigue) — lalu insiden nyata terlewat. Mulailah dari beberapa alert penting (host down, disk penuh, service mati) dan perluas bertahap.
Setiap service menghasilkan log. Di Linux modern, log berpusat di journald dan bisa diteruskan ke syslog tradisional:
journalctl --since "1 hour ago"
journalctl -u nginx -p err
logger "test pesan dari admin" -t checkUntuk data center, log harus dikumpulkan terpusat agar bisa dicari. ELK (Elasticsearch, Logstash, Kibana) atau variannya (Loki, Grafana) adalah standar:
Alternatif ringan: Loki + Grafana (mengandalkan label, bukan index penuh). Untuk System Engineer yang sudah pakai Prometheus, Loki adalah pilihan natural karena dashbordnya satu tempat di Grafana.
Log yang tidak di-rotate akan memenuhi disk. logrotate menangani ini:
/srv/app/logs/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
}File di atas: rotate harian, simpan 14 hari, kompresi, tanpa mengganggu jika kosong.
Skenario: pantau dua server dengan Prometheus + Grafana.
# 1. Install Prometheus (unduh binary, buat unit systemd)
sudo useradd -r -s /usr/sbin/nologin prometheus
# ... letakkan binary & konfigurasi, buat unit, lalu:
sudo systemctl enable --now prometheus
# 2. Pasang node_exporter di tiap target
sudo systemctl enable --now node_exporter
# 3. Cek scrape berjalan
curl http://localhost:9090/api/v1/targets | jq .data.activeTargets[].scrapeUrl
# 4. Hubungkan Grafana sebagai datasource + buat dashboard
# http://localhost:3000 -> Add data source -> PrometheusGrafana memiliki dashboard siap pakai (ID 1860 untuk node_exporter) — import sekali, semua host langsung terlihat.
for — notifikasi badai karena lonjakan sesaat.Inti yang harus dibawa pulang:
for agar tidak berisik.Di episode 11 selanjutnya kita memastikan data tetap aman: backup & restore — strategi, verifikasi, dan drill pemulihan. Sampai jumpa di episode 11!