Distributed Tracing And Jaeger

امروزه استفاده از معماری Microservice انتخاب بدیهی دولوپرها شده است. در معماری Microservice یک برنامه monolithic به گروهی از سرویس های دپلوی شده شکسته می شود.
زمانی که ما تعداد زیادی از این میکروسرویس های در هم تنیده و مرتبط با هم داشته باشیم، تقریبا رسم شمای کلی وابستگی ها و درک مستقیم نحوه اجرای یک درخواست غیر ممکن یا خیلی سخت و زمان بر می شود.

در صورت بروز خطا در یک برنامه monolithic ، درک مسیر درخواست و تجزیه و تحلیل علت اصلی خطا بسیار آسان تر است. اما در معماری microservice ،لاگ برنامه به تنهایی قادر به ارائه تصویر کامل مشکل نیست.

اوپن تریسینگ (Opentracing) یک استاندارد مانیتورینگ برای oss package ها یا اپلیکیشن ها می باشد که دولوپرها می توانند از آن برای مانیتورینگ میکروسرویس ها استفاده کنند.

مانیتورینگ و لاگ جایگاه بسیار ویژه ای در سیستم دارند اما هیچ کدام نمی توانند جای سیستم opentracing را بگیرند چرا که از زمان شروع یک درخواست تا دریافت یک پاسخ، یک مسیر بسیار پیچیده در سیستم وجود دارد که فقط یک سیستم distributed میتواند مانیتورینگ کل آن را انجام دهد.سیستم opentracing یک سیستم جدید نیست و بیش از یک دهه است که گوگل از آن استفاده میکند و پروژه هایی مانند Dapper و Zipkin را برای خود دولوپ کرده است.

در توصیف Opentracing از واژه instrumentation استفاده میشود چرا که همانند یک رهبر ارکستر یک هارمونی بین تمام میکروسرویس ها ایجاد می کند، بدین صورت که اگر از لحظه ارسال ریکوئست تا دریافت ریسپانس را یک مسیر در نظر بگیریم با استفاده از یک یونیک آیدی که در ابتدا ایجاد میشود میتوان تمام مراحل طی شده در سیستم را بررسی کرد و از این طریق latency پکت ها در سیستم و شمای کلی ارتباط بین میکرو سرویس ها را متوجه شویم.

برای جلوگیری از شکست این instrumentation به یک مکانیزم استاندارد و واحد نیاز داریم که در تمام مراحل causal chain را حفظ کند و رفتار سیستم را توصیف کند.

اوپن تریسینگ موارد زیر را استاندارد سازی می کند :

1- Standardized span management

2- Standardized inter-process propagation

3- Standardized active span management

4- Standardized in-band context encoding

5- Standardized out-of-band trace data enc



یگر (Jaeger) با الهام از Dapper و OpenZipkin یک سیستم تریسینگ توزیع شده است که توسط اوبر پیاده سازی شده و برای مانیتورینگ و ترابلشوتینگ میکروسرویس ها استفاده می شود:

  • Distributed context propagation
  • Distributed transaction monitoring
  • Root cause analysis
  • Service dependency analysis
  • Performance / latency optimization

اجزای اصلی Jaeger

Span‌

یک واحد منطقی از کار در Jaeger را نشان می دهد که دارای نام عملیات ، زمان شروع عملیات و مدت زمان آن است. Span ها ممکن است تو در تو قرار گرفته و برای مدل سازی روابط پیاده سازی شوند.


Trace

یک مسیر اجرایی یا دیتای سیستم است و میتوان به عنوان یک گراف چرخه ای از span ها در نظر گرفت.

Jaeger Client Libraries

پیاده سازی اختصاصی api های opentracing در زبان های برنامه نویسی است. یک instrumented service زمانی که یک ریکوئست دریافت کند یک span را ایجاد میکند و اطلاعات context که شامل trace id , span id و baggage است را به آن اتچ می کند. Baggage یک سری متادیتای اضافه است که دولوپر میتواند به span اضافه نماید.

Agent

یک دیمن شبکه ای است که span های ارسالی بر بستر udp را دریافت کرده و به صورت دسته ای به collector ارسال میکند. Agent به صورتی طراحی شده که به عنوان یک مولفه زیرساخت بر روی تمام هاست ها مستقر شود. Agent پیچیدگی روتینگ و دیسکاوری collector ها را از کلاینت مخفی می کند.

Collector

کالکتور تریس های ارسالی از agent را دریافت و آن ها را از طریق یک سری پایپ لاین های پردازشی اجرا می کند. در حال حاضر پایپ لاین ها تریس ها را ولیدیت، ایندکس گذاری و تغییرات لازم را اعمال میکنند و در نهایت آن ها را ذخیره می کنند. استوریج Jaeger یک پلاگین قابل اتصال است که در حال حاضر از Cassandra, Elasticsearch و Kafka پشتیبانی می کند.

Query

سرویس دریافت تریس ها از استوریج و نمایش آن ها در UI می باشد.

Ingester

سرویس جهت خواندن تاپیک های کافکا و نوشتن در سایر استوریج ها می باشد.

جهت پیاده سازی Jaeger از لینک زیر استفاده نمایید :

https://www.jaegertracing.io/docs/1.26/deployment/



Useful Links :

https://www.jaegertracing.io/docs/
https://medium.com/opentracing/take-opentracing-for-a-hotrod-ride-f6e3141f7941
https://medium.com/velotio-perspectives/a-comprehensive-tutorial-to-implementing-opentracing-with-jaeger-a01752e1a8ce
https://github.com/jaegertracing/jaeger