Monitor Metric Server dengan Prometheus and Grafana

Monitoring metrics dari server merupakan hal yang penting untuk menjaga reliability dari service mu. Kamu juga dapat menghemat biaya dengan men-downgrade server mu apabila load average nya jauh dibawah kapasitas maksimum dari server. Ada beberapa cara dan tools untuk memonitor server. Salah satu yang paling populer adalah dengan menggunakan Prometheus untuk mengumpulkan dan menyimpan metrics. Dan Grafana untuk memvisualisasikannya ke dalam berbagai macam grafik. Artikel ini akan menunjukkan cara untuk memonitor metrics server menggunakan Prometheus dan Grafana. Khususnya pada server Linux.

The tools

Tools yang akan kita gunakan adalah node_exporter, Prometheus server, and Grafana. Kita akan menggunakan docker untuk menjalankan Prometheus server dan Grafana.

node_exporter adalah sebuah daemon yang berjalan pada setiap server target yang bertugas mengexpose metrics dari server. node_exporter akan membuat HTTP handler /metrics pada port default 9100. Metrics yang diexpose akan di-scrape atau dikumpulkan oleh Prometheus dan kemudian disimpan ke database. Grafana akan melakukan query data dari Prometheus dan memvisualisaikannya menjadi berbagai macam grafik.
Arsitektur akan terlihat seperti diagram berikut:

grafana prome node

Expose Metrics dengan node_exporter

SSH ke server target, kemudian download node_exporter. Kalau mau download versi yang lain, bisa ke https://prometheus.io/download/#node_exporter.

wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz

Extract package

tar xzvf node_exporter-0.18.1.linux-amd64.tar.gz

Masuk ke folder package dan jalankan node_exporter di background.

cd node_exporter-0.18.1.linux-amd64
./node_exporter &

Untuk environment production, kamu mungkin mungkin perlu tools seperti Ansible untuk menjalankan proses-proses tersebut secara otomatis.

Setelah node_exporter berjalan, coba hit /metrics di port 9100 untuk mengecek apakah metrics nya berhasil diexpose.

curl localhost:9100/metrics

Hasilnya akan terlihat seperti ini:

# HELP node_cpu_seconds_total Seconds the cpus spent in each mode.
# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{cpu="0",mode="idle"} 65486.1
node_cpu_seconds_total{cpu="0",mode="iowait"} 34.49
node_cpu_seconds_total{cpu="0",mode="irq"} 0
...
...

Ini berarti kita dapat men-scrape metrics dari node_exporter.

Scrape The Metrics menggunakan Prometheus Server

Pada tutorial ini, kita akan menjalankan Prometheus server dengan docker. Kalau kamu mau menggunakan metode lain, bisa lihat di https://prometheus.io/download/.
Pertama, kita perlu membuat configuration file. Copy paste kode berikut dan simpan dengan nama prometheus.yml.

global:
  scrape_interval:     10s
  
scrape_configs:
  - job_name: 'node'
    static_configs:
    - targets: ['192.168.100.17:9100']

Ini merupakan config yang paling sederhana. Atribut scrape_interval adalah jeda waktu antara setiap scrape yang dilakukan server, scrape_interval 10s berarti Prometheus akan melakukan scrape setiap 10 detik. Masukkan IP dari server-server target pada atribut targets. Untuk info lebih lengkap tentang configration ada di https://prometheus.io/docs/prometheus/latest/configuration/configuration/.

Gunakan command ini untuk menjalankan Prometheus dengan docker. Jangan lupa ganti /path/to/your/prometheus.yml ke lokasi dari file configuration mu.

docker run -d \
    -p 9090:9090 \
    -v /path/to/your/prometheus.yml:/etc/prometheus/prometheus.yml \
    prom/prometheus

Setelah berhasil dijalankan, buka http://localhost:9000 di browser untuk membuka dashboard Prometheus.

prome dashboard

Click Status > Targets untuk melihat apakah server target berhasil discrape oleh Prometheus.

prome targets

Kamu sudah bisa melakukan query ke Prometheus. Untuk melakukannya click Graph, kemudian masukkan avg by(instance) (node_load5) pada field Expression. Ini akan menunjukkan load average pada setiap server.

Visualisasikan Metrics dengan Grafana

Grafana adalah aplikasi open-source untuk memonitor dan menganalisa metrics mu. Kita menggunakan Grafana untuk memvisualisasikan metrics mu menjadi grafik-grafik yang menarik untuk dilihat dan mudah dimengerti. Grafana memiliki banyak fitur yang powerful untuk memonitor dan menganalisa. Grafana juga memiliki fitur alerting yang sangat berguna. Dia telah digunakan oleh ribuan perusahaan.

Gunakan ini untuk menjalankan Grafana dengan docker. Kalau ingin menggunakan metode lain, bisa lihat di https://grafana.com/get.

docker run -d -p 3000:3000 grafana/grafana

Buka http://localhost:3000/ untuk masuk ke dashboard Grafana. Login dengan username default admin dan password admin. Setelah login, jangan lupa untuk ganti password mu. Kemudian kamu akan melihat halaman ini:

prome targets

Click Add data source.
Select Prometheus.
Input name dari data source dan URL dari Prometheus server mu. Biarkan field yang lain untuk saat ini.

grafana data source

Click Save & Test.

Sekarang masuk ke Grafana Home dan click New Dashboard, kemudian click Add Query. Coba gunakan query ini lagi avg by(instance) (node_load5) dan lihat grafik yang dihasilkan.

grafana graph

Silahkan coba utak atik dan bereksperimen dengan dashboard dan query nya.

Some Useful Query Sample

Berikut ini adalah beberapa contoh query yang dapat berguna. Untuk info lengkap bisa ke https://prometheus.io/docs/prometheus/latest/querying/basics/#examples.

# cpu usage
100 - (avg by(instance)(irate(node_cpu_seconds_total{mode="idle"}[5m]))*100)

# memory used
node_memory_MemTotal_bytes{} - node_memory_MemAvailable_bytes{}

# disk space used 
1-(node_filesystem_free_bytes{} / node_filesystem_size_bytes{})

# network received rate
rate(node_network_receive_bytes_total{instance=~'$node',device='eth0'}[1m])

# network transmitted rate
rate(node_network_transmit_bytes_total{instance=~'$node',device='eth0'}[1m])

See also