د خدماتو تعقیب، OpenTracing او Jaeger

د خدماتو تعقیب، OpenTracing او Jaeger

موږ په خپلو پروژو کې د مایکرو سرویس جوړښت کاروو. کله چې د فعالیت خنډونه رامینځته کیږي ، ډیر وخت د لاګونو نظارت او تحلیل کولو مصرف کیږي. کله چې د انفرادي عملیاتو وخت د لاګ فایل ته ننوځي، دا معمولا ستونزمن وي چې پوه شي چې د دې عملیاتو غوښتنه څه ده، د عملونو ترتیب یا په مختلفو خدماتو کې د یو عملیات د وخت بدلون تعقیب کول.

د لاسي کار کمولو لپاره ، موږ پریکړه وکړه چې د تعقیب وسیلو څخه یو وکاروو. د دې په اړه چې څنګه او ولې تاسو کولی شئ ټریسینګ وکاروئ او موږ دا څنګه ترسره کړل، او پدې مقاله کې به بحث وشي.

کومې ستونزې د تعقیب سره حل کیدی شي

  1. د فعالیت خنډونه ومومئ دواړه په یو واحد خدمت کې او د ټولو برخه اخیستونکو خدماتو ترمینځ د اجرا کولو ونې کې. د مثال په ډول:
    • د خدماتو تر مینځ ډیری لنډ پرله پسې زنګونه، د بیلګې په توګه، جیوکوډینګ یا ډیټابیس ته.
    • اوږد I/O انتظار، لکه د شبکې لیږد یا ډیسک لوستل.
    • اوږده ډاټا تجزیه کول.
    • اوږد عملیات چې cpu ته اړتیا لري.
    • د کوډ هغه برخې چې د وروستۍ پایلې ترلاسه کولو لپاره اړتیا نلري او لرې یا ځنډول کیدی شي.
  2. په واضح ډول پوه شئ چې په کوم ترتیب کې څه ویل کیږي او څه پیښیږي کله چې عملیات ترسره کیږي.
    د خدماتو تعقیب، OpenTracing او Jaeger
    دا لیدل کیدی شي چې د مثال په توګه، غوښتنه د WS خدمت ته راغله -> د WS خدمت د R خدمت له لارې ډیټا اضافه کړه -> بیا د V خدمت ته غوښتنه واستوله -> د V خدمت د R څخه ډیری ډیټا پورته کړه. خدمت -> د P خدمت ته لاړ -> د P خدمت بیا خدمت ته لاړ R -> خدمت V پایله یې له پامه غورځولې او J -> خدمت ته لاړ او یوازې بیا یې د WS خدمت ته ځواب بیرته ورکړ ، پداسې حال کې چې په بل څه حساب کولو ته دوام ورکوي. پس منظر
    د ټولې پروسې لپاره د داسې ټریس یا تفصيلي اسنادو پرته، دا خورا ستونزمن کار دی چې پوه شي چې څه پیښیږي کله چې د لومړي ځل لپاره کوډ وګورئ، او کوډ په مختلفو خدماتو کې ویشل شوی او د ډنډونو او انٹرفیسونو تر شا پټ دی.
  3. د وروستي ځنډول شوي تحلیل لپاره د اعدام ونې په اړه د معلوماتو راټولول. د اجرا کولو په هره مرحله کې، تاسو کولی شئ هغه ټریس ته معلومات اضافه کړئ چې پدې مرحله کې شتون لري او بیا معلومه کړئ چې کوم ان پټ ډاټا د ورته سناریو لامل شوی. د مثال په ډول:
    • کارن نوم
    • حقوق
    • د ټاکل شوي میتود ډول
    • د ننوتلو یا اجرا کولو تېروتنه
  4. د نښو بدلول د میټریکونو فرعي سیټ ته او نور تحلیل دمخه د میټریک په شکل کې.

کوم ټریس کولی شي ننوځي. سپان

په تعقیب کې د سپان مفهوم شتون لري، دا د یو لاګ انلاګ دی، کنسول ته. سپا لري:

  • نوم، معمولا د هغه میتود نوم چې اعدام شوی و
  • د خدمت نوم په کوم کې چې دوره جوړه شوې وه
  • خپل ځانګړی ID
  • یو ډول میټا معلومات د کلیدي / ارزښت په بڼه چې په دې کې ننوتل شوي وي. د مثال په توګه، د میتود پیرامیټونه یا میتود د یوې تېروتنې سره پای ته رسیدلی یا نه
  • د دې مودې لپاره د پیل او پای وختونه
  • د مور او پلار ID

هر سپان د سپان راټولونکي ته لیږل کیږي ترڅو په ډیټابیس کې د وروسته بیاکتنې لپاره زیرمه شي کله چې دا خپل اجرا بشپړ کړي. په راتلونکي کې، تاسو کولی شئ د والدین ID لخوا وصل کولو سره د ټولو سپینو ونې جوړ کړئ. کله چې تحلیل کوئ، تاسو کولی شئ ومومئ، د بیلګې په توګه، په ځینو خدماتو کې ټول سپانونه چې د یو څه وخت څخه ډیر وخت نیسي. برسېره پر دې، د یوې ځانګړې دورې ته په تګ سره، د دې دورې پورته او لاندې ټوله ونه وګورئ.

د خدماتو تعقیب، OpenTracing او Jaeger

Opentrace، Jagger او څنګه موږ دا زموږ د پروژو لپاره پلي کړل

یو عام معیار شتون لري خلاص ځای, کوم چې تشریح کوي چې څنګه او څه باید راټول شي، پرته له دې چې په هره ژبه کې د ځانګړي پلي کولو سره تړل شوي وي. د مثال په توګه، په جاوا کې، د ټریسونو سره ټول کار د عام Opentrace API له لارې ترسره کیږي، او د هغې لاندې، د بیلګې په توګه، Jaeger یا یو خالي ډیفالټ تطبیق چې هیڅ شی نه پټوي.
موږ کاروو ښکار د Opentrace د تطبیق په توګه. دا د څو برخو څخه جوړه ده:

د خدماتو تعقیب، OpenTracing او Jaeger

  • Jaeger-agent یو محلي اجنټ دی چې معمولا په هر ماشین کې نصب کیږي او خدمات په محلي ډیفالټ بندر کې ننوتل کیږي. که چیرې اجنټ شتون ونلري، نو په دې ماشین کې د ټولو خدماتو نښې معمولا غیر فعال وي
  • Jaeger-collector - ټول اجنټان راټول شوي نښې دې ته لیږي، او دا یې په ټاکل شوي ډیټابیس کې اچوي
  • ډیټابیس د دوی غوره شوی کاسندرا دی ، مګر موږ elasticsearch کاروو ، د یو څو نورو ډیټابیسونو لپاره پلي کول شتون لري او په حافظه کې پلي کول چې ډیسک ته هیڅ شی نه خوندي کوي.
  • Jaeger-query یو خدمت دی چې ډیټابیس ته ځي او د تحلیل لپاره دمخه راټول شوي نښې بیرته راوړي
  • Jaeger-ui د نښو لټون او لیدلو لپاره ویب انٹرفیس دی، دا د jaeger-Query ته ځي

د خدماتو تعقیب، OpenTracing او Jaeger

یو جلا برخې ته د ځانګړو ژبو لپاره د اوپنټریس جیجر پلي کول ویل کیدی شي، د کوم له لارې سپانونه د جیجر ایجنټ ته لیږل کیږي.
په جاوا کې د جاګر سره نښلول د io.opentracing.Tracer انٹرفیس پلي کولو ته راځي، وروسته له دې چې د هغې له لارې ټولې نښې به اصلي اجنټ ته الوتنه وکړي.

د خدماتو تعقیب، OpenTracing او Jaeger

همدارنګه د پسرلي برخې لپاره، تاسو کولی شئ اړیکه ونیسئ opentracing-spring-Cloud-starter او د جیجر څخه پلي کول opentracing-spring-jaeger-Cloud-starter کوم چې به په اوتومات ډول د هر هغه څه لپاره تعقیب تنظیم کړي چې د دې برخو څخه تیریږي ، د مثال په توګه د کنټرولرانو ته HTTP غوښتنې ، د jdbc له لارې ډیټابیس ته غوښتنې ، او داسې نور.

په جاوا کې د ننوتلو نښه کول

چیرته چې په پورتنۍ کچه کې، لومړی سپان باید رامینځته شي، دا په اتوماتيک ډول ترسره کیدی شي، د بیلګې په توګه، د پسرلي کنټرولر لخوا کله چې غوښتنه ترلاسه شي، یا په لاسي ډول که چیرې شتون نلري. دا بیا د لاندې ساحې له لارې لیږدول کیږي. که لاندې کومه طریقه وغواړي چې یو Span اضافه کړي، دا د سکوپ څخه اوسنی فعال سپان اخلي، یو نوی سپان جوړوي او وايي چې د هغې اصلي پایله فعال سپان دی، او نوی سپان فعالوي. کله چې بهرني خدماتو ته زنګ ووهئ، اوسنی فعاله موده دوی ته لیږدول کیږي، او دا خدمتونه د دې مودې په حواله نوي سپانونه رامینځته کوي.
ټول کار د Tracer مثال له لارې پرمخ ځي، تاسو کولی شئ دا د DI میکانیزم له لارې ترلاسه کړئ، یا GlobalTracer.get () د نړیوال متغیر په توګه که د DI میکانیزم کار نه کوي. په ډیفالټ کې ، که ټرسر پیل شوی نه وي ، نوپ ټریسر به بیرته راشي کوم چې هیڅ نه کوي.
برسېره پر دې، اوسنی سکوپ د ټرسر څخه د ScopeManager له لارې ترلاسه کیږي، د اوسني سکپ څخه د نوي span په پابند کولو سره یو نوی سکوپ رامینځته کیږي، او بیا رامینځته شوی ساحه تړل کیږي، کوم چې رامینځته شوی پین بندوي او پخوانی سکوپ بیرته راګرځوي. فعال حالت. دائره له یوې تار سره تړلې ده، نو کله چې څو-تریډ شوي پروګرامونه، تاسو باید هیر نکړئ چې د فعال سپان بل تار ته انتقال کړئ، د دې دورې په حواله د بل تار د ساحې د لا فعالولو لپاره.

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 تل کار نه کوي که چیرې ټرسر په خدمت یا برخې کې نه کارول کیږي نو بیا اتوماتیک شوی Tracer ممکن کار ونکړي او تاسو باید د GlobalTracer.ge().
  • تشریحات کار نه کوي که چیرې دا یوه برخه یا خدمت نه وي، یا که میتود د ورته ټولګي د ګاونډی میتود څخه بلل کیږي. تاسو باید محتاط اوسئ چې وګورئ چې څه کار کوي او د لارښود ټریس رامینځته کول وکاروئ که @Traced کار نه کوي. تاسو کولی شئ د جاوا تشریحاتو لپاره اضافي تالیف هم ضمیمه کړئ ، بیا دوی باید هرچیرې کار وکړي.
  • په زاړه پسرلي او پسرلي بوټ کې، د اوپنټرینګ پسرلي کلاوډ آټو کنفیګریشن په DI کې د بګونو له امله کار نه کوي، نو که تاسو غواړئ د پسرلي اجزاو کې نښې په اوتومات ډول کار وکړي، تاسو کولی شئ دا د انډول په واسطه ترسره کړئ. 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 لري، نو دوی به ټول د ورته خدمت نوم ولري.
  • کله چې میتود ته نښې اضافه کړئ ، تاسو اړتیا لرئ ډاډ ترلاسه کړئ چې دا په لوپ کې څو ځله نه ویل کیږي. دا اړینه ده چې د ټولو تلیفونونو لپاره یو عام ټریس اضافه کړئ، کوم چې د ټول کاري وخت تضمین کوي. که نه نو، اضافي بار به رامنځته شي.
  • یوځل په جیجر-ui کې ، د لوی شمیر نښو لپاره خورا لویې غوښتنې شوې وې ، او له هغه وخته چې دوی ځواب ته انتظار نه کاوه ، دوی یې بیا وکړل. د پایلې په توګه، jaeger-query د ډیرې حافظې خوړل پیل کړل او لچک یې ورو ورو. د jaeger-query بیا پیلولو سره مرسته وکړه

نمونې اخیستل، ذخیره کول او لیدل

درې ډوله دي نمونې اخستل:

  1. Const کوم چې ټولې نښې لیږي او خوندي کوي.
  2. احتمالي کوم چې د ځینې ورکړل شوي احتمال سره نښې فلټر کوي.
  3. اندازه کول چې په هره ثانیه کې د نښو شمیر محدودوي. تاسو کولی شئ دا تنظیمات په پیرودونکي کې تنظیم کړئ ، یا په جیجر - اجنټ یا راټولونکي کې. اوس موږ د valuator stack کې const 1 کاروو، ځکه چې ډیری غوښتنې شتون نلري، مګر دوی ډیر وخت نیسي. په راتلونکي کې، که دا به په سیسټم کې ډیر بار ولګوي، تاسو کولی شئ دا محدود کړئ.

که تاسو کاسندرا کاروئ ، نو بیا په ډیفالټ دا یوازې د دوه ورځو لپاره نښې ذخیره کوي. موږ کاروو د او نښې د هر وخت لپاره ساتل کیږي او نه حذف کیږي. د هرې ورځې لپاره جلا شاخص جوړیږي، د بیلګې په توګه jaeger-service-2019-03-04. په راتلونکي کې ، تاسو اړتیا لرئ د زړو نښو اتومات پاکول تنظیم کړئ.

د نښو لیدلو لپاره تاسو اړتیا لرئ:

  • هغه خدمت غوره کړئ چې تاسو یې د نښې فلټر کول غواړئ ، د مثال په توګه ، د ټامکاټ 7 ډیفالټ د هغه خدمت لپاره چې په ټامکاټ کې روان وي او خپل نوم نلري.
  • بیا عملیات غوره کړئ، د وخت وقفه او د عملیاتو لږترلږه وخت، د بیلګې په توګه د 10 ثانیو څخه، یوازې اوږد اعدامونه واخلئ.
    د خدماتو تعقیب، OpenTracing او Jaeger
  • یو نښان ته لاړ شئ او وګورئ چې هلته څه ورو و.
    د خدماتو تعقیب، OpenTracing او Jaeger

همچنان ، که چیرې ځینې غوښتنې id پیژندل شوي وي ، نو تاسو کولی شئ د دې ID لخوا د ټاګ لټون له لارې ټریس ومومئ ، که چیرې دا ID په ټریس اسپین کې ننوتلی وي.

لاسوند

Articles

Видео

سرچینه: www.habr.com

Add a comment