Monitoring Aplikasi REST API Golang dengan Elastic APM Service
Melakukan monitoring aplikasi pada environment production merupakan hal yang penting.
Dengan melakukan monitoring kita akan mendapatkan banyak informasi mengenai aplikasi yang sedang berjalan, informasi yang didapat juga merupakan informasi yang valid dan berdasarkan data, misal kita bisa mendapatkan data mengenai performa aplikasi, load time, latency, error rate dan lain sebagainya, dari data yang didapat team development akan mengetahui service mana yang perlu untuk di optimize.
Saat ini saya memiliki YouTube Channel yang membahas tentang Software Engineering, silakan kunjungi Youtube channel Asdita Prasetya ️📽️💥
Ada banyak tools yang dapat digunakan sebagai APM service misal Logz.io, SolarWinds AppOptics, AppDynamics, dan Stagemonitor. Namun kali ini kita akan menggunakan Elastic APM Service karena gratis, open source dan mendukung banyak bahasa pemrograman.
Pada pembahasan kali ini saya akan berfokus pada:
- Instalasi dan konfigurasi Elastic APM service di localhost
- Membuat REST API sederhana menggunakan bahasa GO dan menghubungkannya dengan Elastic APM Service.
Instalasi Elastic APM Service
Pastikan kalian sudah memiliki docker di localhost, langka selanjutnya adalah clone repository dibawah ini, dan ikuti langkah yang telah dijelaskan oleh pemilik repository:
Singkatnya dengan menuliskan perintah docker-compose up -d
elasticsearch, kibana, dan apm-server akan berjalan dengan pengaturan default. Setelah itu kita dapat mengunjungi Kibana Dashboard di http://localhost:5601/ login dengan menggunakan username elastic
dan password changeme
Jika berhasil kita akan diarahkan ke halaman home Kibana Dashbord, di sinilah nantinya data hasil monitoring aplikasi dapat kita lihat, lebih tepatnya pada menu APM Service.
Membuat REST API dengan Go
Untuk memudahkan dalam membuat REST API kita akan menggunakan Echo Framework, pada project ini akan ada 2 endpoint, yaitu:
GET "/"
untuk menampilkan hello word.GET "/posts"
untuk menampilkan daftar artikel yang diambil dari https://jsonplaceholder.typicode.com/posts, pada endpoint ini kita akan melakukan simulasi tracing transaction.
Code time
Karena service yang akan dibuat cukup sederhana maka kita hanya perlu menaruh semua kode dalam satu file yaitu main.go
, use case ini tidak cocok untuk service yang kompleks, jika service cukup kompleks bisa melakukan implementasi clean architecture, design pattern dan atau pattern yang lainnya.
Dengan menggunakan Echo kita dimudahkan untuk membuat 2 endpoint yang sudah aku jelaskan sebelumnya, untuk menghubungkan aplikasi dengan Elastic APM service dibutuhkan APM Go Agent, untungnya kita menggunakan Echo.
Echo telah terintegrasi dengan APM service, developer dapat menggunakan middleware yang ada, sehingga semua request response akan secara otomatis di kirim ke APM Service tanpa perlu mendefinisikan secara eksplisit di tiap fungsi handler. Cukup mendaftarkan middleware dengan menggunakan sintak e.Use(apmechov4.Middleware())
.
Untuk menghubungkan Echo dengan APM service kita perlu menambahkan module apm-agent ke project.
The Post Handler
e.GET("/posts")
merupakan endpoint yang akan menampilkan daftar artikel dengan sumber data jsonplaceholder.com nama fungsi fetchPostHandler
yang akan memanggil fungsi requestToAPIServer
dan doBackgroundProccess
requestToAPIServer
memiliki tugas mengirim request ke jsonplaceholder.com untuk mendapatkan data articles, pada fungsi ini terdapat time.Sleep(30 *time.Millisecond)
yang artinya proccess akan ditunda selama 30 milliseconds, penundaan 30 milliseconds bermangkud untuk membuat seolah waktu yang dibutuhkan untuk mendapatkan data articles cukup lama.
Pada fungsi ini juga menerapkan transactions tracing, menggunakan fungsi span yang di tandai dengan sintak apm.StartSpan()
befungsi untuk menandai atau memberi nama suatu aktifitas dalam transaksi, fungsi ini juga dapat digunakan untuk mengukur database query.
Selain itu juga terdapat fungsi doBackgroundProccess
yang memiliki waktu tunggu selama 60 milliseconds, fungsi ini dibuat untuk seolah menjakankan suatu proses yang berat.
Simpan semua part sintak yang ada dalam satu file dan beri nama main.go
selanjutnya jalankan dengan menggunakan go run mian.go
setelah itu dapat melakukan akses ke endpoint yang telah dibuat.
Dengan melakukan akses ke GET http://localhost:1313/posts
akan menampilkan daftar artikel denga formar JSON.
Semua data request dan respond dari aplikasi yang telah kita buat dapat di lihat melalui Dashboard Kibana, mari kita lihat data apa saja yang muncul dengan akses ke http://localhost:5601/
Secara default akan menampilkan nama file yang sedang terhubung ke Elastic APM Service namun kita bisa menggantinya dengan menambahkan environtment variabel ELASTIC_APM_SERVICE_NAME
Halaman detail dari service yang telah terhubung dengan Elasctic APM Sevice, akan tampil banyak data sepeti data transaksi, latency, throuhtput, dan timeline dari request yang masuk ke server.
Data diatas menunjukan bagaimana endpoint post
berjalan, dapat kita lihat terdapat timeline dan juga nama proccess yang telah kita definisikan di menu handler, selain timeline juga ditampilkan metadata, logs dan masih banyak lagi.
Untuk mengetahui data apa saja yang dapat direkam, silahkan mencoba sendiri di localhost masing - masing, semoga bermanfaat!
Summary
- Hanya dibutuhkan 3 langkah untuk melalukan integrasi aplikasi dengan Elastic APM Service. 1) Setup Elasticsearch, Kibana dan APM Service. 2) Tambahkan Elastic APM Go agent package. 3) Visualisasi melalui Kibana
- Elastic APM Service mendukung tracing database query, error tracing, distribute tracing, transaction tracing dan masih banyak lagi.
- Elastic APM Service mendukung berbagai framework popular