سروس ٽريڪنگ، OpenTracing ۽ Jaeger

سروس ٽريڪنگ، OpenTracing ۽ Jaeger

اسان اسان جي منصوبن ۾ microservice فن تعمير استعمال ڪندا آهيون. جڏهن ڪارڪردگي جي رڪاوٽون ٿينديون آهن، گهڻو وقت خرچ ڪيو ويندو آهي نگراني ۽ لاگز کي پارس ڪرڻ. جڏهن انفرادي عملن جي وقتن کي لاگ فائل ۾ لاگ ان ڪيو وڃي، اهو عام طور تي اهو سمجهڻ ڏکيو آهي ته انهن عملن جي دعوت جو سبب ڇا ٿيو، عملن جي تسلسل کي ٽريڪ ڪرڻ يا مختلف خدمتن ۾ هڪ آپريشن جي وقت جي شفٽ کي ٻئي جي ڀيٽ ۾.

دستي مزدوري کي گھٽائڻ لاءِ، اسان ھڪ استعمال ڪرڻ جو فيصلو ڪيو ٽريسنگ ٽولز. انهي بابت ڪيئن ۽ ڇو توهان ٽريڪنگ استعمال ڪري سگهو ٿا ۽ اسان اهو ڪيئن ڪيو، ۽ هن مضمون ۾ بحث ڪيو ويندو.

ڪھڙا مسئلا ٽريسنگ سان حل ٿي سگھن ٿا

  1. ھڪڙي ھڪڙي خدمت جي اندر ۽ سڀني شرڪت ڪندڙ خدمتن جي وچ ۾ پوري عمل جي وڻ ۾ ڪارڪردگي جي رڪاوٽون ڳوليو. مثال طور:
    • خدمتن جي وچ ۾ ڪيترائي مختصر لڳاتار ڪال، مثال طور، جيوڪوڊنگ يا ڊيٽابيس ڏانهن.
    • ڊگھو I/O انتظار، جهڙوڪ نيٽ ورڪ ٽرانسفر يا ڊسڪ ريڊس.
    • ڊگھي ڊيٽا پارسنگ.
    • ڊگھي آپريشنن کي سي پي يو جي ضرورت آھي.
    • ڪوڊ جا حصا جيڪي حتمي نتيجا حاصل ڪرڻ جي ضرورت نه آھن ۽ ختم ڪري سگھجي ٿو يا دير ٿي سگھي ٿو.
  2. واضح طور تي سمجھو ته ڪھڙي ترتيب ۾ ڇا چئبو آھي ۽ ڇا ٿيندو آھي جڏھن آپريشن ڪيو ويندو آھي.
    سروس ٽريڪنگ، OpenTracing ۽ Jaeger
    اهو ڏسي سگھجي ٿو ته، مثال طور، درخواست WS سروس ڏانهن آئي -> WS سروس R سروس ذريعي ڊيٽا شامل ڪئي -> پوء V سروس کي درخواست موڪلي -> V سروس R کان تمام گهڻو ڊيٽا لوڊ ڪيو. خدمت -> پي سروس ڏانهن ويو -> پي سروس ٻيهر خدمت ڏانهن ويو R -> خدمت V نتيجو کي نظرانداز ڪيو ۽ خدمت J -> ڏانهن ويو ۽ صرف ان کان پوءِ سروس WS ڏانهن جواب واپس آيو، جڏهن ته ٻئي ۾ ڪجهه حساب ڪرڻ جاري رکندي. پس منظر.
    ان سڄي عمل لاءِ ڪنهن سراغ يا تفصيلي دستاويز جي بغير، اهو سمجهڻ ڏاڍو ڏکيو آهي ته ڇا ٿي رهيو آهي جڏهن ڪوڊ کي پهريون ڀيرو ڏسي رهيا آهيو، ۽ ڪوڊ مختلف خدمتن ۾ پکڙيل آهي ۽ بِن ۽ انٽرفيس جي هڪ گروپ جي پويان لڪيل آهي.
  3. بعد ۾ ملتوي ڪيل تجزيي لاءِ عمل جي وڻ بابت معلومات جو مجموعو. عمل جي هر مرحلي تي، توهان معلومات شامل ڪري سگهو ٿا ٽريس ۾ جيڪا هن اسٽيج تي موجود آهي ۽ پوءِ پتو لڳايو ته ڪهڙي انپٽ ڊيٽا هڪجهڙي منظرنامي جو سبب بڻيو. مثال طور:
    • استعمال ڪندڙ جي سڃاڻپ
    • حق
    • چونڊيل طريقي جو قسم
    • لاگ ان يا عمل جي غلطي
  4. نشانن کي ميٽرڪ جي سب سيٽ ۾ تبديل ڪرڻ ۽ اڳ ۾ ئي ميٽرڪس جي صورت ۾ وڌيڪ تجزيو.

ڪهڙو نشان لاگ ان ڪري سگهي ٿو. اسپان

ٽريڪنگ ۾ هڪ اسپان جو تصور آهي، هي هڪ لاگ جو هڪ اينالاگ آهي، ڪنسول ڏانهن. سپا آهي:

  • نالو، عام طور تي طريقي جو نالو جيڪو عمل ڪيو ويو
  • خدمت جو نالو جنهن ۾ اسپن ٺاهي وئي هئي
  • پنهنجي منفرد ID
  • ڪجهه قسم جي ميٽا معلومات هڪ اهم/قدر جي صورت ۾ جيڪا ان ۾ لاگ ان ڪئي وئي آهي. مثال طور، طريقو پيٽرولر يا طريقو غلطي سان ختم ٿيو يا نه
  • هن عرصي لاءِ شروع ۽ آخر وقت
  • والدين جي مدت جي سڃاڻپ

هر اسپان کي اسپن ڪليڪٽر ڏانهن موڪليو ويندو آهي جيئن ئي ان جي عمل کي مڪمل ڪيو وڃي، بعد ۾ جائزو وٺڻ لاءِ ڊيٽابيس ۾ محفوظ ڪيو وڃي. مستقبل ۾، توهان والدين جي سڃاڻپ سان ڳنڍڻ ذريعي سڀني اسپن جو هڪ وڻ ٺاهي سگهو ٿا. جڏهن تجزيو ڪيو، توهان ڳولي سگهو ٿا، مثال طور، ڪجهه خدمت ۾ سڀ اسپانس جيڪي ڪجهه وقت کان وڌيڪ ورتو. وڌيڪ، هڪ مخصوص اسپن ڏانهن وڃڻ سان، ڏسو سڄو وڻ مٿي ۽ هيٺان.

سروس ٽريڪنگ، OpenTracing ۽ Jaeger

Opentrace، Jagger ۽ ڪيئن اسان ان کي اسان جي منصوبن لاء لاڳو ڪيو

اتي هڪ عام معيار آهي کليل رستو، جيڪو بيان ڪري ٿو ته ڪيئن ۽ ڇا گڏ ڪيو وڃي، بغير ڪنهن ٻوليءَ ۾ ڪنهن مخصوص عمل جي نشاندهي ڪرڻ سان. مثال طور، جاوا ۾، نشانن سان گڏ سڀئي ڪم عام Opentrace API ذريعي ڪيا ويندا آهن، ۽ ان جي تحت، مثال طور، Jaeger يا هڪ خالي ڊفالٽ عمل جيڪو ڪجھ به نه لڪائي سگھي ٿو.
اسان استعمال ڪري رهيا آهيون جهانگر Opentrace جي عمل جي طور تي. اهو ڪيترن ئي حصن تي مشتمل آهي:

سروس ٽريڪنگ، OpenTracing ۽ Jaeger

  • Jaeger-agent هڪ مقامي ايجنٽ آهي جيڪو عام طور تي هر مشين تي نصب ڪيو ويندو آهي ۽ خدمتون ان ۾ لاگ ان ٿينديون آهن مقامي ڊفالٽ پورٽ تي. جيڪڏهن ڪو ايجنٽ نه آهي، ته پوء هن مشين تي سڀني خدمتن جا نشان عام طور تي معذور آهن
  • Jaeger-collector - سڀ ايجنٽ ان ڏانهن گڏ ڪيل نشان موڪليندا آهن، ۽ اهو انهن کي چونڊيل ڊيٽابيس ۾ رکندو آهي
  • ڊيٽابيس انهن جي پسنديده ڪئاسنڊا آهي، پر اسان استعمال ڪندا آهيون elasticsearch، اتي موجود آهن ڪجهه ٻين ڊيٽابيس لاءِ عمل درآمد ۽ هڪ ميموري تي عمل درآمد جيڪو ڊسڪ ۾ ڪجهه به محفوظ نٿو ڪري.
  • Jaeger-query هڪ خدمت آهي جيڪا ڊيٽابيس ڏانهن وڃي ٿي ۽ اڳ ۾ ئي گڏ ڪيل نشانن کي واپس ڪري ٿي تجزيو لاءِ
  • Jaeger-ui هڪ ويب انٽرفيس آهي جنهن جي ڳولا ۽ ڏسڻ جا نشان آهن، اهو jaeger-query ڏانهن وڃي ٿو

سروس ٽريڪنگ، OpenTracing ۽ Jaeger

هڪ الڳ جزو کي مخصوص ٻولين لاءِ Opentrace jaeger جي نفاذ کي سڏيو وڃي ٿو، جنهن ذريعي اسپن کي jaeger-agent ڏانهن موڪليو وڃي ٿو.
جاوا ۾ جاگر کي ڳنڍڻ io.opentracing.Tracer انٽرفيس کي لاڳو ڪرڻ لاءِ هيٺ اچي ٿو، جنهن کان پوءِ ان جي ذريعي سڀئي نشان حقيقي ايجنٽ ڏانهن اڏامي ويندا.

سروس ٽريڪنگ، OpenTracing ۽ Jaeger

بهار جي جزو لاء پڻ، توهان ڳنڍي سگهو ٿا opentracing- بهار- Cloud-starter ۽ Jaeger کان عمل درآمد اوپن ٽريڪنگ-بهار-جيگر-ڪلائوڊ-اسٽارٽر جيڪو خودڪار طريقي سان ترتيب ڏيندو هر شيءِ لاءِ ٽريڪنگ جيڪا انهن حصن مان گذري ٿي، مثال طور http ڪنٽرولرز کي درخواستون، jdbc ذريعي ڊيٽابيس کي درخواستون وغيره.

جاوا ۾ لاگنگ کي نشانو بڻايو

مٿين سطح تي ڪٿي، پهريون اسپان ضرور ٺاهيو وڃي، اهو خودڪار ٿي سگهي ٿو، مثال طور، اسپرنگ ڪنٽرولر طرفان جڏهن ڪا درخواست ملي ٿي، يا دستي طور تي جيڪڏهن ڪو به ناهي. اهو وري هيٺ ڏنل دائري ذريعي منتقل ڪيو ويو آهي. جيڪڏهن هيٺ ڏنل ڪو به طريقو هڪ اسپان کي شامل ڪرڻ چاهي ٿو، اهو دائري مان موجوده ActiveSpan وٺي ٿو، هڪ نئون Span ٺاهي ٿو ۽ چوي ٿو ته ان جو والدين نتيجو آهي ActiveSpan، ۽ نئين Span کي فعال بڻائي ٿو. جڏهن ٻاهرين خدمتن کي سڏيندو آهي، موجوده فعال مدت انهن ڏانهن منتقل ڪيو ويندو آهي، ۽ اهي خدمتون هن عرصي جي حوالي سان نوان اسپانس ٺاهيندا آهن.
سمورو ڪم Tracer مثال ذريعي ٿئي ٿو، توھان ان کي حاصل ڪري سگھو ٿا DI ميڪانيزم ذريعي، يا GlobalTracer.get () عالمي متغير جي طور تي جيڪڏھن DI ميکانيزم ڪم نٿو ڪري. ڊفالٽ طور، جيڪڏهن ٽريسر شروع نه ڪيو ويو آهي، 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();

اسان کي منهن ڏيڻ وارا مسئلا

  • Beans ۽ DI هميشه ڪم نه ڪندا آهن جيڪڏهن ٽريسر ڪنهن خدمت يا جزو ۾ استعمال نه ڪيو ويو آهي، پوء خودڪار وائرڊ Tracer ڪم نه ڪري سگھي ٿو ۽ توھان کي استعمال ڪرڻو پوندو 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، ته پوءِ ھن ٽام ڪيٽ ۾ ھلندڙ سڀ خدمتون ھڪڙو GlobalTracer آھي، تنھنڪري انھن سڀني جو نالو ساڳيو ھوندو.
  • جڏهن هڪ طريقي سان نشان شامل ڪيو وڃي، توهان کي پڪ ڪرڻ جي ضرورت آهي ته اهو لوپ ۾ ڪيترائي ڀيرا نه سڏيو وڃي. اهو ضروري آهي ته سڀني ڪالن لاء هڪ عام سراغ شامل ڪريو، جيڪو ڪم جي مجموعي وقت جي ضمانت ڏئي ٿو. ٻي صورت ۾، هڪ اضافي لوڊ پيدا ڪيو ويندو.
  • هڪ دفعي jaeger-ui ۾، وڏي تعداد ۾ نشانين لاءِ تمام وڏيون درخواستون ڪيون ويون، ۽ جيئن ته انهن جوابن جو انتظار نه ڪيو، انهن اهو ٻيهر ڪيو. نتيجي طور، jaeger-query تمام گهڻو ياداشت کائڻ شروع ڪيو ۽ لچڪدار کي سست ڪيو. jaeger-query کي ٻيهر شروع ڪرڻ ۾ مدد ڪئي وئي

نموني، ذخيرو ۽ ڏسڻ جا نشان

ٽي قسم آهن نموني جا نشان:

  1. Const جيڪو موڪلي ٿو ۽ سڀني نشانن کي محفوظ ڪري ٿو.
  2. امڪاني جيڪو ڪجهه ڏنل امڪانن سان نشانن کي فلٽر ڪري ٿو.
  3. Ratelimiting جيڪو محدود ڪري ٿو نشانن جو تعداد في سيڪنڊ. توھان انھن سيٽنگن کي ڪلائنٽ تي ترتيب ڏئي سگھو ٿا، يا ته jaeger-agent يا ڪليڪٽر تي. ھاڻي اسان استعمال ڪندا آھيون const 1 valuator stack ۾، ڇاڪاڻ ته اتي تمام گھڻيون درخواستون نه آھن، پر اھي گھڻو وقت وٺن ٿيون. مستقبل ۾، جيڪڏهن اهو سسٽم تي تمام گهڻو لوڊ ڪندو، توهان ان کي محدود ڪري سگهو ٿا.

جيڪڏهن توهان ڪئاسندرا استعمال ڪريو ٿا، پوء ڊفالٽ طور اهو صرف ٻن ڏينهن تائين نشانن کي محفوظ ڪري ٿو. اسان استعمال ڪري رهيا آهيون ڳولا ڪرڻ ۽ نشانيون هر وقت محفوظ ڪيون وينديون آهن ۽ ڊهي نه وينديون آهن. هر روز لاءِ هڪ الڳ انڊيڪس ٺاهيو ويو آهي، مثال طور jaeger-service-2019-03-04. مستقبل ۾، توهان کي پراڻي نشانن جي خودڪار صفائي کي ترتيب ڏيڻ جي ضرورت آهي.

نشانين کي ڏسڻ لاءِ توھان کي ضرورت آھي:

  • خدمت چونڊيو جنهن جي ذريعي توهان نشانن کي فلٽر ڪرڻ چاهيو ٿا، مثال طور، tomcat7-default هڪ خدمت لاءِ جيڪا ٽامڪيٽ ۾ هلي رهي آهي ۽ ان جو پنهنجو نالو ناهي.
  • پوءِ آپريشن چونڊيو، وقت جو وقفو ۽ گھٽ ۾ گھٽ آپريشن جو وقت، مثال طور 10 سيڪنڊن کان، رڳو ڊگھي سزائون وٺڻ لاءِ.
    سروس ٽريڪنگ، OpenTracing ۽ Jaeger
  • ھڪڙي نشان ڏانھن وڃو ۽ ڏسو ته اتي ڇا سست ٿي رھيو ھو.
    سروس ٽريڪنگ، OpenTracing ۽ Jaeger

انهي سان گڏ، جيڪڏهن ڪجهه درخواست جي سڃاڻپ معلوم ٿئي ٿي، ته پوء توهان هن id ذريعي هڪ ٽيگ ڳولا ذريعي ڳولي سگهو ٿا، جيڪڏهن هي سڃاڻپ ٽريڪ اسپن ۾ لاگ ان ٿيل آهي.

دستاويزي

مقالات

Видео

جو ذريعو: www.habr.com

تبصرو شامل ڪريو