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:
- 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 — kenditrace_idbaşlığını uydurma. - Kuyruklarda aynı
traceparent’ı mesajla taşı. Mesajı publish ederkentraceparent’ı 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. - 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.
- Sampling’i akıllı seç.
parent-basedile 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. - 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
Yorumlar
Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.