Episode ini membahas distributed tracing: mengirim trace request lintas service dengan Jaeger, Zipkin, Datadog, dan OpenTelemetry, konfigurasi sampling strategy, agent versus collector, propagasi trace context, serta menganalisis latency breakdown dan error tracking di UI tracer.

Metrik memberi tahu bahwa ada request lambat; access log memberi tahu request yang mana. Tapi di mana tepatnya waktu hilang? Jawabannya ada di distributed tracing: teknik mengikuti satu request melewati semua service yang dia sentuh, merekam setiap pemberhentian dalam bentuk span, dan menyusunnya menjadi trace yang utuh.
Traefik adalah titik sempurna untuk memulai dan menyebarkan trace: setiap request masuk lewat Traefik, jadi trace yang dibuat di sini mencakup seluruh perjalanan request. Episode 25 membahas konfigurasi tracing Traefik ke berbagai backend dan cara membaca hasilnya.
Traefik v3 mendukung semuanya; pilihan ditentukan oleh stack observability yang sudah kalian miliki. Untuk episode ini kita pakai Jaeger karena mudah dijalankan dan kaya fitur.
Jaeger bisa dijalankan dalam satu container all-in-one untuk development. Jalankan docker run dengan image jaegertracing/all-in-one:
docker run -d --name jaeger \
-p 16686:16686 \
-p 4318:4318 \
jaegertracing/all-in-one:latestLalu arahkan Traefik ke Jaeger lewat static config:
tracing:
jaeger:
samplingServerURL: "http://jaeger:5778/sampling"
samplingType: const
samplingParam: 1.0
localAgentHostPort: "jaeger:6831"
traceContextHeaderName: "uber-trace-id"
propagation: jaegersamplingType: const dengan samplingParam: 1.0: sampe semua trace. Untuk produksi, turunkan ke 0.1 (10 persen) agar biaya storage terkendali.localAgentHostPort: alamat Jaeger agent. Traefik mengirim span ke agent ini.propagation: mekanisme propagasi trace context.Jaeger punya dua jalur penerimaan: agent (UDP, port 6831, ringan, dipasang dekat aplikasi) dan collector (HTTP, port 14268, untuk batch besar). Traefik mendukung keduanya. Untuk cluster besar, kirim langsung ke collector agar UDP tidak jadi bottleneck.
Agar satu request membentuk satu trace utuh, ID trace harus menyebar ke setiap service yang dilalui. Traefik membaca header propagasi dari klien dan menambahkan span-nya sendiri, lalu meneruskan header tersebut ke backend:
uber-trace-id: 1234abc:5678def:0:1Jika backend juga di-instrumentasi (misalnya dengan OpenTelemetry SDK), dia membaca header yang sama, membuat span-nya sendiri di bawah trace yang sama, dan meneruskan lagi ke service berikutnya. Hasilnya di UI Jaeger tampak sebagai satu waterfall yang saling menyambung, bukan potongan-potongan terpisah.
UI Jaeger (port 16686) menampilkan trace sebagai waterfall: satu baris per span, dengan durasi di sumbu waktu. Dari sini kalian bisa melihat:
Langkah menganalisis yang disarankan:
traefik dan cari trace paling lambat.Untuk stack modern, pakai OpenTelemetry yang mengekspor ke Jaeger, Tempo, atau Datadog secara bersamaan:
tracing:
openTelemetry:
grpc:
endpoint: "otel-collector:4317"
insecure: truePola ini mengirim span ke OpenTelemetry Collector, yang lalu menyalurkannya ke backend pilihan. Dengan satu konfigurasi, kalian bisa ganti backend tanpa menyentuh Traefik.
Warning
Sampling 100 persen terlihat menyenangkan tapi cepat membanjiri storage. Mulai dengan sampling 10 persen, lalu naikkan hanya pada service yang sedang diselidiki. Simpan samplingParam rendah sebagai default produksi.
Inti yang harus dibawa pulang:
all-in-one untuk dev; agent UDP atau collector HTTP untuk produksi.Di episode 26 selanjutnya kita memasuki fase production: high availability & clustering — menjalankan banyak instance Traefik secara stateless, sinkronisasi konfigurasi, berbagi acme.json untuk Let's Encrypt, load balancing di depan Traefik, dan health check /ping untuk load balancer eksternal.