ہم اپنے پروجیکٹس میں مائیکرو سرویس فن تعمیر کا استعمال کرتے ہیں۔ جب کارکردگی میں رکاوٹیں آتی ہیں تو لاگز کی نگرانی اور تجزیہ کرنے میں کافی وقت صرف ہوتا ہے۔ لاگ فائل میں انفرادی کارروائیوں کے اوقات کو لاگ ان کرتے وقت، یہ سمجھنا عام طور پر مشکل ہوتا ہے کہ ان کارروائیوں کی درخواست کی وجہ کیا ہے، مختلف خدمات میں کارروائیوں کی ترتیب یا ایک آپریشن کے وقت کی تبدیلی کا پتہ لگانا۔
دستی مشقت کو کم کرنے کے لیے، ہم نے ٹریسنگ ٹولز میں سے ایک استعمال کرنے کا فیصلہ کیا۔ اس بارے میں کہ آپ ٹریسنگ کا استعمال کیسے اور کیوں کر سکتے ہیں اور ہم نے یہ کیسے کیا، اور اس مضمون میں بحث کی جائے گی۔
ٹریسنگ سے کن مسائل کو حل کیا جا سکتا ہے۔
ایک ہی سروس کے اندر اور تمام شریک خدمات کے درمیان عمل درآمد کے پورے درخت میں کارکردگی کی رکاوٹوں کو تلاش کریں۔ مثال کے طور پر:
خدمات کے درمیان لگاتار بہت سی مختصر کالیں، مثال کے طور پر، جیو کوڈنگ یا ڈیٹا بیس کو۔
طویل I/O انتظار، جیسے نیٹ ورک کی منتقلی یا ڈسک ریڈز۔
طویل ڈیٹا پارسنگ۔
طویل آپریشنز جن میں سی پی یو کی ضرورت ہوتی ہے۔
کوڈ کے ایسے حصے جن کی حتمی نتیجہ حاصل کرنے کی ضرورت نہیں ہے اور انہیں ہٹایا جا سکتا ہے یا اس میں تاخیر کی جا سکتی ہے۔
واضح طور پر سمجھیں کہ کس ترتیب میں کیا کہا جاتا ہے اور جب آپریشن کیا جاتا ہے تو کیا ہوتا ہے۔
یہ دیکھا جا سکتا ہے کہ، مثال کے طور پر، درخواست WS سروس کے پاس آئی -> WS سروس نے R سروس کے ذریعے ڈیٹا کی تکمیل کی -> پھر V سروس کو ایک درخواست بھیجی -> V سروس نے بہت سا ڈیٹا لوڈ کیا۔ R سروس -> P سروس پر گئی -> P سروس دوبارہ سروس میں گئی R -> سروس V نے نتیجہ کو نظر انداز کیا اور J -> سروس پر گیا اور تب ہی سروس WS کو جواب دیا، جبکہ اس میں کچھ اور حساب لگانا جاری رکھا۔ پس منظر.
اس پورے عمل کے لیے اس طرح کے ٹریس یا تفصیلی دستاویزات کے بغیر، یہ سمجھنا بہت مشکل ہے کہ کوڈ کو پہلی بار دیکھتے وقت کیا ہو رہا ہے، اور کوڈ مختلف سروسز میں بکھرا ہوا ہے اور ڈبوں اور انٹرفیس کے ایک گروپ کے پیچھے چھپا ہوا ہے۔
بعد میں موخر تجزیہ کے لیے پھانسی کے درخت کے بارے میں معلومات کا مجموعہ۔ عمل درآمد کے ہر مرحلے پر، آپ اس مرحلے پر دستیاب ٹریس میں معلومات شامل کر سکتے ہیں اور پھر یہ جان سکتے ہیں کہ کون سا ان پٹ ڈیٹا اسی طرح کے منظر نامے کا باعث بنا۔ مثال کے طور پر:
صارف کی شناخت
حقوق
منتخب طریقہ کی قسم
لاگ یا عمل درآمد کی خرابی۔
نشانات کو میٹرکس کے ذیلی سیٹ میں تبدیل کرنا اور میٹرکس کی شکل میں پہلے سے ہی مزید تجزیہ۔
کیا ٹریس لاگ ان کر سکتے ہیں. اسپین
ٹریس کرنے میں اسپین کا تصور ہے، یہ کنسول کے لیے ایک لاگ کا ایک اینالاگ ہے۔ سپا میں ہے:
نام، عام طور پر اس طریقہ کار کا نام جس پر عمل کیا گیا تھا۔
اس سروس کا نام جس میں اسپین بنایا گیا تھا۔
اپنی منفرد ID
کلید/قدر کی شکل میں کچھ قسم کی میٹا معلومات جو اس میں لاگ ان کی گئی ہیں۔ مثال کے طور پر، طریقہ کے پیرامیٹرز یا طریقہ غلطی کے ساتھ ختم ہوا یا نہیں۔
اس دورانیے کے لیے شروع اور اختتامی اوقات
پیرنٹ اسپین ID
ہر اسپین کو اسپین کلیکٹر کے پاس بھیج دیا جاتا ہے تاکہ اسے ڈیٹا بیس میں محفوظ کیا جا سکے اور جیسے ہی اس نے اپنا عمل مکمل کر لیا ہو۔ مستقبل میں، آپ پیرنٹ آئی ڈی کے ذریعے جڑ کر تمام اسپین کا درخت بنا سکتے ہیں۔ تجزیہ کرتے وقت، آپ تلاش کر سکتے ہیں، مثال کے طور پر، کچھ سروس میں تمام اسپینز جن میں کچھ وقت سے زیادہ وقت لگا۔ مزید، ایک مخصوص اسپین پر جا کر، اس دورانیے کے اوپر اور نیچے پورے درخت کو دیکھیں۔
Opentrace, Jagger اور ہم نے اسے اپنے پروجیکٹس کے لیے کیسے لاگو کیا۔
ایک مشترکہ معیار ہے۔ اوپنٹریس، جو بیان کرتا ہے کہ کس طرح اور کس چیز کو جمع کیا جانا چاہئے، کسی بھی زبان میں کسی مخصوص نفاذ سے منسلک کیے بغیر۔ مثال کے طور پر، جاوا میں، ٹریس کے ساتھ تمام کام عام Opentrace API کے ذریعے کیے جاتے ہیں، اور اس کے تحت، مثال کے طور پر، Jaeger یا ایک خالی ڈیفالٹ نفاذ جو کچھ بھی نہیں کرتا اسے چھپا نہیں سکتا۔
ہم استعمال کر رہے ہیں۔ آپکی ؤنی Opentrace کے نفاذ کے طور پر۔ یہ کئی اجزاء پر مشتمل ہے:
Jaeger-agent ایک مقامی ایجنٹ ہے جو عام طور پر ہر مشین پر انسٹال ہوتا ہے اور سروسز مقامی ڈیفالٹ پورٹ پر لاگ ان ہوتی ہیں۔ اگر کوئی ایجنٹ نہیں ہے، تو اس مشین پر تمام خدمات کے نشانات عام طور پر غیر فعال ہوتے ہیں۔
Jaeger-colector - تمام ایجنٹ اس کو جمع شدہ نشانات بھیجتے ہیں، اور یہ انہیں منتخب ڈیٹا بیس میں رکھتا ہے۔
ڈیٹا بیس ان کی ترجیحی کیسینڈرا ہے، لیکن ہم elasticsearch کا استعمال کرتے ہیں، کچھ دوسرے ڈیٹا بیسز کے لیے نفاذ اور ایک ان میموری پر عمل درآمد ہے جو ڈسک میں کچھ بھی محفوظ نہیں کرتا ہے۔
Jaeger-query ایک ایسی خدمت ہے جو ڈیٹا بیس میں جاتی ہے اور تجزیہ کے لیے پہلے سے جمع شدہ نشانات واپس کرتی ہے۔
Jaeger-ui نشانات کو تلاش کرنے اور دیکھنے کے لیے ایک ویب انٹرفیس ہے، یہ jaeger-query پر جاتا ہے
ایک علیحدہ جزو کو مخصوص زبانوں کے لیے اوپن ٹریس جیجر کا نفاذ کہا جا سکتا ہے، جس کے ذریعے اسپین کو jaeger-agent کو بھیجا جاتا ہے۔ جاوا میں جاگر کو جوڑنا io.opentracing.Tracer انٹرفیس کو نافذ کرنے کے لیے نیچے آتا ہے، جس کے بعد اس کے ذریعے تمام نشانات حقیقی ایجنٹ تک پہنچ جائیں گے۔
موسم بہار کے اجزاء کے لئے بھی، آپ منسلک کر سکتے ہیں opentracing-spring-Cloud-starter اور Jaeger سے عمل درآمد opentracing-spring-jaeger-Cloud-starter جو ان اجزاء سے گزرنے والی ہر چیز کے لیے خود بخود ٹریسنگ کو ترتیب دے گا، مثال کے طور پر کنٹرولرز کو HTTP کی درخواستیں، jdbc کے ذریعے ڈیٹا بیس کی درخواستیں، وغیرہ۔
جاوا میں لاگنگ کا پتہ لگاتا ہے۔
کہیں اوپر کی سطح پر، پہلا اسپین بنانا ضروری ہے، یہ خود بخود کیا جا سکتا ہے، مثال کے طور پر، اسپرنگ کنٹرولر کے ذریعے جب کوئی درخواست موصول ہوتی ہے، یا دستی طور پر اگر کوئی نہیں ہے۔ اس کے بعد اسے نیچے دائرہ کار کے ذریعے منتقل کیا جاتا ہے۔ اگر نیچے دیئے گئے طریقوں میں سے کوئی بھی اسپین کو شامل کرنا چاہتا ہے، تو یہ دائرہ کار سے موجودہ ایکٹیو اسپین لیتا ہے، ایک نیا اسپین بناتا ہے اور کہتا ہے کہ اس کا پیرنٹ نتیجہ میں آنے والا ایکٹو اسپین ہے، اور نئے اسپین کو فعال بناتا ہے۔ بیرونی خدمات کو کال کرتے وقت، موجودہ ایکٹو اسپین ان تک پہنچایا جاتا ہے، اور وہ سروسز اس اسپین کے حوالے سے نئے اسپین بناتی ہیں۔
تمام کام Tracer مثال کے ذریعے جاتا ہے، اگر DI میکانزم کام نہیں کرتا ہے تو آپ اسے DI میکانزم کے ذریعے، یا GlobalTracer.get () کو عالمی متغیر کے طور پر حاصل کر سکتے ہیں۔ پہلے سے طے شدہ طور پر، اگر ٹریسر کو شروع نہیں کیا گیا ہے، تو NoopTracer واپس آجائے گا جو کچھ نہیں کرتا ہے۔
مزید، موجودہ اسکوپ کو اسکوپ مینجر کے ذریعے ٹریسر سے حاصل کیا جاتا ہے، نئے اسپین کی بائنڈنگ کے ساتھ موجودہ سے ایک نیا دائرہ کار بنایا جاتا ہے، اور پھر تخلیق کردہ اسکوپ کو بند کردیا جاتا ہے، جو تخلیق شدہ اسپین کو بند کرتا ہے اور پچھلی اسکوپ کو واپس کرتا ہے۔ فعال ریاست. دائرہ کار ایک دھاگے سے منسلک ہے، اس لیے جب ملٹی تھریڈ پروگرامنگ کرتے ہیں، تو آپ کو ایکٹو اسپین کو دوسرے تھریڈ میں منتقل کرنا نہیں بھولنا چاہیے، تاکہ اس اسپین کے حوالے سے کسی اور تھریڈ کے دائرہ کار کو مزید فعال کیا جا سکے۔
ملٹی تھریڈڈ پروگرامنگ کے لیے، TracedExecutorService اور اسی طرح کے ریپرز بھی ہیں جو خود بخود موجودہ اسپین کو تھریڈ پر بھیج دیتے ہیں جب غیر مطابقت پذیر کام شروع کیے جاتے ہیں:
private ExecutorService executor = new TracedExecutorService(
Executors.newFixedThreadPool(10), GlobalTracer.get()
);
HttpClient httpClient = new TracingHttpClientBuilder().build();
جن مسائل کا ہم نے سامنا کیا۔
پھلیاں اور DI ہمیشہ کام نہیں کرتے ہیں اگر ٹریسر کسی خدمت یا جزو میں استعمال نہیں کیا جاتا ہے، پھر آٹو وائرڈ ہو سکتا ہے ٹریسر کام نہ کرے اور آپ کو GlobalTracer.ge() استعمال کرنا پڑے گا۔
تشریحات کام نہیں کرتی ہیں اگر یہ ایک جزو یا خدمت نہیں ہے، یا اگر طریقہ اسی کلاس کے پڑوسی طریقہ سے بلایا جاتا ہے۔ آپ کو یہ چیک کرنے میں محتاط رہنا ہوگا کہ کیا کام کرتا ہے اور اگر @Traced کام نہیں کرتا ہے تو دستی ٹریس تخلیق کا استعمال کریں۔ آپ جاوا تشریحات کے لیے ایک اضافی کمپائلر بھی منسلک کر سکتے ہیں، پھر انہیں ہر جگہ کام کرنا چاہیے۔
وسائل کے ساتھ کوشش کرنا گرووی میں کام نہیں کرتا، آپ کو آخر میں کوشش کا استعمال کرنا چاہیے۔
ہر سروس کا اپنا spring.application.name ہونا چاہیے جس کے تحت نشانات لاگ کیے جائیں گے۔ فروخت اور ٹیسٹ کے لئے الگ الگ نام کیا ہے، تاکہ ان کے ساتھ مل کر مداخلت نہ ہو.
اگر آپ GlobalTracer اور tomcat استعمال کرتے ہیں، تو اس tomcat میں چلنے والی تمام سروسز میں ایک GlobalTracer ہے، لہذا ان سب کی سروس کا نام ایک ہی ہوگا۔
کسی طریقہ میں نشانات شامل کرتے وقت، آپ کو یہ یقینی بنانا ہوگا کہ اسے ایک لوپ میں کئی بار نہیں بلایا گیا ہے۔ تمام کالوں کے لیے ایک مشترکہ ٹریس شامل کرنا ضروری ہے، جو کام کے کل وقت کی ضمانت دیتا ہے۔ دوسری صورت میں، ایک اضافی بوجھ پیدا ہو جائے گا.
ایک بار jaeger-ui میں، بڑی تعداد میں نشانات کے لیے بہت بڑی درخواستیں کی گئی تھیں، اور چونکہ انھوں نے جواب کا انتظار نہیں کیا، اس لیے انھوں نے اسے دوبارہ کیا۔ نتیجے کے طور پر، jaeger-query نے بہت زیادہ میموری کھانے اور لچکدار کو سست کرنا شروع کر دیا۔ jaeger-query کو دوبارہ شروع کرنے سے مدد ملی
امکانی جو کچھ دیے گئے احتمال کے ساتھ نشانات کو فلٹر کرتا ہے۔
شرح کی حد بندی جو فی سیکنڈ نشانات کی تعداد کو محدود کرتی ہے۔ آپ ان ترتیبات کو کلائنٹ پر ترتیب دے سکتے ہیں، یا تو jaeger-agent پر یا کلکٹر پر۔ اب ہم valuator stack میں const 1 کا استعمال کرتے ہیں، کیونکہ بہت زیادہ درخواستیں نہیں ہیں، لیکن ان میں کافی وقت لگتا ہے۔ مستقبل میں، اگر یہ سسٹم پر ضرورت سے زیادہ بوجھ ڈالے گا، تو آپ اسے محدود کر سکتے ہیں۔
اگر آپ کیسینڈرا استعمال کرتے ہیں، تو پہلے سے طے شدہ طور پر یہ صرف دو دن کے لیے نشانات محفوظ کرتا ہے۔ ہم استعمال کر رہے ہیں۔ لچکدار تلاش اور نشانات ہر وقت محفوظ رہتے ہیں اور حذف نہیں ہوتے ہیں۔ ہر دن کے لیے ایک الگ انڈیکس بنایا جاتا ہے، مثال کے طور پر jaeger-service-2019-03-04۔ مستقبل میں، آپ کو پرانے نشانات کی خودکار صفائی کو ترتیب دینے کی ضرورت ہے۔
آپ کو درکار نشانات دیکھنے کے لیے:
وہ سروس منتخب کریں جس کے ذریعے آپ نشانات کو فلٹر کرنا چاہتے ہیں، مثال کے طور پر، tomcat7-default ایسی سروس کے لیے جو tomcat میں چل رہی ہے اور اس کا اپنا نام نہیں ہے۔
پھر آپریشن، وقت کا وقفہ اور کم از کم آپریشن کا وقت منتخب کریں، مثال کے طور پر 10 سیکنڈ سے، صرف لمبی سزائیں لینے کے لیے۔
نشانات میں سے ایک پر جائیں اور دیکھیں کہ وہاں کیا سست ہو رہی تھی۔
اس کے علاوہ، اگر کچھ درخواست آئی ڈی معلوم ہے، تو آپ ٹیگ کی تلاش کے ذریعے اس آئی ڈی کے ذریعے ٹریس تلاش کر سکتے ہیں، اگر یہ آئی ڈی ٹریس اسپین میں لاگ ان ہے۔