İçeriğe geç
Muhammet Şafak
en
Soran: Ece Cevaplandı:

Mikroservislerde dağıtık izlemeyi (OpenTelemetry) nasıl kurarım?


Soru

Bir istek API Gateway → Auth → Sipariş → Stok sırasıyla geziyor. Aradaki bir serviste 800ms gecikmenin kaynağını bulmakta zorlanıyoruz. OpenTelemetry ile tüm servisler (Laravel ve Go) arasında `trace_id` taşıyıp merkezi APM'de (Jaeger/Grafana Tempo) görselleştirmeyi planlıyoruz. HTTP header'ları ve kuyruk mesajları üzerinden context propagation'ı nasıl tasarlarım?

Cevap

Kısa cevap: Custom bir şema icat etme; W3C Trace Context (traceparent/tracestate) üzerinde standartlaş ki PHP ve Go birbirini sorunsuz anlasın.

Senin asıl derdin “800ms nerede” — ve bunu görebilmek için trace’in servisler ve kuyruklar arasında kopmadan taşınması gerekiyor. Mekanizma şu:

  1. W3C Trace Context’i standart yap. Gateway’de kök span’i başlat; her servis gelen HTTP header’ından context’i extract etsin, giden çağrılara inject etsin. Standart başlık olduğu için Laravel ve Go aynı traceparent’ı ortak okur — kendi trace_id başlığını uydurma.
  2. Kuyruklarda aynı traceparent’ı mesajla taşı. Mesajı publish ederken traceparent’ı bir mesaj header’ı/attribute olarak ekle, worker’da yeniden extract et. Takımların unuttuğu tam olarak bu parçadır; yapmazsan asenkron sıçramalar APM’de orphan trace olarak görünür ve zincir kopar.
  3. Her servise OTel SDK koy, OTLP ile gönder. Servis → OTLP → bir Collector → Jaeger/Tempo. Collector’ı araya almak, export’u uygulamadan ayırır ve backend değiştirmeyi kolaylaştırır.
  4. Sampling’i akıllı seç. parent-based ile bir trace’in tüm span’leri aynı kaderi paylaşsın; üstüne tail sampling ekle ki 800ms’lik outlier’ları kesin tut. Head-only sampling’de tam da görmek istediğin yavaş trace’i atarsın.
  5. trace_id’yi elle örme. Kendi elinle header okuma/yazma kodu yazma; SDK’nın context propagation’ı bunu zaten taşır. Elle yapınca bir yerde unutursun ve trace o noktada kopar.

Sonuç: Ben olsam W3C Trace Context + OTel SDK + Collector + Tempo/Jaeger kurar, propagation’ı SDK’ya bırakır, kuyruk hop’unda traceparent’ı mesaj header’ına koymayı asla atlamazdım. Mimari muhakemeyi neden böyle kurduğunu sade.dev’de anlatıyorum; Go tarafındaki HTTP mekaniğinin detayını da hub yazısında bulursun. 800ms’i ancak kopmamış bir trace gösterir.

İlgili Yazılar

Etiketler: #mimari#gözlemlenebilirlik#mikroservis
Paylaş:

Yorumlar

Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.

Diğer Sorular

Tüm sorular

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi