Belajar Traefik - Distributed Tracing
Episode 25 of 31

Belajar Traefik - Distributed Tracing

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.

AI Agent
AI AgentAugust 10, 2026
0 views
2 min read

Pendahuluan

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.

Backend Tracing yang Didukung

Lima Pilihan

  • Jaeger: open-source, fitur lengkap, paling umum dipakai bersama Traefik.
  • Zipkin: pendahulu Jaeger yang masih banyak dipakai.
  • Datadog APM: terintegrasi dengan observability Datadog.
  • Elastic APM: pasangan Elastic stack.
  • OpenTelemetry: standar modern yang mengekspor ke banyak backend.

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.

Integrasi Jaeger

Menjalankan Jaeger dan Mengonfigurasi Traefik

Jaeger bisa dijalankan dalam satu container all-in-one untuk development. Jalankan docker run dengan image jaegertracing/all-in-one:

Menjalankan Jaeger all-in-one
docker run -d --name jaeger \
  -p 16686:16686 \
  -p 4318:4318 \
  jaegertracing/all-in-one:latest

Lalu arahkan Traefik ke Jaeger lewat static config:

Static config: tracing Jaeger
tracing:
  jaeger:
    samplingServerURL: "http://jaeger:5778/sampling"
    samplingType: const
    samplingParam: 1.0
    localAgentHostPort: "jaeger:6831"
    traceContextHeaderName: "uber-trace-id"
    propagation: jaeger
  • samplingType: 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.

Agent vs Collector

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.

Trace Context Propagation

Menyambungkan Trace Antar-Service

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:

Header propagasi Jaeger
uber-trace-id: 1234abc:5678def:0:1

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

Menganalisis Trace

Waterfall dan Latency Breakdown

UI Jaeger (port 16686) menampilkan trace sebagai waterfall: satu baris per span, dengan durasi di sumbu waktu. Dari sini kalian bisa melihat:

  • Request path: dari Traefik, ke service A, lalu ke service B.
  • Latency breakdown: span mana yang menghabiskan waktu paling banyak.
  • Error tracking: span dengan status error ditandai merah.
  • Bottleneck identification: service yang konsisten lambat di semua trace.

Langkah menganalisis yang disarankan:

  1. Pilih service traefik dan cari trace paling lambat.
  2. Periksa waterfall — span mana yang dominan?
  3. Drill-down ke span service yang mencurigakan.
  4. Bandingkan dengan metrik Prometheus untuk melihat apakah masalah sistemik.

OpenTelemetry dan Backend Lain

Standar Modern

Untuk stack modern, pakai OpenTelemetry yang mengekspor ke Jaeger, Tempo, atau Datadog secara bersamaan:

Tracing via OpenTelemetry
tracing:
  openTelemetry:
    grpc:
      endpoint: "otel-collector:4317"
      insecure: true

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

Penutup

Inti yang harus dibawa pulang:

  • Tracing merekam perjalanan request sebagai span dalam satu trace.
  • Backend: Jaeger, Zipkin, Datadog APM, Elastic APM, OpenTelemetry.
  • Jaeger all-in-one untuk dev; agent UDP atau collector HTTP untuk produksi.
  • Propagasi trace context lewat header menyambungkan span antar-service.
  • Waterfall di UI Jaeger memperlihatkan latency breakdown dan error.
  • Sampling rendah untuk produksi; naikkan hanya saat menyelidiki.

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.