Distributed tracing digunakan oleh software engineer untuk memonitor atau men-debug aplikasi. Ini sangat berguna untuk menemukan proses mana yang memakan waktu paling banyak, atau fungsi apa yang paling banyak terjadi error. Salah satu system untuk melakukan distributed tracing adalah Jaeger. Artikel ini akan menunjukkan bagaimana menjalankan Jaeger di local environment dan melakukan tracing aplikasi Go.
Apa itu distributed tracing?
Berdasarkan opentracing.io, distributed tracing adalah metode untuk mem-profile dan memonitor aplikasi, terutama aplikasi-aplikasi yang dibuat menggunakan architecture microservice. Distributed tracing dapat sangat berguna ketika terjadi performance issue pada aplikasi kita, atau ketika kita ingin mengimprove performa aplikasi kita. Ini juga dapat berguna untuk melakukan root cause analysis dari suatu masalah. Trace direpresentasikan sebagai rangkaian dari fungsi-fungsi yang dipanggil. Sehingga kita dapat men-debug aplikasi kita lebih mudah, atau mungkin dapat menemukan flow yang tidak seharusnya terjadi pada aplikasi kita.
Jaeger adalah salah satu system yang paling populer untuk distributed tracing. Jaeger adalah open-source, end-to-end distributed tracing system. Jaeger di-release oleh Uber Technology. Jaeger menggunakan data model dan instrumentation libaries yang compatible dengan OpenTracing, sehingga API dan penggunaan distributed tracing terstandarisasi.
Jalankan jaeger
Untuk menjalankan Jaeger di local environment, kita dapat menggunakan all in one Jaeger docker image. Untuk metode deployment lainnya, bisa lihat di sini.
docker run -d -p6831:6831/udp -p16686:16686 jaegertracing/all-in-one:latest
Image ini sudah berisi Jaeger UI, collector, query, dan agent, yang mana cukup untuk melakukan tracing aplikasi lokal kita. Pergi ke http://localhost:16686 untuk membuka Jaeger UI.
Setelah Jaeger berhasil kita jalankan, kita bisa mulai trace aplikasi kita. Pada contoh ini, kita akan tracing webserver dari Go.
Distributed tracing aplikasi Go
Initialization
Untuk melakukan tracing suatu aplikasi Go, kita perlu menginisialisasi tracer nya terlebih dahulu. Code dibawah ini untuk menginisialisasi Jaeger tracer:
|
|
Pengaturan sampler yang digunakan disini adalah rate-limiting
dengan param 100
. Ini berarti Jaeger akan mengumpulkan maksimum 100 trace per detik. Kita bisa mengubah tipe dan param yang cocok untuk keperluan kita.
Kemudian set global tracer dengan Jaeger tracer.
|
|
Trace the processes
Untuk men-trace function-function di aplikasi, kita perlu membuat sebuah opentracing span dari suatu context pada awal fungsi dan panggil method Finish
dari span tersebut sebelum keluar dari fungsi. Yang perlu diperhatikan adalah kita harus melempar context
yang dibuat ke fungsi yang dipanggil selanjutnya, supaya Jaeger tau kalau fungsi-fungsi tersebut merupakan satu rangkaian. Di bawah ini adalah contoh tracing sebuah HTTP handler.
|
|
http.Request
, lalu menaruh span.Finish()
dengan defer. Bisa dilihat kita menggunakan ctx
yang dibuat di line 2 untuk memanggil fungsi isLoggedIn
di line 5 dan getCityByCountryName
di line 11. Fungsi-fungsi tersebut juga membuat opentracing dan memanggil finish sebelum keluar fungsi.
|
|
Selanjutnya, kita akan coba memanggil fungsi tersebut beberapa kali dan melihat trace nya di Jaeger UI. Buka Jaeger UI di browser dan click Find Traces
.
Click salah satu trace untuk melihat detail nya.
Kita dapat melihat trace tersebut dimulai dari HTTP handler, kemudian ke fungsi-fungsi yang dia panggil. Panjang span merepresentasikan lama waktu yang dibutuhkan fungsi tersebut. Coba explore Jaeger UI dan kau akan merasakan betapa berguna dan sangat membantunya jaeger untuk kita.
Kesimpulan
Distributed tracing sangat berguna untuk memonitor aplikasimu. Dia dapat menampilkan trace sebagai suatu rangkaian fungsi-fungsi yang dipanggil sehingga dapat membantumu men-debug aplikasi lebih mudah. Jaeger adalah salah satu system yang paling populer untuk distributed tracing. Mudah dijalankan dan digunakan, dan mengimplementasi opentracing. Kita dapat melihat hasil tracing di Jaeger UI dan menemukan berapa lama waktu yang diperlukan setiap fungsi. Ini mempermudah kita menemukan fungsi yang membuat bottleneck.
Sample code lengkap yang digunakan di sini dapat dilihat di bawah.
The complete code
The complete code is here (click to expand)
|
|