Heavy Traffic Jaeger Architecture

Serdarcan Büyükdereli
Arabam Labs
Published in
5 min readDec 27, 2023

APM’ler Modern yazılım geliştirme süreçlerinde performans izleme ve hata ayıklama, kompleks sistemlerin yönetilmesinde kritik bir rol oynamaktadır. Bu noktada, Application Performance Monitoring (APM) alanındaki önemli bir araç olan Jaeger, Opensource yapısıyla dikkat çekiyor. Developerlar için etkili bir performans takip çözümü sunan Jaeger, CNCF tarafından desteklenen ve geliştirilen bir araç olarak, uygulamaların içerisindeki kompleksliği anlama ve optimize etme sürecinde önemli bir rol oynuyor. Bu makalede, Jaeger’ın APM dünyasındaki yeri, nasıl çalıştığı ve yapılara nasıl entegre edilebileceği üzerine detaylı bir inceleme yapacağız.

Bu üç başlıkta inceleyelim.

1- Neden Jaeger ?

OpenTelemetry

2- Jaegeri nasıl kurabiliriz ?

Jaeger Mimarisi

3- Applicationlara nasıl entegre edebiliriz ?

OpenTelemetry Automatic Instrumentation

OpenTelemetry Manual Instrumentation

Neden Jaeger ?

Jaeger, microservice mimarisinde performans izleme ve hata ayıklama için kullanılan güçlü bir açık kaynak tracing sistemidir.

İşte Jaeger’ın öne çıkan özellikleri:

CNCF ve Opensource

Jaeger opensource bir projedir. Ayrıca CNCF destekli bir projedir . Bu durum açıkcası diğer CNCF projeleriyle beraber entegre olmasını kolaylaştırıyor. Bu şekilde diğer Opensource yapılarıyla beraber kullanabiliyoruz.

Performans İzleme ve Analiz

Jaeger veya diğer APM tooları sistemdeki microservice ve diğer bileşenler arasındaki etkileşimleri izleyerek performans sorunlarını tespit etmenizi sağlar. Bu sayede uygulamanın performansını artırmak ve hata ayıklama süreçlerini hızlandırmak mümkün olur. Günümüzden örnek verirsek Network veya Host bazlı olmayan sıkıntılarda bizim kör olmamızı engellerler.

OpenTelemetry Desteklemesi

Jaeger, OpenTelemetry standartlarını destekler. OpenTelemetry, bir uygulamanın çeşitli bileşenlerinde (örneğin, dil bağımsız olarak) izleme verilerini toplamak ve standart bir formatta raporlamak için kullanılan bir API ve araç setidir. Jaeger’ın OpenTelemetry desteği, farklı dillerde yazılmış uygulamalardan gelen izleme verilerini tek bir yerde toplamanıza ve çözümlemenize yardımcı olur. OpenTelemetry ile direk trace, metrics, logs adımlarını Jaeger’e gönderilebilir.

Jaeger Nasıl bir Mimari ile Kurulmalı

Bu başlıkta Jaeger in Kubernetes üzerinde kurduğum yapıyı anlatmaya çalışacağım. Kubernetes Operator ile bu yapıyı kolayca sağlayabilirsiniz. Ayrıca helm ile kurulumu sağlayabilirsiniz.

1- Basit Mimari

Basit bir Jaeger Mimarisi

Elasticsearch veya Cassandra entegrasyonu yapılabilir . Tercihinize göre seçim yapabilirsiniz.

Ayrıca bu yapıdan daha basit All In One modundaki Jaeger kurulumu aşağıdan kaynaktan görebilirsiniz. Local ortamlarda veya test ortamlarında gönül rahatlığı ile kullanabilirsiniz.

Şimdi gelin biraz daha bu yapıyı geliştirelim.

2- Yüksek Trafik Mimarisi

Yüksek trafik durumlarında Jaeger collector ve Elasticsearch kısmında sıkıntılar yaşanabilir. Ayırdığınız kaynak vs duruma göre bu değişkenlik gösterecektir. Bunu toplamak için Jaeger ile kafkayı entegrasyonu yapılabilir .

Jaeger’in Github’taki yaptığı example da aslında Memory’e ekstra bir yük alıyor. Bu şekilde gelen yüksek trafiği rahat bir şekilde karşılayabiliyor.

Örnek olarak uygulayacağımız Jaeger Collector ile Elasticsearch arasına Kafka ve Jeager Ingester eklemek bu şekilde Elasticsearch’te yaşanan bir sıkıntıda Kafkada dataları belirli bir saat tutarak data kayıplarını engellemiş oluyoruz. Ayrıca Elasticsearch’teki yük durumuna bakarak rahat bir şekilde geç de olsa dataları yazabilecek durumda olur.

Jaeger Collector üstünden direk Kafka ya async olucak şekilde indexer a yazıyor o da direkt Elasticsearch’e yazıcak şekilde çalışıyor.

Metric arasına Ingester ve Kafka olmak üzerine 2 katman daha eklemiş olduk . Kafka Cluster kurulumu isterseniz zookeeper ile beraber kurun isterseniz kafka KRaft ile kurabilirsiniz. Önerim Zookeeper ile beraber kurmanız.

Bu yapıda artık Jaeger Collector’den direk olarak Elasticsearch’e yazmıyoruz. Kafka da bir topic e atıyoruz. Ingester Kafka topicten okuyup Elasticsearch’e yazıyoruz.

3- Jaeger SPM(Service Performance Monitoring)

Jaeger SPM (Service Performance Monitoring) üzerine bir UI sağlıyor. APM için böyle bir Dashboard olması gerektiğini düşünüyorum. Jaeger readonly olarak Dashboard’unda bunu versede Prometheusa atılan datalar ile Grafana’da kendinize hoş bir Dashboard sağlayabilirsiniz. Opensource’un en sevdiğim yanı bu işte esnek ! 🙂

Opentelemetry Collector’unu kullanmamız gerekiyor bu sayede Prometheus ile bu SpanMetricsleri Prometheus ile toplayıp Grafana’da izleyebiliyoruz. Ayrıca Jaeger UI da SPM arayüzünde de bize izin verdiği kadarını görebiliyoruz.

Yukarıdaki yapıdan esinlenerek bir yapı oluşturalım. Yapı da ekstra olarak eklenen toolar ;

  • OpenTelemetry Collector
  • Prometheus
  • Grafana(isteğe bağlı)
  • Microsim(isteğe bağlı)

Bu eklenen toolara göre Jaeger Query tarafında Prometheus endpointini belirtmemiz gerekiyor. Grafana’da isteğe bağlı bir dashboard oluşturabilirsiniz.

Yukarıdaki Şekildeki gibi bir mimari oluşturabilirsiniz bu şekilde SPM ve System Architecture kısmını aktif hale getirmiş olursunuz.

4- SPM + Kafka ile Jaeger

Yukarıda gösterilen mimarilerin hepsinin bir arada olduğunu düşünün. Bu şekilde hem yüksek trafikleri desteklenecek hemde SPM i rahat bir şekilde kullanmış olunacak.

Applicationlara nasıl entegre edebiliriz?

Jaeger kurulumunu bitirdikten sonra OpenTelemetry ile kullandığımız applicationların hepsini entegre edebiliriz. 2 adet entegre edeceğimiz şekilde olabilir.

  • Automatic Instrumentation
  • Manual Instrumentation

Bu iki yoldan birini kullanabilirsiniz.

Automatic Instrumentation

Kod değişikliklerine veya uygulamanın yeniden derlenmesine ihtiyaç duymadan bu yöntemde, agent çalışan uygulamaya bağlanır ve dataları Jaeger veya başka APM’lere gönderir.

Artıları:

  • Kod değişikliği gerektirmez.
  • Uygulama işleminin veya uç noktaların iyi bir şekilde kapsanmasını sağlar.
  • Zaman kazandırır.
  • Instrumentation’daki güncellemeler nedeniyle kod değişikliklerine olan ihtiyacı azaltır

Eksileri:

  • Tüm diller ve çerçeveler tarafından sağlanmamaktadır.
  • Manuel Instrumentation’da göre daha az esnek bir yöntemdir.
  • Genellikle yalnızca bir iz içindeki ilgili olaylara veya günlüklere ilişkin verileri yakalar.

Manual Instrumentation

OpenTelemetry libraryleri kod a ekleyerek manual olarak tracing , metrics veya logs’ları izleyebileceğin bir yapı ortaya çıkarılması gerekiyor.

Artıları:

  • Automatic Instrumentation desteklemeyen her yapı için tek çözümdür.
  • Esneklik ve veri kısmında tam kontrol developer’a aittir.

Eksileri:

  • Automatic Instrumentation’a göre daha zaman alıcıdır.
  • Entegrasyona göre ekstra yüke sebep olabilir.
  • Instrumentation değiştirilmesi uygulamanın yeniden derlenmesini gerektirebilir.

Özetle Automatic Instrumentation destekleyen her dil için kullanıması doğru geliyor Dockerfile a entegrasyonuna buradan bakabilirsiniz.

Applicationlar üstündeki yükleri test etmek ve hangisi daha verimli olduğunu anlamak için Jmeter ile testler yapılabilir.

Okuduğunuz için teşekkür ederim.

--

--