Jaeger ile İzleri Görselleştirmek
Jaeger Çalıştırmak
Jaeger bir dağıtık izleme sistemi — izleri toplayıp saklıyor ve onları bulup görselleştirmeniz için bir web arayüzü veriyor. Jaeger başlangıçta kendi veri biçimini kullanıyordu, ama OpenTelemetry'yi de destekliyor — ve Jaeger 2 doğrudan OpenTelemetry Collector üzerine kurulu.
Jaeger'ı üretim yapılandırmasında, farklı özellikler farklı süreçlerde çalışacak şekilde çalıştırabilirsiniz; veri deposunu değiştirebilir veya toplamayı tamponlamak için bir mesaj kuyruğu ekleyebilirsiniz.
Kaynaklar
- Jaeger mimarisi —
OpenTelemetry terminolojisiyle eşleme
- Uygulamaları OpenTelemetry ile ölçümlemek —
Jaeger tarafından toplanabilir
Jaeger'ı çalıştırmak
Jaeger'ı basit bir yapılandırmayla, tüm bileşenleri tek bir Docker container'ında çalışacak şekilde çalıştıracağız:
- jaeger.yml — bir tracing ağına bağlı ve varsayılan web
arayüzü portu olan 16686'yı yayınlayan bir Jaeger container'ı tanımlıyor
Jaeger'ı çalıştırın:
docker compose -f labs/jaeger/jaeger.yml up -dJaeger arayüzünü http://localhost:16686 adresinde açıp üstteki Search menüsüne basın. İzleri burada buluyorsunuz: Service açılır listesi Jaeger'a span göndermiş her servisi, Operation açılır listesi ise onların içindeki adlandırılmış işlemleri listeliyor.
Şu anda liste boş, çünkü Jaeger'a henüz hiçbir şey span göndermedi.
Bu lab'ın eski sürümü buraya Jaeger'ın kendi
jaeger-queryizlerine bakarak başlıyordu. Jaeger 2 kendisi hakkında çok daha az şey raporluyor: yeni açılmış bir container'da servis listesi gerçekten boş vejaegerservisi ancak gerçek span'ler akmaya başlayınca beliriyor. Yani ona span göndermeden bakacak bir şey yok — sırada bunu yapacağız.
Jaeger span'leri birkaç farklı biçimde kabul ediyor. Varsayılan yapılandırması OTLP (OpenTelemetry protokolü), eski Jaeger protokolleri ve Zipkin için alıcıları açık tutuyor — yani bunlardan herhangi biriyle ölçümlenmiş uygulamalar ek yapılandırma gerekmeden ona rapor edebiliyor.
Jaeger'a iz göndermek
Kullanacağımız demo uygulamasının, hepsi OpenTelemetry ile dağıtık izleme kurulmuş üç bileşeni var:
- apps.yml — web uygulaması, döküman servisi API'si ve bir
yetkilendirme servisi API'si için container'ları tanımlıyor. Hepsi iz span'lerini Jaeger container'ına gönderecek şekilde yapılandırılmış.
Uygulama container'larını çalıştırın:
docker compose -f labs/jaeger/apps.yml up -dWeb arayüzünün ana sayfasını http://localhost:8070 adresinde açın, sonra http://localhost:16686/search adresindeki Jaeger aramanızı yenileyin.
Servis listesinde artık
Fulfilment.Webgörmelisiniz.
📋 Web uygulamasına yapılan ana sayfa isteğinin izini açın. Bu izde kaç span var?
Biraz yardım lazım mı?
Arama arayüzünde Service alanını Fulfilment.Web, Operation alanını /
yapın. Find Traces tıklayın ve tek bir sonuç görmelisiniz.
O izi açıp ayrıntıları genişletin. Yalnızca bir span var: tarayıcı isteğinize verilen sunucu yanıtı.
İzler, Jaeger'ın topladığı span'lerden derleniyor. Hangi servisten ne beklendiğine dair önceden bir bilgi yok; her şey Jaeger'a ulaşan span'lerden geriye dönük kuruluyor.
Tek span'li bir iz tamamen geçerli — çağrı zincirinde başka HTTP isteği olmadığı anlamına geliyor.
Şimdi döküman listesi sayfasına dönüp, kullanıcı alanı için varsayılan değeri kullanarak Go düğmesine basın.
📋 Yeni isteğinizin izini bulun. Bunda daha fazla span var mı?
Biraz yardım lazım mı?
Jaeger aramasında çok daha fazla servis göreceksiniz. Hâlâ Fulfilment.Web
istiyoruz ama hangi işlemi istediğiniz her zaman belli olmuyor; bu yüzden
operation için all seçip Find Traces tıklayabilirsiniz.
İstediğiniz iz, birden fazla servisten birden fazla span ile listelenmiş olan.
İzi açıp ayrıntıları genişletin; uygulamalarınıza izleme eklemenin gerçek değerini göreceksiniz:

Üstteki grafik toplam iz süresini ve onun içinde her span'in süresini gösteriyor. Bu örnekte tüm istek 1.01 saniye sürmüş ve web uygulamasının iki ardışık HTTP çağrısı yaptığını net biçimde görebiliyorsunuz.
Grafiğin altında her span'in ayrıntıları var; etiketleri ve ek bilgileri görmek için genişletebilirsiniz.
Etiketler, ek ayrıntı kaydetmek için span'lerinize koyduğunuz anahtar-değer
çiftleri. Bazıları gelenekseldir ve bileşenler arasında ortak görürsünüz
(http.method, http.status_code, span.kind), ama koleksiyon serbest —
faydalı olan her şeyi ekleyebilirsiniz.
İz zaman çizelgesi en faydalı görünüm, ama sağ üstteki açılır listeden diğerlerine geçebilirsiniz:
- Trace Statistics — span'ler hakkında düşük seviyeli zamanlama ayrıntıları
- Trace JSON — tam ham veri
📋 Döküman listesini aldığınızda çağrı izi nasıl — ve çağrının hangi kısmı en çok zaman alıyor?
Biraz yardım lazım mı?
Tüm span'leri genişletin ve bol ayrıntı göreceksiniz:
- web uygulaması, kullanıcının düğmeye basmasıyla bir POST isteği alıyor
- bu en üstteki span; istemciye verilen sunucu yanıtı
- web uygulaması yetkilendirme servisini çağırıyor
- burada iki span var çünkü iki bileşen de iz yakalıyor — web
uygulamasından gelen client çağrısı ve yetkilendirme servisinden gelen sunucu yanıtı
- yetkilendirme servisi harici bir web adresini çağırıyor (aslında bir blog)
- burada tek span var, yetkilendirme servisinin client çağrısı; çünkü blog
sunucusundan iz ayrıntısı alamıyoruz
- web uygulaması döküman servisini çağırıyor
- burada da iki span var, iki bileşen de iz span'i kaydediyor: web
sunucusundan client çağrısı ve API sunucusundan server çağrısı
Hangi span'in baskın olduğu güne göre değişir. Kontrol etmediğiniz çağrı, https://blog.sixeyed.com adresine yapılan harici istek - bu lablar yazıldığında açık ara en yavaş olan oydu, yaklaşık bir saniye. Artık bir CDN arkasında önbellekleniyor ve çoğu zaman milisaniyeler içinde dönüyor; o durumda en uzun çağrı doküman API'sine yapılan oluyor. Bu değişkenlik, harici bağımlılığın neden izlenmeye değer olduğunu tam olarak gösteriyor.
Uygulama bileşenleri, gelen ve giden HTTP çağrıları için iz span'leri kaydedip göndermek üzere OpenTelemetry kütüphanelerini kullanıyor. Farklı teknolojiler kullanıyorlar (ASP.NET ve Spring Boot) ama iz biçimi aynı olduğu için Jaeger tüm span'leri doğru ize derleyebiliyor.
Uygulamaların hiçbirinde iz toplamak ve göndermek için fazladan koda ihtiyaç olmadı; yalnızca ölçümleme kütüphanesi bağlandı:
- .NET uygulamasında bu,
Tracing sınıfındaki
AddTracinguzantı metodunda yapılıyor
- Spring Boot uygulamasında kod olmadan,
pom.xml dosyasında referans verilen
opentracing-spring-jaeger-web-starterpaketi kullanılarak yapılıyor
Lab
Dağıtık izleme, aşina olmadığınız bir uygulamadaki özelliklerin iç yapısını keşfetmek için harika.
Web uygulamasındaki Submit document sayfasını açın ve sayfadaki varsayılan alan değerleriyle Go tıklayın.
Döküman gönderme işleminin çağrı yığınını çizmek için Jaeger'ı kullanın; dökümanı aslında hangi sınıfın hangi metodu oluşturuyor?
Takıldınız mı? İpuçlarına bakın veya çözümü inceleyin.
Temizlik
Bu lab'ın container'larını kaldırın:
docker compose -f labs/jaeger/jaeger.yml down
docker compose -f labs/jaeger/apps.yml downBu komut yalnızca bu lab'in baslattigi container'lari kaldırır. Tamamen temiz bir başlangıç istiyorsanız
docker psile hâlâ çalışan varsa görebilirsiniz.