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 از لینک زیر استفاده نمایید :
Useful Links :
مطلبی دیگر از این انتشارات
مدیریت حادثه؛ بخش دوم: آمادگی برای حادثه
مطلبی دیگر از این انتشارات
چطور در آروانکلاد با ساختمانداده و الگوریتمهای بهینه مشکل حجم زیاد اطلاعات را حل کردیم
مطلبی دیگر از این انتشارات
چطور در لاراول به شکلی درست کوئری خود را بر اساس URL Query String فیلتر کنیم