JAEGER

Çiğdem Kadakoğlu
5 min readSep 28, 2020

--

Spring Boot-Jaeger

Herkese merhaba, bu yazıda Jaeger ve Jaeger ile uygulama nasıl trace edilir kısaca ondan bahsedeceğim.

Gophie

Öncelikle “distributed tracing” nedir bu kavrama bakalım. Distributed tracing i “dağıtık takip, izleme” olarak Türkçe’ye direk çevirebiliriz. Yazdığımız uygulamalarımızı izlememizi, bir hata olduğunda nerede olduğunu bulmamızı, sunucu taraflı sistemsel sıkıntıları bilmemizi, transactionların kapanıp kapanmadığını takip etmemizi sağlar.

Distributed Tracing Sisteme Neden İhtiyacımız var?

Bu soruya cevap vermeden önce Monolithic ve Microservice mimari nedir bunlara bakalım.

monolithic

Monolithic yapıyı tek bir parça yani bütün fonksiyonların aynı yerde olduğu, kodun kendi kendine yetebildiği bir mimari olarak düşünebiliriz. Bu yüzden yönetilebilirlik, log tracing, hangi servisin nereye gittiğini, transactionların nerede açılıp kapandığını bulmak daha kolay.

Oysaki günümüzde gelişen teknoloji ile microservice yapısına bakacak olursak, tek bir parçadan ziyade servisler farklı frameworklerde çalışabilir, istenilen yere deploy edilebilir.

microservice

Bu yüzden de microservicelerimiz arttıkça yönetilebilirlik, hata olduğu zamanlarda kısa sürede çözüm bulmak, servislerin hangi servisleri çağırdığını bilmek, sistemin nerede tıkandığını ve hata olduğunu görmek zorlaşır. İşte bu noktada bizim logları trace etmemiz için distributed tracing sistemlerinden birini kullanmamız gerekir.

Jaeger

Jaeger, Google tarafından geliştirilen Dapper ve OpenZipkin tarafından ilham alınmış, Yuri Shkuro öncülüğünde Uber Technologies tarafından open source olarak geliştirilmiş distributed tracing sistemdir. Backend componentleri Go programlama dili ile yazılmıştır. UI tarafı React/Javascript ile yazılmıştır. Storage backends olarak Cassandra 3.4+, ElasticSearch 5.x-6.x-7.x, Kafka ve memory storage i destekler. Bu storageleri kullanmak için Jaeger da SPAN_STORAGE_TYPE parametresinde belirtmemiz gerekir.

Jaeger’ın sağladıkları:

  • Root cause analizi yapmamızı sağlar.
  • Servis bağımlılıklarının analizini sağlar.
  • Performans/latency optimizasyonu sağlar.(latency: Uygulamalarda yaptığımız isteklerin networkden sunucuya gidene kadar olan zamanıdır.)
  • Microserviceleri izlememizi sağlar.
  • Microservice tabanlı distributed sistemlerde sorunu kısa sürede bulmamızı sağlar. Bu sistemlerde dev, test, prodtest, production gibi farklı ortamlar kullandığımız için debug etmemiz mümkün değil. Aynı şekilde microservice sistemlerinde servisleri scale ederken wide değil deep olarak ölçeklendiririz.

Jaeger’ın destek verdiği diller:

  • Go
  • Java
  • NodeJs
  • Python
  • C++
  • C#

Jaeger Basic Kavramlar

Span: Basic birimdir. İşlemlerin isimlerini, ne zaman başladıklarını, ne kadar sürdüklerini, tagları ve logları gösterir. Değerleri key-value şeklinde tutar.

  • http.status_code = 200
  • http.method = GET

Trace: Spanlardan oluşan data/execution path’dir.

Span-Trace Diagram

Agent: UDP üzerinden gönderilen spanları dinleyen network daemon’ıdır.

Collector: Jaeger agentlarından traceleri alır ve onları bir pipeline ile çalıştırır. Bu pipelinemız traceleri değerlendirir, onları indexler, herhangi bir dönüşüm gerekiyorsa onu yapar ve en sonunda bu traceleri storage da tutar.

Query: Storageden traceleri alan ve bunları UI ile gösteren servistir.

Ingester: Kafka kullandığımızda buradan gelenleri okur ve diğer storage backendlere(Cassandra, ElasticSearch) yazar.

Jaeger Kurulum

https://github.com/jaegertracing/jaeger/releases adresinden hangi işletim sistemi ve versiyonu için kuracaksanız buradan indirip kurabilirsiniz. all-in-one olarak kurduğunuzda memory-storage componenti ile Jaeger ui, agent, collector, query için ayrı ayrı kurulum yapmanıza gerek kalmıyor.

Windows :

jaeger windows

Command prompt u açıp indirdiğiniz dizindeki jaeger-all-in-one.exe yi çalıştırdığınız an jaeger 16686 portunda çalışacaktır.

jaeger windows

Browser dan http://localhost:16686 url inden Jaeger UI na erişebilirsiniz.

Linux:

Linux sunucumuzda UI ı açmak için firewalld yi isterseniz stop-disable edip çalıştırabilirsiniz isterseniz de 16686 portunu tcp olarak açabilirsiniz.

cd /tmp && wget -O jaeger-1.19.2.tar.gz “https://github.com/jaegertracing/jaeger/releases/download/v1.19.2/jaeger-1.19.2-linux-amd64.tar.gz" && tar -zxf jaeger-1.19.2.tar.gzsudo firewall-cmd — zone=public — permanent — add-port=16686/tcpsudo firewall-cmd — reloadcd jaeger-1.19.2-linux-amd64./jaeger-all-in-one

Docker:

docker run -d --name jaeger \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
-p 14250:14250 \
-p 9411:9411 \
jaegertracing/all-in-one:1.19
Jaeger UI

Şimdi daha iyi anlamak adına örnek üzerinden gidecek olursak bir tane spring boot uygulamamız olsun. Bunu Jaeger’a nasıl entegre ederiz ona bakalım. Git Bash ile aşağıdaki komutu çalıştırarak projemizi indirip Eclipse’e Existing Maven Projects olarak import edelim.

git clone https://github.com/cidokimi/springboot-jaeger.git -b dev

Daha sonra ise uygulamamızı “Run” ile çalıştıralım. Jaeger’ı uygulamamıza eklerken iki yerde değişiklik yapıyoruz. Bunlar: pom.xml ve JaegerApplication.java.

pom.xml

<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-web-autoconfigure</artifactId>
<version>0.0.4</version>
</dependency>
<dependency>
<groupId>com.uber.jaeger</groupId>
<artifactId>jaeger-core</artifactId>
<version>0.18.0</version>
</dependency>

JaegerApplication.java

@Bean
public io.opentracing.Tracer jaegerTracer(){
return new Configuration("spring-boot",new Configuration.SamplerConfiguration(ProbabilisticSampler.TYPE,1),
new Configuration.ReporterConfiguration()).getTracer();
}

Uygulamamızı çalıştırdıktan sonra şimdi browserdan ya da curl ile istek gönderelim.

http://localhost:8081/hello

Jaeger UI a geri dönelim. Jaeger’da Services kısmında Spring-boot uygulamamızın geldiğini görüyoruz.

jaeger-springbootapp

Burada “Find Traces” dediğimiz zaman biraz önce yaptığımız servis çağrısının ne kadar sürede gerçekleştiğini, http methodunu, url ini, hangi hosttan ve ip ile yapıldığını görüyoruz.

jaeger-springbootapp

Şimdi ise birden fazla span görmek adına uygulamamızda başka bir methodu çağıralım.

http://localhost:8081/spanTospan

Şu an 3 tane spanımız var. İlk başta spanTospan methodu çağrılıyor ve spanTospan methodundan hello methodu çağrılıyor. Bu çağırma işlemlerinin ne kadar sürede bittiğini ve toplam işlemimizin ne kadar sürede bittiğini yukarıdaki ekran görüntüsü ile görmüş oluyoruz.

Hiç olmayan bir sayfayı çağırmayı denediğimizde ise Jaeger’daki spana baktığımızda http.status_code olarak 404 dönmüş oluyor.

http://localhost:8081/deneme

jaeger-springbootapp

Bu arada Jaeger’a alternatif olarak Zipkin’e de bakabilirsiniz.

Umarım faydalı bir yazı olmuştur. Her türlü önerinizi ve sorunuzu bana bildirmekten ve sormaktan çekinmeyin lütfen.

Herkese iyi günler diliyorum!

--

--

Çiğdem Kadakoğlu

Docker Captain🐳🇹🇷👩‍✈️ | Microsoft MVP | Instructor | Senior Cloud&DevOps Engineer | CK{A|AD}-AZ{104|204|305|400|800|801|900}-DP900-AI{900|102}-PL900🐧🐳🌼☕