Monitor Spring Boot Microservice menggunakan Micrometer, Prometheus dan Grafana
Dalam dunia system yang terdistribusi / microservices apalagi yang sudah mempunyai services dalam jumlah ratusan atau ribuan, mungkin kita akan mengalami kesusahan apabila kita akan memantau setiap services secara manual. Metric adalah salah satu untuk melihat performa aplikasi. Dalam artikel ini kita akan membahas bagaimana membuat custom metric menggunakan library micrometer kemudian akan direcord oleh tool Prometheus dan ditampilkan / divisualisasikan menggunakan Grafana.
Mengapa Monitoring ? Mengapa harus sekarang ?
secara historis, adalah susah untuk memonitor aplikasi yang banyak perbedaan. Karena setiap bahasa atau framework mempunyai caranya masing-masing untuk melihat performa aplikasi. Namun sekarang orang-orang sudah banyak melakukan inovasi mengenai monitoring aplikasi dan itu menjadi sangat penting dan yaa tool itu adalah Prometheus.
Apa itu Prometheus ?
adalah tool yang digunakan untuk menyimpan data point atau metric sepanjang waktu. Jadi metric-metric dan performance data dari aplikasimu akan diambil dalam rentang waktu yang ditentukan oleh Prometheus dan tool ini mengijinkan kita untuk melakukantime series analisis dari metric-metric yang sudah dikumpulkan. Bagi teman-teman yang belum paham apa itu time series analysis, menurut Aileen Nielsen dalam bukunya yang berjudul Practical Time Series Analysis
Time series analysis is the endeavor of extracting meaningful summary and statistical information from points arranged in chronological order. It is done to diagnose past behavior as well as to predict future behavior.
Dengan kata lain, analisa time series mengijinkan kita untuk melihat kumpulan data dari waktu ke waktu dan melihat trend apa yang sedang kamu lakukan dan mungkin bisa melihat sedikit estimasi masa depan. Prometheus berjalan terpisah dari aplikasi yang akan kita pantau performa nya. Seperti yang telah disebutkan diatas, prometheus secara periodic mengambil metric dan data performa (pull based approarch) kemudian menyimpan nya dalam database nya. Ini adalah bagus karena prometheus tidak bergantung erat kepada aplikasi (tight coupling) sehingga jika prometheus suatu saat tidak running maka tidak akan mengganggu aplikasi target nya
Apa itu Grafana ?
Dalam prometheus browser, terdapat visual standar yang menampilkan chart dari metrics aplikasi. Namun jika kita gabungkan menggunakan Grafana maka kita bisa membuat sebuah halaman dashboard dari metrics-metrics yang ingin kita pantu performa nya. Grafana dapat mendapatkan data bukan hanya dari prometheus saja tapi juga dari Elasticsearch, InfluxDB dsb, disamping itu Grafana juga dapat mengirimkan pesan atau alert notifikasi ke email, slack, hipchat dsb.
Apa itu Micrometer ?
Micrometer dapat memudahkan kita untuk membuat custom metric, seperti seberapa sering endpoint api/v1/payment di hit oleh user atau ingin melihat traffic user yang hit endpoint api/v1/producs misalkan. Jika anda pernah menggunalan Log4J maka Micrometer secara penggunaan mirip dengan itu, kita tinggal tentukan ditempat mana atau d method mana yang ingin kita buatkan metric yang ingin kita pantau. Terdapat tiga tipe dari metric micrometer, yaitu
Gauge Mengukur penggunaan resource, kapasistas dll yang nilai nya bisa naik dan turun . Contohnya adalah melihat cpu usage, traffic pengunjung dari waktu ke waktu.
Counter Mengukur suatu peristiwa atau tindakan yang nilainya selalu naik dan tidak pernah berkurang. Contoh nya adalah melihat jumlah user yang sudah terdaftar dari awal sampai sekarang.
Timer Mengukur peristiwa yang mempunyai durasi pendek, Contohnya method execution time, request duration.
Demo Project
Membuat Sample Aplikasi
Buatlah sebuah project Spring Boot di situs spring initializr dengan spesikasi library seperti dibawah ini.
Sesuaikan application.properties nya menjadi seperti ini.
management.endpoints.web.exposure.include=prometheus,health,info,metric
jalankan aplikasi tersebut, kemudian cek di localhost:8080/actuator, maka tampilan akan seperti dibawah ini
jika kalian klik dibagian prometheus nya, makan akan keluar page yang berisi metric dari aplikasi nya
Dalam demo ini , saya akan coba membuat sebuah class yang setiap 1 detik sekali menggenerate sebuah angka integer yang akan kita gunakan di metric Gauge dan Counter.
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class Scheduler {
private final AtomicInteger testGauge;
private final Counter testCounter;
public Scheduler(MeterRegistry meterRegistry) {
testGauge = meterRegistry.gauge("custom_gauge", new AtomicInteger(0));
testCounter = meterRegistry.counter("custom_counter");
}
@Scheduled(fixedDelay=1000) // delay per 1 seconds
public void schedulingTask() {
testGauge.set(Scheduler.getRandomNumberInRange(0, 100));
testCounter.increment();
}
private static int getRandomNumberInRange(int min, int max) {
if (min >= max) {
throw new IllegalArgumentException("max must be greater than min");
}
Random r = new Random();
return r.nextInt((max - min) + 1) + min;
}
}
kemudian karena kita membuat aplikasi scheduler, jangan lupa untuk menambahkan annotasi @EnableScheduling di class yang terdapat method main nya. Jalankan kembali aplikasinya dan kita lihat apakah metric custom_gauge dan custom_counter sudah ada atau belum.
Menjalankan Prometheus
Disini saya menggunakan docker untuk menjalankan prometheus nya, kalian bisa mendapatkan images nya menggunakan
docker pull prom/prometheus
di dalam root folder Spring Boot diatas, buatlah file prometheus.yml yang akan kita gunakan untuk membuat spesifikasi atau file mounting dari prometheus nya. Namun sebelum itu, kita harus tau berapa IP Address / Host yang kita gunakan, saya menggunakan sintak ini untuk melihat nya
ifconfig | grep inet
prometheus.yml
global:
scrape_interval: 5s
scrape_configs:
- job_name: prometheus
honor_labels: true
static_configs:
- targets: [ "localhost:9090" ]
- job_name: 'spring_micrometer'
metrics_path: '/actuator/prometheus'
scrape_interval: 5s
static_configs:
- targets: ['your_host_ip:8080']
kemudian jalankan prometheus image menjadi sebuah container dengan sintak berikut, (arahkan terminal pada root source aplikasi Spring Boot diatas)
docker run -d -p 9090:9090 -v $PWD/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
akses browser dengan url localhost:9090/targets makan jika berhasil tampilannya akan sebagai berikut.
akses menu Graph kemudian cari custom_gauge klick execute dan pada tab d bawah pilih graph, maka time series dari metric custom_gauge akan ditampilkan
begitu juga pada metric custom_counter_total
pada step ini kita sudah berhasil mengekspos metric dan ditangkap oleh prometheus, selanjut nya adalah kita akan membuat dashboard dari metric diatas menggunakan Grafana.
Membuat dashboard visualisasi Grafana
sebelumnya pull terlebih dahulu image grafana nya menggunakan
docker pull grafana/grafana
dan jalankan containernya
docker run -d -p 3000:3000 grafana/grafana
akses localhost:3000, jika ada form login makan default loginnya adalah username : admin dan password : admin.
Sebelum kita membuat datasource di grafana, maka kita harus mengetahui IP Address dari container prometheus yang sudah kita buat tadi, menggunakan command
docker ps
docker inspect <container ID prometheus>
setelah itu masuk lagi ke Grafana, pada Datasource kemudian pilih Prometheus
masukannya URL sesuai dengan IP Address container Prometheus dan Access nya Browser, test kemudian save.
dan buatlah dashboard dari metrics yang sudah kita buat yaitu custom_gauge dan custom_counter_total
Demikian artikel ini,mudah mudahan dapat menambahkan wawasan dan membantu teman-teman dalam membuat monitoring untuk aplikasi di Spring Boot. Untuk source code nya, kalian bisa mendapatkan nya disini.
Did you find this article valuable?
Support Teten Nugraha by becoming a sponsor. Any amount is appreciated!