Self-Hosted Observability Stack di DigitalOcean: Metrik, Log, dan Alert

Foto oleh Unsplash

Foto oleh Unsplash
Platform observabilitas komersial seperti Datadog, New Relic, dan Dynatrace memang unggul — dan mahal. Datadog dimulai dari $15 per host per bulan hanya untuk infrastructure monitoring, yang bertambah cepat ketika Anda mengelola lebih dari 10 server untuk proyek klien. Di Commsult Indonesia, saya mengganti pengeluaran observabilitas SaaS kami dengan stack self-hosted yang dibangun di atas Grafana, Prometheus, dan Loki. Seluruh stack berjalan di satu DigitalOcean Droplet $24/bulan (4 vCPU, 8GB RAM), memonitor lebih dari 15 server lintas beberapa klien, menyimpan 30 hari metrik dan log, serta mengirim alert ke Telegram. Panduan ini menunjukkan persis bagaimana cara membangunnya.
Framework observabilitas modern membedakan tiga jenis sinyal — metrik, log, dan trace — yang sering disebut tiga pilar observabilitas. Metrik adalah pengukuran numerik yang disampling dari waktu ke waktu: persentase CPU, jumlah request per detik, memori yang digunakan. Metrik kompak, efisien disimpan, dan ideal untuk alerting dan dashboard. Log adalah peristiwa teks berper waktu — output aplikasi, log akses nginx, journal sistem. Verbose namun esensial untuk men-debug insiden spesifik. Trace (rentang request lintas layanan) adalah pilar ketiga, penting untuk microservice tetapi berlebihan untuk sebagian besar deployment kecil. Panduan ini mencakup metrik dengan Prometheus dan log dengan Loki — kombinasi yang menutupi 90% kebutuhan observabilitas untuk proyek sampingan atau deployment klien kecil.
ELK stack (Elasticsearch, Logstash, Kibana) adalah pilihan tradisional untuk logging terpusat. Namun Elasticsearch rakus resource — membutuhkan minimal 4GB RAM untuk cluster kecil dan pengindeksan semua field secara default menciptakan write amplification yang signifikan. Loki mengambil pendekatan berbeda: menyimpan log sebagai chunk terkompresi yang diindeks hanya berdasarkan label (bukan konten log penuh), yang mengurangi penyimpanan hingga 10x dibanding Elasticsearch. Query log menggunakan LogQL (mirip PromQL) dan pencarian dilakukan berdasarkan label terlebih dahulu, kemudian regex atas chunk mentah. Untuk sebagian besar kasus penggunaan operasional — mencari error, mengkorelasikan peristiwa dengan lonjakan metrik — Loki lebih cepat dan jauh lebih murah untuk dijalankan.
Untuk monitoring stack yang mencakup 5-15 server, Droplet 4 vCPU / 8GB RAM ($24/bulan di region Singapura) menangani beban dengan nyaman. Prometheus menggunakan sekitar 1-3GB RAM tergantung pada jumlah time series dan periode retensi. Loki dengan retensi 30 hari dan 100MB/hari log ingestion menggunakan sekitar 2-4GB disk per hari (setelah kompresi). SSD 160GB di Droplet $24 menyimpan sekitar 40-80 hari log dan 90 hari metrik Prometheus sebelum Anda perlu memangkas atau menambah volume. Untuk deployment lebih besar, tambahkan Block Storage volume DigitalOcean dan mount di /var/lib/docker/volumes untuk penyimpanan persisten.
┌──────────────────────────────────────────────────────────────────┐
│ Full Observability Stack on DigitalOcean $24/mo │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Grafana (Port 3000) │ │
│ │ Unified dashboards + alerting UI │ │
│ └──────────┬──────────────────┬──────────────────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────┐ ┌─────────────────────────────────────┐ │
│ │ Prometheus │ │ Loki (log aggregation) │ │
│ │ (metrics TSDB) │ │ + Promtail (log shipper) │ │
│ │ Port: 9090 │ │ Port: 3100 │ │
│ └────────┬─────────┘ └───────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────────┐ │
│ │ Exporters (all on same Droplet or remote) │ │
│ │ Node Exporter :9100 │ cAdvisor :8080 │ │
│ │ App /metrics :3000 │ Blackbox :9115 │ │
│ └────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘Deploy monitoring stack di Droplet di region DigitalOcean yang sama dengan server aplikasi Anda dan gunakan private networking (VPC) untuk semua traffic scrape dan log-forwarding. Private networking gratis dan berarti traffic Prometheus dan Loki tidak pernah meninggalkan data center DigitalOcean, menghilangkan latensi dan biaya bandwidth sekaligus. Aktifkan private networking di Droplet saat Anda membuatnya — Anda tidak bisa menambahkannya setelah tanpa membuat ulang Droplet.
blog.posts.selfHostedObservability.content.section2Content
Di setiap server yang dimonitor, jalankan Promtail sebagai kontainer Docker dengan akses ke /var/log host dan Docker socket. Konfigurasi service discovery secara otomatis menemukan semua kontainer Docker yang berjalan dan memberi label stream log dengan nama kontainer — sehingga Anda tidak perlu mengonfigurasi path log setiap aplikasi secara manual. Untuk layanan systemd (nginx, postgresql, dll.), Promtail dapat membaca langsung dari systemd journal menggunakan konfigurasi `loki_push_api`. Ini memberi Anda tampilan log terpadu di layanan yang dikontainerisasi maupun tidak.
# Add Loki and Promtail to your docker-compose.yml
loki:
image: grafana/loki:2.9.6
container_name: loki
ports:
- "3100:3100"
volumes:
- ./loki-config.yml:/etc/loki/local-config.yaml
- loki_data:/loki
command: -config.file=/etc/loki/local-config.yaml
restart: unless-stopped
promtail:
image: grafana/promtail:2.9.6
container_name: promtail
volumes:
- /var/log:/var/log:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- ./promtail-config.yml:/etc/promtail/config.yml
command: -config.file=/etc/promtail/config.yml
restart: unless-stopped
# promtail-config.yml
# server:
# http_listen_port: 9080
# clients:
# - url: http://loki:3100/loki/api/v1/push
# scrape_configs:
# - job_name: system
# static_configs:
# - targets: [localhost]
# labels:
# job: varlogs
# __path__: /var/log/*.log
# - job_name: docker
# docker_sd_configs:
# - host: unix:///var/run/docker.sock
# relabel_configs:
# - source_labels: [__meta_docker_container_name]
# target_label: container
# Add Loki datasource to Grafana via API
curl -X POST http://admin:password@localhost:3000/api/datasources -H 'Content-Type: application/json' -d '{"name":"Loki","type":"loki","url":"http://loki:3100","access":"proxy"}'Atur dashboard Grafana Anda ke dalam folder: satu folder per klien atau lingkungan, dengan template dashboard standar untuk semua server (import Node Exporter Full — dashboard ID 1860) dan dashboard kustom per aplikasi. Untuk alerting, gunakan alerting bawaan Grafana (tersedia sejak Grafana 9) daripada instance Alertmanager terpisah. Buat aturan alert menggunakan PromQL dan LogQL dengan label severity berbeda — Critical untuk tindakan segera, Warning untuk perhatian hari kerja berikutnya. Rutekan alert Critical ke grup Telegram yang membangunkan seseorang; rutekan alert Warning ke saluran tidak mendesak atau email.
Konfigurasi default Loki menyimpan data di /loki di dalam kontainer, yang hilang saat kontainer dihapus. Selalu mount host volume atau named Docker volume di /loki untuk mempersistensikan data log. Juga, Loki menggunakan banyak file handle untuk penyimpanan chunk-nya — di Linux, default ulimit 1024 file terbuka tidak mencukupi. Atur `LimitNOFILE=65536` di layanan systemd Anda atau gunakan `ulimit -n 65536` sebelum memulai kontainer Loki. Tanpa ini, Loki diam-diam menjatuhkan chunk saat mencapai batas file handle, menyebabkan celah log.
Monitoring stack itu sendiri memerlukan perencanaan backup dan recovery. TSDB Prometheus dan penyimpanan chunk Loki ada di disk lokal Droplet — jika Droplet dihapus, Anda kehilangan data historis. Siapkan backup harian menggunakan backup Droplet otomatis DigitalOcean ($4,80/bulan untuk biaya tambahan 20% dari Droplet $24) atau gunakan restic dengan DigitalOcean Spaces sebagai backend backup. Backup Docker Compose files dan konfigurasi (prometheus.yml, promtail-config.yml, loki-config.yml) ke repositori Git. Setelah disaster recovery, Anda dapat membangun ulang monitoring stack dalam waktu kurang dari 30 menit dengan konfigurasi yang di-backup.
Setup satu Droplet berkembang dengan baik hingga 50+ host yang dimonitor. Ketika Anda perlu melampaui itu — atau menginginkan retensi metrik jangka panjang di atas 90 hari — integrasikan Grafana Mimir (Prometheus yang skalabel secara horizontal) atau Thanos dengan DigitalOcean Spaces (atau GCP Cloud Storage) sebagai backend penyimpanan jangka panjang. Untuk penyimpanan log dalam skala besar, Loki mendukung mode terdistribusi dengan komponen querier dan ingester yang terpisah. Namun untuk sebagian besar deployment kecil dan menengah, setup satu Droplet adalah jawaban yang tepat: sederhana, murah, dan transparan secara operasional.