سروس ٹریسنگ، اوپن ٹریسنگ اور جیگر

سروس ٹریسنگ، اوپن ٹریسنگ اور جیگر

ہم اپنے پروجیکٹس میں مائیکرو سرویس فن تعمیر کا استعمال کرتے ہیں۔ جب کارکردگی میں رکاوٹیں آتی ہیں تو لاگز کی نگرانی اور تجزیہ کرنے میں کافی وقت صرف ہوتا ہے۔ لاگ فائل میں انفرادی کارروائیوں کے اوقات کو لاگ ان کرتے وقت، یہ سمجھنا عام طور پر مشکل ہوتا ہے کہ ان کارروائیوں کی درخواست کی وجہ کیا ہے، مختلف خدمات میں کارروائیوں کی ترتیب یا ایک آپریشن کے وقت کی تبدیلی کا پتہ لگانا۔

دستی مشقت کو کم کرنے کے لیے، ہم نے ٹریسنگ ٹولز میں سے ایک استعمال کرنے کا فیصلہ کیا۔ اس بارے میں کہ آپ ٹریسنگ کا استعمال کیسے اور کیوں کر سکتے ہیں اور ہم نے یہ کیسے کیا، اور اس مضمون میں بحث کی جائے گی۔

ٹریسنگ سے کن مسائل کو حل کیا جا سکتا ہے۔

  1. ایک ہی سروس کے اندر اور تمام شریک خدمات کے درمیان عمل درآمد کے پورے درخت میں کارکردگی کی رکاوٹوں کو تلاش کریں۔ مثال کے طور پر:
    • خدمات کے درمیان لگاتار بہت سی مختصر کالیں، مثال کے طور پر، جیو کوڈنگ یا ڈیٹا بیس کو۔
    • طویل I/O انتظار، جیسے نیٹ ورک کی منتقلی یا ڈسک ریڈز۔
    • طویل ڈیٹا پارسنگ۔
    • طویل آپریشنز جن میں سی پی یو کی ضرورت ہوتی ہے۔
    • کوڈ کے ایسے حصے جن کی حتمی نتیجہ حاصل کرنے کی ضرورت نہیں ہے اور انہیں ہٹایا جا سکتا ہے یا اس میں تاخیر کی جا سکتی ہے۔
  2. واضح طور پر سمجھیں کہ کس ترتیب میں کیا کہا جاتا ہے اور جب آپریشن کیا جاتا ہے تو کیا ہوتا ہے۔
    سروس ٹریسنگ، اوپن ٹریسنگ اور جیگر
    یہ دیکھا جا سکتا ہے کہ، مثال کے طور پر، درخواست WS سروس کے پاس آئی -> WS سروس نے R سروس کے ذریعے ڈیٹا کی تکمیل کی -> پھر V سروس کو ایک درخواست بھیجی -> V سروس نے بہت سا ڈیٹا لوڈ کیا۔ R سروس -> P سروس پر گئی -> P سروس دوبارہ سروس میں گئی R -> سروس V نے نتیجہ کو نظر انداز کیا اور J -> سروس پر گیا اور تب ہی سروس WS کو جواب دیا، جبکہ اس میں کچھ اور حساب لگانا جاری رکھا۔ پس منظر.
    اس پورے عمل کے لیے اس طرح کے ٹریس یا تفصیلی دستاویزات کے بغیر، یہ سمجھنا بہت مشکل ہے کہ کوڈ کو پہلی بار دیکھتے وقت کیا ہو رہا ہے، اور کوڈ مختلف سروسز میں بکھرا ہوا ہے اور ڈبوں اور انٹرفیس کے ایک گروپ کے پیچھے چھپا ہوا ہے۔
  3. بعد میں موخر تجزیہ کے لیے پھانسی کے درخت کے بارے میں معلومات کا مجموعہ۔ عمل درآمد کے ہر مرحلے پر، آپ اس مرحلے پر دستیاب ٹریس میں معلومات شامل کر سکتے ہیں اور پھر یہ جان سکتے ہیں کہ کون سا ان پٹ ڈیٹا اسی طرح کے منظر نامے کا باعث بنا۔ مثال کے طور پر:
    • صارف کی شناخت
    • حقوق
    • منتخب طریقہ کی قسم
    • لاگ یا عمل درآمد کی خرابی۔
  4. نشانات کو میٹرکس کے ذیلی سیٹ میں تبدیل کرنا اور میٹرکس کی شکل میں پہلے سے ہی مزید تجزیہ۔

کیا ٹریس لاگ ان کر سکتے ہیں. اسپین

ٹریس کرنے میں اسپین کا تصور ہے، یہ کنسول کے لیے ایک لاگ کا ایک اینالاگ ہے۔ سپا میں ہے:

  • نام، عام طور پر اس طریقہ کار کا نام جس پر عمل کیا گیا تھا۔
  • اس سروس کا نام جس میں اسپین بنایا گیا تھا۔
  • اپنی منفرد 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 واپس آجائے گا جو کچھ نہیں کرتا ہے۔
مزید، موجودہ اسکوپ کو اسکوپ مینجر کے ذریعے ٹریسر سے حاصل کیا جاتا ہے، نئے اسپین کی بائنڈنگ کے ساتھ موجودہ سے ایک نیا دائرہ کار بنایا جاتا ہے، اور پھر تخلیق کردہ اسکوپ کو بند کردیا جاتا ہے، جو تخلیق شدہ اسپین کو بند کرتا ہے اور پچھلی اسکوپ کو واپس کرتا ہے۔ فعال ریاست. دائرہ کار ایک دھاگے سے منسلک ہے، اس لیے جب ملٹی تھریڈ پروگرامنگ کرتے ہیں، تو آپ کو ایکٹو اسپین کو دوسرے تھریڈ میں منتقل کرنا نہیں بھولنا چاہیے، تاکہ اس اسپین کے حوالے سے کسی اور تھریڈ کے دائرہ کار کو مزید فعال کیا جا سکے۔

io.opentracing.Tracer tracer = ...; // GlobalTracer.get()

void DoSmth () {
   try (Scope scope = tracer.buildSpan("DoSmth").startActive(true)) {
      ...
   }
}
void DoOther () {
    Span span = tracer.buildSpan("someWork").start();
    try (Scope scope = tracer.scopeManager().activate(span, false)) {
        // Do things.
    } catch(Exception ex) {
        Tags.ERROR.set(span, true);
        span.log(Map.of(Fields.EVENT, "error", Fields.ERROR_OBJECT, ex, Fields.MESSAGE, ex.getMessage()));
    } finally {
        span.finish();
    }
}

void DoAsync () {
    try (Scope scope = tracer.buildSpan("ServiceHandlerSpan").startActive(false)) {
        ...
        final Span span = scope.span();
        doAsyncWork(() -> {
            // STEP 2 ABOVE: reactivate the Span in the callback, passing true to
            // startActive() if/when the Span must be finished.
            try (Scope scope = tracer.scopeManager().activate(span, false)) {
                ...
            }
        });
    }
}

ملٹی تھریڈڈ پروگرامنگ کے لیے، TracedExecutorService اور اسی طرح کے ریپرز بھی ہیں جو خود بخود موجودہ اسپین کو تھریڈ پر بھیج دیتے ہیں جب غیر مطابقت پذیر کام شروع کیے جاتے ہیں:

private ExecutorService executor = new TracedExecutorService(
    Executors.newFixedThreadPool(10), GlobalTracer.get()
);

بیرونی HTTP درخواستوں کے لیے موجود ہے۔ TracingHttpClient

HttpClient httpClient = new TracingHttpClientBuilder().build();

جن مسائل کا ہم نے سامنا کیا۔

  • پھلیاں اور DI ہمیشہ کام نہیں کرتے ہیں اگر ٹریسر کسی خدمت یا جزو میں استعمال نہیں کیا جاتا ہے، پھر آٹو وائرڈ ہو سکتا ہے ٹریسر کام نہ کرے اور آپ کو GlobalTracer.ge() استعمال کرنا پڑے گا۔
  • تشریحات کام نہیں کرتی ہیں اگر یہ ایک جزو یا خدمت نہیں ہے، یا اگر طریقہ اسی کلاس کے پڑوسی طریقہ سے بلایا جاتا ہے۔ آپ کو یہ چیک کرنے میں محتاط رہنا ہوگا کہ کیا کام کرتا ہے اور اگر @Traced کام نہیں کرتا ہے تو دستی ٹریس تخلیق کا استعمال کریں۔ آپ جاوا تشریحات کے لیے ایک اضافی کمپائلر بھی منسلک کر سکتے ہیں، پھر انہیں ہر جگہ کام کرنا چاہیے۔
  • پرانے اسپرنگ اور اسپرنگ بوٹ میں، اوپن ٹرینگ اسپرنگ کلاؤڈ آٹو کنفیگریشن ڈی آئی میں کیڑے کی وجہ سے کام نہیں کرتی ہے، پھر اگر آپ چاہتے ہیں کہ اسپرنگ کے اجزاء میں موجود نشانات خود بخود کام کریں، تو آپ اس کے ساتھ مشابہت کے ساتھ کر سکتے ہیں۔ github.com/opentracing-contrib/java-spring-jaeger/blob/master/opentracing-spring-jaeger-starter/src/main/java/io/opentracing/contrib/java/spring/jaeger/starter/JaegerAutoConfiguration.java
  • وسائل کے ساتھ کوشش کرنا گرووی میں کام نہیں کرتا، آپ کو آخر میں کوشش کا استعمال کرنا چاہیے۔
  • ہر سروس کا اپنا spring.application.name ہونا چاہیے جس کے تحت نشانات لاگ کیے جائیں گے۔ فروخت اور ٹیسٹ کے لئے الگ الگ نام کیا ہے، تاکہ ان کے ساتھ مل کر مداخلت نہ ہو.
  • اگر آپ GlobalTracer اور tomcat استعمال کرتے ہیں، تو اس tomcat میں چلنے والی تمام سروسز میں ایک GlobalTracer ہے، لہذا ان سب کی سروس کا نام ایک ہی ہوگا۔
  • کسی طریقہ میں نشانات شامل کرتے وقت، آپ کو یہ یقینی بنانا ہوگا کہ اسے ایک لوپ میں کئی بار نہیں بلایا گیا ہے۔ تمام کالوں کے لیے ایک مشترکہ ٹریس شامل کرنا ضروری ہے، جو کام کے کل وقت کی ضمانت دیتا ہے۔ دوسری صورت میں، ایک اضافی بوجھ پیدا ہو جائے گا.
  • ایک بار jaeger-ui میں، بڑی تعداد میں نشانات کے لیے بہت بڑی درخواستیں کی گئی تھیں، اور چونکہ انھوں نے جواب کا انتظار نہیں کیا، اس لیے انھوں نے اسے دوبارہ کیا۔ نتیجے کے طور پر، jaeger-query نے بہت زیادہ میموری کھانے اور لچکدار کو سست کرنا شروع کر دیا۔ jaeger-query کو دوبارہ شروع کرنے سے مدد ملی

نمونے لینا، ذخیرہ کرنا اور نشانات دیکھنا

تین قسمیں ہیں۔ نمونے لینے کے نشانات:

  1. Const جو تمام نشانات بھیجتا اور محفوظ کرتا ہے۔
  2. امکانی جو کچھ دیے گئے احتمال کے ساتھ نشانات کو فلٹر کرتا ہے۔
  3. شرح کی حد بندی جو فی سیکنڈ نشانات کی تعداد کو محدود کرتی ہے۔ آپ ان ترتیبات کو کلائنٹ پر ترتیب دے سکتے ہیں، یا تو jaeger-agent پر یا کلکٹر پر۔ اب ہم valuator stack میں const 1 کا استعمال کرتے ہیں، کیونکہ بہت زیادہ درخواستیں نہیں ہیں، لیکن ان میں کافی وقت لگتا ہے۔ مستقبل میں، اگر یہ سسٹم پر ضرورت سے زیادہ بوجھ ڈالے گا، تو آپ اسے محدود کر سکتے ہیں۔

اگر آپ کیسینڈرا استعمال کرتے ہیں، تو پہلے سے طے شدہ طور پر یہ صرف دو دن کے لیے نشانات محفوظ کرتا ہے۔ ہم استعمال کر رہے ہیں۔ لچکدار تلاش اور نشانات ہر وقت محفوظ رہتے ہیں اور حذف نہیں ہوتے ہیں۔ ہر دن کے لیے ایک الگ انڈیکس بنایا جاتا ہے، مثال کے طور پر jaeger-service-2019-03-04۔ مستقبل میں، آپ کو پرانے نشانات کی خودکار صفائی کو ترتیب دینے کی ضرورت ہے۔

آپ کو درکار نشانات دیکھنے کے لیے:

  • وہ سروس منتخب کریں جس کے ذریعے آپ نشانات کو فلٹر کرنا چاہتے ہیں، مثال کے طور پر، tomcat7-default ایسی سروس کے لیے جو tomcat میں چل رہی ہے اور اس کا اپنا نام نہیں ہے۔
  • پھر آپریشن، وقت کا وقفہ اور کم از کم آپریشن کا وقت منتخب کریں، مثال کے طور پر 10 سیکنڈ سے، صرف لمبی سزائیں لینے کے لیے۔
    سروس ٹریسنگ، اوپن ٹریسنگ اور جیگر
  • نشانات میں سے ایک پر جائیں اور دیکھیں کہ وہاں کیا سست ہو رہی تھی۔
    سروس ٹریسنگ، اوپن ٹریسنگ اور جیگر

اس کے علاوہ، اگر کچھ درخواست آئی ڈی معلوم ہے، تو آپ ٹیگ کی تلاش کے ذریعے اس آئی ڈی کے ذریعے ٹریس تلاش کر سکتے ہیں، اگر یہ آئی ڈی ٹریس اسپین میں لاگ ان ہے۔

ریکارڈز

مضامین

ویڈیو

ماخذ: www.habr.com

نیا تبصرہ شامل کریں