Jaeger ile OpenTracing kullanarak Microservice tracing (Spring boot)






Selamlar,

Bu yaziyi Turkce klavyesi olmayan bir cihazdan yaziyorum... Bu nedenle yazinin cogunda ingilizce terimleri tercih edecegim.

Mikroservis ( Bundan sonra Microservice olarak kullanacagim) yaklasimi gunumuz yazilim dunyasinda kabul gormus ve farkli sektorlerdeki yazilim cozumleri icin en cok kullanilan yaklasimlardan olmus durumda...

Microservices vs Monolith gibi bir yazi olmayacagindan faydalari/eksiklerini incelemeyecegim. Yalniz microservice yaklasimindaki belki de en onemli konu olan tracing 'i ele alacagim.

Tracing Nedir?

Tracing'in ne oldugu aslinda isminde gizli. Tracing --> Takip etme (Iz surme). Uygulamanizdaki islemlerin takibi... Bir islemin hangi microservice'de baslayip hangisinde bittiginin izini surmeye tracing deniyor.

Peki Tracing neden  bu kadar onemli?

Eger bir monolith uygulamaniz varsa, bir islemin nerede baslayip bittigini takip etmeniz aslinda gayet kolaydir. Kodlar elinizin altindadir, istediginiz anda ilgili kod blogunu kullanan referanslara bakabilir... Veyahut debug aninda stack-trace ile islemin basladigi ve bittigi yere kadar hangi siniflardan gectigini hangi methodlara ugradini kolaylikla gorebilirsiniz. 

Ama eger bir microservice ortaminda kod gelistiriyorsaniz isleminiz birden fazla microservice ile iliski icinde olabilir... Islemin "Authentication" kismi A microservice'de "File interaction" kismi B Microservice'de... "DB interaction" kismi C microservice'de olabilir.. 

Bu durumda bir makinadan baska bir makinaya takibe devam etmeniz... Yani "Iz surmeniz" gerekmekte. Iste buna Tracing diyoruz :) Ve ustteki senaryo gibi nedenlerle cok onemli.

Gereksinimler (prerequisites)

Tutorial 'a baslamadan once su asagidakilere goz gezdirmenizi tavsiye ederim.
  1. Docker --> Temel docker bilgisi ve makinanizda hazirda olmasi. 
  2. Spring Boot --> Temel Spring boot bilgisi 
  3. IDE --> Eclipse.. STS... Veyahut IntelliJ.. Hangisini tercih ederseniz.
Not : Temel Docker bilgisi icin su yazima bakabilirsiniz:  Docker Nedir?

TL;DR  (Cok uzun yazi.. Ozetini gormek istiyorum)

  1. Spring Boot Application olustur
  2. OpenTracing & Jaeger ile entegre et.
  3. Jaeger'i local'de calistir.
  4. API' lar arasi gecisi simule et.
Codes : GitHub-Repo

1. Spring Boot 

Yeni bir Spring Boot projesi ile basliyoruz. Eger STS (Spring Tool Suite) kullanmiyorsaniz... https://start.spring.io/ sayfasindan spring projenizi olusturabilirsiniz. Ide olarak STS kullaniyorsaniz (https://spring.io/tools) direkt olarak yeni bir Spring Starter Projesi olusturun. 


Gerekli isimlendirmeleri yapiniz. Ve takip eden ekranda WEB seciniz.

Eger WEB checkbox'i ekranda yoksa Available: kutucugundan "WEB" dependency icin arama yapabilirsiniz. 

Hizli ve basit bir entegrasyon icin bir adet REST Controller olusturun. 

Gunun tarihini donen basit bir REST API yapalim

code: 


http://localhost:8080/date 'e gittiginizde asagidaki gibi bir sonuc gormeniz lazim 

Evet artik elimizde calisan bir REST API var. Bu uygulamayi bir docker container icinde calistirabiliriz ama su an o konuya girmeyecegim (Baska bir blog yazisi konusu olsun). 

Edit: 
O yaziyi da suradan okuyabilirsiniz  (Bu sefer ingilizce ama cok basit adimlar oldugu icin problem yasayacaginizi sanmiyorum)

2. OpenTracing & Jaeger 

Simdi gelelim engtegrasyona. Spring boot kullandigimiz icin bu adim gercekten cok kolay olacak. Yapacagimiz sey temel olarak ilgili dependency'leri eklemek ve kullanilmasini istedigimiz bean'(ler)i yaratmak.

Dependencies

Ben bu yaziyi yazarken kullandigim dependency icin guncel version 0.3.4 idi. Siz son guncel versiyonunu suradan kontrol edebilirsiniz : 



<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-web-starter</artifactId>
<version>0.3.4</version>
</dependency>
Bu sayede projemize OpenTracing'i eklemis olduk. Simdi sirada Jaeger...

<dependency>
<groupId>io.jaegertracing</groupId>
<artifactId>jaeger-client</artifactId>
<version>0.32.0</version>

</dependency>

Yine son version kontrolu icin : https://search.maven.org/artifact/io.jaegertracing/jaeger-client/

Dependency olayi tamam. Simdi bean'imizi yaratalim ve bu kismi da bitirmis olalim.

code:

3. Jaeger Dashboard (Local'de Jaeger calistiralim)

Artik Jaeger 'imizi calistirabiliriz. Bunun icin en hizli ve kolay yol olan Docker image'larini kullanacagiz. 

$ docker run -d --name jaeger \
  -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
  -p 5775:5775/udp \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 14268:14268 \
  -p 9411:9411 \
  jaegertracing/all-in-one:1.7

Bu adimdan sonra Jaeger artik su url'de calisiyor olacaktir

Versiyon icin kontrol etmeniz gereken link : https://www.jaegertracing.io/docs/1.7/getting-started/#all-in-one

Jaeger calisti ama uygulamamiz ile ilgili veri gostermesi icin uygulamanin bir islem (process) yapmis olmasi lazim. Bunun icin browser'dan uygulamaya bir GET istegi gonderebilirsiniz. Veya terminal'den curl ile de ayni islemi yapabilirsiniz.

curl http://localhost:8080/date
veyahut

Sonuc! 

Tebrikler! Su an microservice uygulamaniz OpenTracing kullanarak Jaeger ile trace edilebilir durumda ;)

Eger tracing olayinin kafaniza daha iyi yatmasini istiyorsaniz 4. Adim'a da goz atin. Farkli API'ler ile calisarak tracing'imizi daha anlamli hale getirecegiz (ki suan sadece tek bir API kullandigimiz icin tracing gercek bir ihtiyac degildi).



4. Birden fazla API ve Tracing

Ilk ornekte sadece tek bir REST EndPoint'e gittigimiz icin aslinda gercek anlamda bir Tracing ihtiyacimiz yoktu.

Simdi ise yeni bir Rest Service yaratip bu service uzerinden onceki servisimizi cagiracagiz. Bunun icin basit bir RestTemplate kullanabiliriz.

code:

Bu sefer de bu endPoint'e request atalim.

http://localhost:8080/hello



Simdi Dashboard'a geri donelim...




Burada 3 Span gorebilirsiniz. Detayina girdiginizde ise hangi adimlarin ne kadar surdugu.. Hangi ip ile iliskili oldugu.. Request bilgiler ve daha nicesini gorebilirsiniz :)

Detay bilgi istediginiz adimin uzerine tiklamaniz yeterli ;)


The END! 

(Optional)

Uygulamayi daha da iyi kavrayabilmek icin su sekilde genisletmenizi tavsiye ederim :

1. Bir Spring Boot uygulamasi daha olusturun.
2. Ayni sekilde bu uygulamayi da Jaeger ile entegre edin.
3. Yukaridaki ornegimizdeki API Call 'u kendi uygulamamiz yerine yeni yarattiginiz uygulamaya gonderin.

Daha da gelistirmek isterseniz uygulamalarinizi docker uzerinde calisacak hale getirip. Birbiri ile olan baglantilarini Eureka kullanarak yonetebilirsiniz ;) (bu da baska bir yazi konusu olsun)



Comments