Teten Nugraha
Backendhabit

Backendhabit

Monitor Spring Boot Microservice menggunakan Micrometer, Prometheus dan Grafana

Monitor Spring Boot Microservice menggunakan Micrometer, Prometheus dan Grafana

Teten Nugraha's photo
Teten Nugraha
·Mar 17, 2022·

5 min read

Table of contents

  • Mengapa Monitoring ? Mengapa harus sekarang ?
  • Apa itu Prometheus ?
  • Apa itu Grafana ?
  • Apa itu Micrometer ?
  • Demo Project

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

  1. Gauge Mengukur penggunaan resource, kapasistas dll yang nilai nya bisa naik dan turun . Contohnya adalah melihat cpu usage, traffic pengunjung dari waktu ke waktu.

  2. 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.

  3. 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.

Screen Shot 2022-03-17 at 15.03.19.png

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

Screen Shot 2022-03-17 at 15.04.14.png

jika kalian klik dibagian prometheus nya, makan akan keluar page yang berisi metric dari aplikasi nya

Screen Shot 2022-03-17 at 15.04.51.png

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.

Screen Shot 2022-03-17 at 15.17.54.png

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.

Screen Shot 2022-03-17 at 15.37.00.png

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

Screen Shot 2022-03-17 at 15.38.43.png

begitu juga pada metric custom_counter_total

Screen Shot 2022-03-17 at 15.39.36.png

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.

Screen Shot 2022-03-17 at 15.44.28.png

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

Screen Shot 2022-03-17 at 15.49.33.png

Screen Shot 2022-03-17 at 15.50.19.png

masukannya URL sesuai dengan IP Address container Prometheus dan Access nya Browser, test kemudian save.

Screen Shot 2022-03-17 at 15.52.12.png

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.

Screen Shot 2022-03-17 at 16.00.43.png

 
Share this