Cara Menggunakan Distributed Tracing untuk Root Cause pada Microservices

Incident pada microservices jarang memberikan jawaban yang langsung terlihat.

Frontend bisa menampilkan HTTP 500, API gateway terlihat sehat, tetapi kegagalan sebenarnya muncul empat service lebih dalam karena database timeout atau dependency eksternal bermasalah.

Karena itu, Cara Menggunakan Distributed Tracing sebaiknya menjadi bagian dari workflow incident, bukan sekadar dashboard tambahan.

Trace yang dirancang dengan benar dapat menunjukkan jalur transaksi, hubungan antarservice, latency, dan error dalam satu konteks. Tantangannya adalah mengetahui trace mana yang harus diperiksa serta bagaimana membedakan gejala dari akar persoalan.

Mulai Investigasi dari Symptom, Bukan Service

Ketika alert berbunyi, engineer sering langsung membuka dashboard service yang dianggap bermasalah.

Pendekatan yang lebih sistematis adalah memulai dari symptom pengguna.

Misalnya:

checkout error meningkat dari 0,2% menjadi 4%.

Cari traces dari endpoint checkout yang memiliki error pada periode tersebut.

AWS Well-Architected menjelaskan distributed tracing memberikan pandangan menyeluruh terhadap request ketika bergerak melalui distributed system sehingga debugging dan identifikasi bottleneck dapat dilakukan lebih presisi.

Setelah mendapatkan kumpulan traces, cari pola.

Apakah semuanya gagal pada service yang sama?

Apakah error hanya terjadi pada satu region?

Apakah latency meningkat setelah versi tertentu di-deploy?

Dengan pendekatan ini, tim tidak memilih tersangka terlebih dahulu lalu mencari data yang mendukungnya.

Data justru menentukan arah investigasi.

Baca Trace sebagai Rangkaian Sebab dan Akibat

OpenTelemetry menggambarkan trace sebagai struktur span dengan hubungan parent-child yang merepresentasikan causal relationship suatu operasi terdistribusi.

Inilah bagian yang membuat tracing berbeda dari kumpulan log biasa.

Contohnya:

Checkout
Order
Inventory
Payment
Fraud Detection

Jika Fraud Detection gagal, Payment mungkin ikut gagal dan akhirnya Checkout memberikan HTTP 500.

Error yang dilihat pengguna terjadi di Checkout.

Tetapi akar rantainya berada di Fraud Detection.

Ikuti dependency dari root span menuju child span sampai menemukan operasi pertama yang menunjukkan perilaku abnormal.

Perhatikan timestamps.

Kadang service A terlihat lambat karena hanya sedang menunggu service B.

Jangan mengoptimalkan parent span sebelum mengetahui waktu sebenarnya dihabiskan di mana.

Gunakan Error Span untuk Mempersempit Pencarian

Tracing menjadi jauh lebih berguna ketika instrumentasi mencatat status, error, dan event secara konsisten.

OpenTelemetry span dapat membawa operation name, timestamps, attributes, events, parent ID, serta SpanContext.

Misalnya sebuah trace mempunyai tujuh span.

Enam berhasil.

Satu span database memiliki status error dan durasi tinggi.

Buka detail span tersebut.

Tambahkan metadata seperti query operation, database system, service version, dan endpoint secara aman sehingga engineer mempunyai konteks tanpa harus langsung membuka source code.

Tetapi hindari menyimpan SQL parameter sensitif, credential, atau personal information.

Tracing seharusnya membantu diagnosis tanpa menciptakan risiko keamanan baru.

Semakin konsisten semantic convention yang dipakai semua service, semakin gampang pula pencarian lintas teknologi dan tim.

Cari Root Cause pada Dependency, Bukan Hanya Service

Microservices terdiri dari dependency bertingkat.

Service yang terlihat gagal sering hanya menjadi korban downstream dependency.

AWS menjelaskan X-Ray dan distributed tracing dapat menggunakan correlation ID untuk mengikuti request melintasi service serta melihat hubungan antarkomponen.

Misalnya Catalog Service memiliki latency 1,5 detik.

Trace menunjukkan:

Catalog logic: 40 ms
Redis: 10 ms
Pricing API: 1.400 ms

Artinya menambah CPU Catalog kemungkinan tidak menghasilkan perbaikan berarti.

Selanjutnya buka Pricing span.

Mungkin ternyata Pricing melakukan lima synchronous calls menuju currency provider eksternal.

Tracing membantu investigasi bergerak secara vertikal melalui dependency chain, bukan berhenti pada service yang pertama kali dilaporkan lambat.

Insight seperti ini juga dapat mengungkap masalah desain, misalnya chain synchronous terlalu panjang atau komunikasi terlalu chatty.

Korelasikan dengan Log untuk Mendapat Detail Teknis

Trace biasanya efektif untuk menemukan lokasi masalah.

Log memberikan detail lebih dalam.

Google Cloud menunjukkan tracing dan logging dapat digunakan bersama dalam RCA: trace mempersempit request dan service bermasalah, sementara log menjelaskan code path dan kondisi abnormal yang terjadi.

Contohnya tracing menemukan error pada Inventory Service.

Log dengan trace ID yang sama memperlihatkan:

deadlock detected while updating inventory

Sekarang hipotesis jauh lebih jelas daripada sekadar “Inventory gagal”.

Engineer dapat memeriksa transaction boundary, urutan lock, atau concurrency pattern.

Simpan trace ID dalam structured logs.

OpenTelemetry context propagation memungkinkan SDK menghubungkan trace dan log menggunakan Trace ID serta Span ID ketika instrumentasinya mendukung.

Tanpa korelasi ini, investigation bisa berubah menjadi pencocokan timestamp yang memakan waktu dan rentan salah.

Jangan Biarkan Asynchronous Flow Memutus Trace

Tracing synchronous HTTP cukup mudah dipahami.

Asynchronous workflow sering lebih menantang.

Misalnya:

Order Service → Kafka → Payment Worker → Email Worker

Message mungkin berada di queue selama beberapa detik sebelum diproses.

OpenTelemetry menjelaskan bahwa messaging system perlu meneruskan context agar aktivitas producer dan consumer dapat dikorelasikan. Message creation context dapat digunakan untuk mempertahankan hubungan sebab-akibat meskipun transaksi melewati perantara.

Jika propagation hilang, Payment Worker terlihat seperti operasi independen.

Tim kehilangan hubungan antara order awal dan proses pembayaran.

Periksa tracing pada queue producer, broker instrumentation jika tersedia, dan consumer.

Untuk fan-out atau workflow kompleks, span links juga bisa lebih tepat daripada memaksa hubungan parent-child sederhana.

Tujuannya adalah mempertahankan causal story dari transaksi.

Gunakan Sampling tanpa Kehilangan Trace Penting

Sistem dengan traffic besar tidak selalu mampu menyimpan 100% traces.

OpenTelemetry menjelaskan sampling sebagai mekanisme untuk mengurangi jumlah telemetry yang diproses dan disimpan. Jika mayoritas request sehat, subset yang tepat sering sudah cukup untuk observability.

Head sampling membuat keputusan saat trace dimulai.

Pendekatan ini efesien dan sederhana, tetapi belum mengetahui apakah trace nantinya akan mengalami error.

Tail sampling menunggu sebagian besar atau seluruh span selesai sebelum menentukan apakah trace disimpan.

Keuntungannya, tim dapat mempertahankan seluruh trace yang memiliki error atau latency tinggi sambil mengambil sebagian kecil traffic normal.

Misalnya:

100% error trace disimpan,
100% trace di atas dua detik disimpan,
5% trace sehat dipilih secara acak.

Strategi semacam ini menjaga data RCA bernilai tinggi tanpa membuat biaya storage tracing tumbuh tak terkendali.

Namun tail sampling membutuhkan infrastrktur yang lebih kompleks dan stateful, jadi terapkan sesuai skala nyata.

Hubungkan Trace dengan Versi Deployment

Banyak incident mempunyai hubungan langsung dengan perubahan kode.

Tambahkan service version, commit SHA, atau deployment identifier ke telemetry.

Bayangkan error mulai meningkat setelah pukul 09.32.

Trace gagal semuanya berasal dari payment-service version 4.18, sedangkan versi 4.17 tetap sehat.

Root-cause investigation langsung mempunyai kandidat kuat.

AWS merekomendasikan tracing dianalisis secara rutin untuk menemukan anomaly dan bottleneck serta menyertakan distributed tracing sebagai bagian dari observability workload.

Metadata deployment juga sangat membantu ketika menggunakan canary release.

Bandingkan trace versi lama dan baru pada request yang sama.

Jika canary memiliki database span tiga kali lebih lambat, rollout dapat dihentikan sebelum masalah menyebar.

Observability menjadi bagian dari deployment safety, bukan hanya alat setelah insiden terjadi.

Hindari Tiga Kesalahan Tracing yang Umum

Pertama, jangan menginstrumentasikan hanya sebagian service.

Trace yang berhenti sebelum dependency kritis membuat diagnosis kehilangan konteks. AWS bahkan menyebut inconsistent instrumentation sebagai anti-pattern distributed tracing.

Kedua, jangan membuat span untuk setiap fungsi kecil.

Terlalu banyak span menambah overhead dan noise.

Fokus pada service boundary, database call, external dependency, queue operation, dan proses bisnis penting.

Ketiga, jangan menganggap tracing menggantikan metrics dan logs.

Trace menjawab perjalanan satu request dengan sangat baik, tetapi metrics lebih tepat untuk melihat pola agregat dan logs memberi detail event.

Kombinasikan ketiganya.

Root cause biasanya ditemukan lebih cepat ketika engineer dapat bergerak dari alert → metric → trace → span → log tanpa kehilangan context di tengah jalan.

Cara Menggunakan Distributed Tracing untuk menemukan root cause membutuhkan alur investigasi yang disiplin: mulai dari symptom, pilih trace bermasalah, telusuri child span, lalu korelasikan dengan logs dan deployment metadata.

Gunakan sampling agar data tetap terkelola dan pastikan asynchronous flow tidak memutus context. Audit satu incident terbaru dan lihat apakah tracing Anda mampu menjelaskan penyebabnya tanpa tebakan.