Monitoring Container dengan Prometheus dan Grafana: Dashboard Real-Time untuk Docker
Aplikasi yang berjalan dalam container Docker memerlukan visibility terhadap performance dan health status. Tanpa monitoring system, kita tidak dapat mendeteksi masalah seperti high memory usage, CPU throttling, atau container crash secara proaktif. Prometheus adalah time-series database yang dirancang khusus untuk metrics collection. Grafana adalah visualization platform yang mengubah raw metrics menjadi dashboard interaktif. Kombinasi keduanya membentuk observability stack yang powerful untuk container environment.
Memahami Arsitektur Monitoring dengan Prometheus dan Grafana
Prometheus bekerja dengan model pull-based scraping. Prometheus server secara berkala mengambil metrics dari endpoint HTTP yang diekspos oleh target. Data metrics disimpan dalam time-series format dengan timestamp dan label sets. Grafana kemudian membaca data dari Prometheus melalui query language dan merendernya sebagai grafik, gauge, atau tabel visual.
Komponen utama dalam arsitektur ini meliputi Prometheus server untuk scraping dan storage, Node Exporter atau cAdvisor untuk mengumpulkan system-level metrics, Grafana untuk visualisasi dan dashboard, serta Alertmanager untuk routing notifikasi. Model pull-based memberikan keuntungan tambahan karena kita dapat mengetahui apakah target benar-benar down berdasarkan kegagalan scraping. Setiap metrics memiliki label yang memungkinkan filtering dan grouping yang fleksibel.
Mengapa Container Docker Perlu Dimonitoring
Container bersifat ephemeral. Container dapat dihapus, di-restart, atau di-scale dalam hitungan detik. Traditional monitoring tools sering kali tidak dapat menangkap metrics dari container lifecycle yang singkat.
Challenges yang kita hadapi meliputi resource contention antar container dalam satu host, network latency antar service dalam microservices architecture, disk I/O bottleneck yang mempengaruhi database performance, serta memory leaks yang menyebabkan Out-Of-Memory (OOM) kills. Selain itu, dalam orchestrated environment seperti Docker Swarm atau Kubernetes, container dapat berpindah antar node secara dinamis.
Dengan monitoring yang tepat, kita dapat mengidentifikasi bottleneck sebelum user merasakan impact. Metrics historis juga memungkinkan capacity planning berdasarkan pola traffic yang terukur. Data yang terkumpul dapat digunakan untuk root cause analysis ketika incident terjadi.
Menyiapkan Docker Compose untuk Stack Monitoring
Kita akan men-deploy seluruh monitoring stack menggunakan Docker Compose. Pendekatan ini memastikan consistency dan memudahkan reproducibility di berbagai environment.
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
networks:
- monitoring
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
volumes:
- grafana-data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
depends_on:
- prometheus
networks:
- monitoring
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
networks:
- monitoring
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
networks:
- monitoring
volumes:
prometheus-data:
grafana-data:
networks:
monitoring:
driver: bridgeService prometheus menjalankan Prometheus server dengan konfigurasi eksternal. Volume mount memastikan konfigurasi dan data tetap persisten. Service grafana menyediakan web interface pada port 3000. node-exporter mengumpulkan host-level metrics seperti CPU, memory, dan disk usage. cadvisor mengumpulkan container-specific metrics dari Docker daemon. Semua service berada dalam custom network monitoring untuk service discovery internal.
Mengonfigurasi Prometheus untuk Scraping Metrics Container
File prometheus.yml mendefinisikan scrape targets dan interval pengumpulan data.
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node-exporter'
static_configs:
- targets: ['node-exporter:9100']
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']Global directive scrape_interval menentukan frekuensi pengumpulan data. Setiap job_name merepresentasikan grup target yang dikumpulkan bersama. Prometheus menggunakan DNS service discovery untuk menemukan container dalam Docker network. Label job secara otomatis ditambahkan ke setiap metrics untuk identifikasi sumber. Untuk environment yang lebih kompleks, kita dapat menggunakan file-based service discovery atau Consul integration.
Membangun Dashboard Real-Time di Grafana
Setelah Prometheus berjalan, kita perlu mengkonfigurasi Grafana untuk membaca data dari Prometheus data source. Login ke Grafana pada http://localhost:3000 dengan default credentials. Navigasi ke Configuration > Data Sources dan tambahkan Prometheus dengan URL http://prometheus:9090.
Dashboard dapat dibuat secara manual atau menggunakan provisioning file. Provisioning memungkinkan kita mendefinisikan dashboard dalam format JSON yang dapat ditrack di version control.
apiVersion: 1
providers:
- name: 'default'
orgId: 1
folder: ''
type: file
disableDeletion: false
editable: true
options:
path: /var/lib/grafana/dashboardsFile ini ditempatkan dalam provisioning/dashboards/dashboard.yml. Grafana secara otomatis memuat dashboard dari direktori yang ditentukan saat startup. Grafana juga menyediakan dashboard variables untuk membuat panel dinamis berdasarkan container name atau host name.
Menulis PromQL untuk Query Metrics Penting
PromQL (Prometheus Query Language) adalah bahasa fungsional untuk memilih dan mengagregasi time-series data. Query berikut menampilkan CPU usage rate untuk setiap container:
rate(container_cpu_usage_seconds_total[5m])Query ini menghitung rata-rata rate perubahan CPU usage dalam window 5 menit. Function rate() hanya dapat digunakan dengan counter metrics. Untuk memory usage dalam persentase:
container_memory_usage_bytes / container_spec_memory_limit_bytes * 100Query ini membagi current memory usage dengan memory limit yang didefinisikan. Hasilnya adalah utilization percentage yang berguna untuk capacity planning. Untuk network traffic monitoring:
rate(container_network_receive_bytes_total[5m])Query ini menunjukkan inbound network traffic rate per container. Kita dapat menggabungkan query dengan by (name) untuk agregasi berdasarkan container name. Function avg_over_time() berguna untuk melihat trend jangka panjang dengan meratakan noise sementara.
Mengimplementasikan Alerting untuk Notifikasi Dini
Monitoring tanpa alerting hanya memberikan reactive insight. Prometheus Alertmanager memungkinkan kita mendefinisikan rules yang memicu notifikasi ketika threshold terlampaui.
groups:
- name: container_alerts
rules:
- alert: HighMemoryUsage
expr: (container_memory_usage_bytes / container_spec_memory_limit_bytes) > 0.85
for: 5m
labels:
severity: warning
annotations:
summary: "High memory usage detected"
description: "Container {{ $labels.name }} menggunakan lebih dari 85% memory limit."
- alert: ContainerDown
expr: up{job="cadvisor"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Container exporter down"Rule HighMemoryUsage dievaluasi setiap evaluation interval. Kondisi for: 5m memastikan alert hanya fire ketika threshold terlampaui selama 5 menit berturut-turut. Ini mencegah alert flapping akibat spike sementara. Alertmanager mendukung routing ke multiple channels seperti Slack, email, atau PagerDuty berdasarkan label severity.
Kesimpulan
Stack monitoring dengan Prometheus dan Grafana memberikan visibility penuh terhadap container Docker. Kita dapat melacak resource utilization, mendeteksi anomali, dan menerima notifikasi secara proaktif. Docker Compose menyederhanakan deployment seluruh stack dalam satu command. PromQL menyediakan fleksibilitas query untuk berbagai use case observability. Dashboard real-time memungkinkan tim untuk membuat keputusan berbasis data dalam troubleshooting dan capacity planning. Implementasi monitoring sejak tahap development mengurangi risk di production environment secara signifikan.
Ingin menguasai container orchestration dan modern DevOps practices? Bergabunglah di DevOps Engineering Bootcamp Rumah Coding. Program hands-on mencakup Docker, Kubernetes, CI/CD pipelines, dan cloud deployment untuk mempersiapkan karir di dunia DevOps.