Salah satu kebutuhan dasar para sysop adalah tool untuk memonitoring sistem yang mereka kelola. Hal ini mencakup pengumpulan data performansi dan juga bagaimana menyajikan data tersebut dalam sebuah dashboard. Selain itu juga dibutuhkan mekanisme pengiriman notifikasi “alert” jika terjadi suatu insiden untuk memungkinkan respon penanganan secara dini.
Saat ini bisa dikatakan, tool yang paling populer digunakan untuk kebutuhan ini adalah penerapan Prometheus dan Grafana.
Prometheus Link to heading
Prometheus adalah sebuah sistem pemantauan open source yang populer untuk mengumpulkan metrik dan mengirimkan notifikasi.
Prometheus menyimpan data monitoring dalam model time-series berdimensi fleksibel. Data time-series ini dapat diidentifkasi dengan nama metric dan kumpulan pasangan key-value.
Data time-series dapat di-query dengan menggunakan perintah PromQL. PromQL adalah bahasa query yang memungkinkan melakukan query, mengkorelasi, dan mentransformasi data time-series.
Untuk monitoring, Prometheus mengumpulkan data dengan meminta data metrik dari aplikasi lain. Data metrik ini biasanya disediakan oleh aplikasi tersebut dalam sebuah endpoint HTTP, biasanya pada path “/metrics”.
Data metric bisa secara internal memang disediakan oleh aplikasi tersebut, atau bisa juga disediakan oleh aplikasi lain yang membaca data dan menyesuaikannya menjadi metrik Prometheus. Aplikasi yang menyediakan data metrik pihak ketiga biasa disebut sebagai “exporter”.
Berikut contoh potongan data metrik yang diberikan oleh “node-exporter” (exporter umum untuk memberikan data metric sebuah mesin):
# HELP node_cpu_guest_seconds_total Seconds the CPUs spent in guests (VMs) for each mode.
# TYPE node_cpu_guest_seconds_total counter
node_cpu_guest_seconds_total{cpu="0",mode="nice"} 0
node_cpu_guest_seconds_total{cpu="0",mode="user"} 0
node_cpu_guest_seconds_total{cpu="1",mode="nice"} 0
node_cpu_guest_seconds_total{cpu="1",mode="user"} 0
node_cpu_guest_seconds_total{cpu="2",mode="nice"} 0
node_cpu_guest_seconds_total{cpu="2",mode="user"} 0
# 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"} 691559.98
node_cpu_seconds_total{cpu="0",mode="iowait"} 5120.49
node_cpu_seconds_total{cpu="0",mode="irq"} 5168.18
node_cpu_seconds_total{cpu="0",mode="nice"} 28.95
node_cpu_seconds_total{cpu="0",mode="softirq"} 2035.23
node_cpu_seconds_total{cpu="0",mode="steal"} 1626.65
node_cpu_seconds_total{cpu="0",mode="system"} 16102.05
node_cpu_seconds_total{cpu="0",mode="user"} 28499.24
node_cpu_seconds_total{cpu="1",mode="idle"} 690636.31
node_cpu_seconds_total{cpu="1",mode="iowait"} 5082.57
node_cpu_seconds_total{cpu="1",mode="irq"} 5294.01
node_cpu_seconds_total{cpu="1",mode="nice"} 25.65
node_cpu_seconds_total{cpu="1",mode="softirq"} 2275.62
node_cpu_seconds_total{cpu="1",mode="steal"} 1689.79
node_cpu_seconds_total{cpu="1",mode="system"} 16688.37
node_cpu_seconds_total{cpu="1",mode="user"} 28743.56
node_cpu_seconds_total{cpu="2",mode="idle"} 688698.67
node_cpu_seconds_total{cpu="2",mode="iowait"} 5090.6
node_cpu_seconds_total{cpu="2",mode="irq"} 5318.73
node_cpu_seconds_total{cpu="2",mode="nice"} 21.24
node_cpu_seconds_total{cpu="2",mode="softirq"} 5307.26
node_cpu_seconds_total{cpu="2",mode="steal"} 1656.28
node_cpu_seconds_total{cpu="2",mode="system"} 16364.79
node_cpu_seconds_total{cpu="2",mode="user"} 27827.4
# HELP node_disk_discard_time_seconds_total This is the total number of seconds spent by all discards.
# TYPE node_disk_discard_time_seconds_total counter
node_disk_discard_time_seconds_total{device="sda"} 1631.346
node_disk_discard_time_seconds_total{device="sr0"} 0
# HELP node_disk_discarded_sectors_total The total number of sectors discarded successfully.
# TYPE node_disk_discarded_sectors_total counter
node_disk_discarded_sectors_total{device="sda"} 7.5425768e+07
node_disk_discarded_sectors_total{device="sr0"} 0
# HELP node_disk_discards_completed_total The total number of discards completed successfully.
# TYPE node_disk_discards_completed_total counter
node_disk_discards_completed_total{device="sda"} 9006
node_disk_discards_completed_total{device="sr0"} 0
# HELP node_disk_discards_merged_total The total number of discards merged.
# TYPE node_disk_discards_merged_total counter
node_disk_discards_merged_total{device="sda"} 0
node_disk_discards_merged_total{device="sr0"} 0
Penjelasan mengenai bagaimana format dan ketentuan data metrik Prometheus akan terlalu panjang untuk dibahas di artikel ini.
Prometheus hanya mengumpulkan data dengan melakukan scraping metrik dan kemudian menyimpannya sebagai data time-series. Data time-series ini dikelola oleh Prometheus secara independen dan efisien dalam penyimpanan lokal, tanpa membutuhkan DBMS pihak ketiga.
Prometheus juga memungkinkan konfigurasi “alert. Alert ini dapat dikirimkan dengan berbagai macam transport, misalkan “email” Bahkan Anda dapat membuat custom transport jika dibutuhkan.
Format metrik Prometheus yang sederhana, ringkas, tapi efisien, menjadikan metrik Prometheus sebagai standar de-facto yang digunakan oleh banyak aplikasi. Beberapa aplikasi menyediakan metrik yang bisa dikonsumsi oleh Prometheus, misalkan Caddy, PowerDNS, dan banyak aplikasi-aplikasi lainnya. Kami juga menyukai metrik Prometheus, beberapa aplikasi yang Kami buat menyediakan metrik Prometheus secara built-in sehingga bisa di-scrape oleh Prometheus.
Bebeapa aplikasi populer tidak menyediakan data metrik Prometheus secara built-in, akan tetapi tersedia exporter pihak ketiga yang memungkinkan di-scrape oleh Prometheus. Misal: MySQL server exporter (official dari Prometheus), Redis exporter, dan banyak lagi. List exporter-exporter yang populer dapat dilihat di https://prometheus.io/docs/instrumenting/exporters/.
Dashboard yang disediakan Prometheus sangat sederhana. Hanya menyediakan tool untuk query dengan PromQL dan melihat status-status sederhana, seperti status keberhasilan scraping dan alert yang aktif saat ini. Prometheus tidak menyediakan dashboard dengan tampilan indah untuk menampilkan data monitoring. Hal ini karena secara desain Prometheus fokus hanya pada pengumpulan data metrik secara efisien saja.
Grafana Link to heading
Grafana adalah aplikasi web analisis open source multi-platform dengan visualisasi interaktif. Grafana sering digunakan sebagai dashboard monitoring untuk menampilkan visualisasi data metrik-metrik dari Prometheus.
Selain Prometheus, Grafana juga mendukung penggunaan data source lain seperti:
- Basisdata time-series:
- Graphite
- InfluxDB
- OpenTSDB
- Basisdata log dan dokumen:
- Loki
- Elasticsearch
- SQL:
- MySQL
- Microsoft SQL Server
- PostgresSQL
- dan banyak lagi…
Bagaimana Kami menggunakan Prometheus dan Grafana Link to heading
Tentu saja, Kami cinta container, sehingga Kami menjalankan Prometheus dan Grafana sebagai container. Sebagai penyimpanan data Grafana, Kami memakai sebuah container MariaDB yang juga dipakai oleh beberapa aplikasi/container Kami lainnya. Penggunaan container memungkinkan instalasi dan pengelolaan secara efisien.
Beberapa Prometheus exporter yang Kami gunakan diantaranya adalah:
- node-exporter
- mysql-exporter
- blackbox-exporter
- snmp-exporter
- mtxp-exporter
Beberapa aplikasi yang secara native built-in menyediakan metrik Prometheus yang Kami gunakan diantaranya adalah:
- Caddy
- PowerDNS
Selain itu, beberapa aplikasi yang Kami kembangkan juga mengekspos metrik Prometheus sehingga dapat kami monitoring.