Tracing Service, OpenTracing ва Jaeger

Tracing Service, OpenTracing ва Jaeger

Мо дар лоиҳаҳои худ архитектураи микросервисро истифода мебарем. Вақте ки монеаҳои иҷроиш ба амал меоянд, вақти зиёд барои назорат ва таҳлили гузоришҳо сарф мешавад. Ҳангоми сабти вақтҳои амалиёти инфиродӣ ба файли журнал, одатан фаҳмидан душвор аст, ки чӣ боиси даъвати ин амалиётҳо гардид, пайгирӣ кардани пайдарпайии амалҳо ё тағирёбии вақти як амалиёт нисбат ба дигараш дар хидматҳои гуногун.

Барои кам кардани мехнати дастй мо карор додем, ки яке аз асбобхои пайра-виро истифода барем. Дар бораи чӣ гуна ва чаро шумо метавонед пайгирӣ истифода баред ва чӣ гуна мо онро анҷом додем ва дар ин мақола муҳокима карда мешавад.

Кадом мушкилотро бо пайгирӣ ҳал кардан мумкин аст

  1. Монеаҳои иҷроишро ҳам дар дохили як хидмат ва ҳам дар тамоми дарахти иҷро байни ҳамаи хидматҳои ширкаткунанда пайдо кунед. Барои намуна:
    • Бисёре аз зангҳои кӯтоҳмуддати пайдарпай байни хидматҳо, масалан, ба географӣ ё пойгоҳи додаҳо.
    • Интизории дарозмуддати вуруд/чор, ба монанди интиқоли шабака ё хондани диск.
    • Таҳлили дарозии маълумот.
    • Амалиётҳои тӯлонӣ, ки CPU талаб мекунанд.
    • Қисмҳои код, ки барои ба даст овардани натиҷаи ниҳоӣ лозим нестанд ва метавонанд хориҷ карда шаванд ё таъхир карда шаванд.
  2. Ба таври возеҳ фаҳмед, ки чӣ гуна пайдарпай номида мешавад ва ҳангоми анҷом додани амалиёт чӣ рӯй медиҳад.
    Tracing Service, OpenTracing ва Jaeger
    Чунин дидан мумкин аст, ки масалан, дархост ба хидмати WS омад -> хидмати WS маълумотро тавассути хидмати R пурра кард -> сипас ба хидмати V дархост фиристод -> хидмати V миқдори зиёди маълумотро аз хидмат бор кард. Хизматрасонии R -> ба хидмати P рафт -> хидмати P боз ба хидмат рафт R -> хидмати V натиҷаро нодида гирифт ва ба хидмати J -> рафт ва танҳо баъд ҷавобро ба хидмати WS баргардонд, дар ҳоле ки ҳисоб кардани чизи дигаре дар замина.
    Бе чунин пайгирӣ ё ҳуҷҷатҳои муфассал барои тамоми раванд, фаҳмидани он, ки ҳангоми бори аввал ба код нигоҳ кардан, чӣ рӯй дода истодааст, хеле душвор аст ва код дар саросари хидматҳои гуногун пароканда ва дар паси як қатор қуттиҳо ва интерфейсҳо пинҳон шудааст.
  3. Ҷамъоварии маълумот дар бораи дарахти иҷро барои таҳлили минбаъдаи таъхирнопазир. Дар ҳар як марҳилаи иҷро, шумо метавонед ба пайраҳае, ки дар ин марҳила мавҷуд аст, илова кунед ва сипас бифаҳмед, ки кадом маълумоти воридотӣ ба сенарияи шабеҳ оварда расонд. Барои намуна:
    • Шаҳодатномаи Корбар
    • Ҳуқуқҳо
    • Навъи усули интихобшуда
    • Хатогии сабт ё иҷро
  4. Табдил додани пайҳо ба зермаҷмӯи метрика ва таҳлили минбаъда аллакай дар шакли метрика.

Кадом пайраҳа метавонад сабт шавад. Фосила

Дар пайгирӣ мафҳуми фосила вуҷуд дорад, ки ин аналоги як лог аст, ба консол. Курорт дорои:

  • Ном, одатан номи усули иҷрошуда
  • Номи хидмате, ки дар он фосила тавлид шудааст
  • ID беназири худ
  • Як навъ иттилооти мета дар шакли калид/арзише, ки ба он ворид шудааст. Масалан, параметрҳои усул ё усул бо хато анҷом ёфт ё не
  • Вақти оғоз ва анҷоми ин фосила
  • ID фарогирии волидайн

Ҳар як фосила ба коллектори фосила фиристода мешавад, то дар базаи маълумот барои баррасии дертар пас аз анҷоми иҷроиш нигоҳ дошта шавад. Дар оянда, шумо метавонед бо пайвастшавӣ бо ID-и волидайн як дарахти ҳама қафо бунёд кунед. Ҳангоми таҳлил, шумо метавонед, масалан, ҳамаи фосилаҳои баъзе хидматҳоро, ки бештар аз чанд вақтро талаб мекарданд, пайдо кунед. Ғайр аз он, бо рафтан ба як фосилаи мушаххас, тамоми дарахтро дар боло ва поёни ин фосила бубинед.

Tracing Service, OpenTracing ва Jaeger

Opentrace, Jagger ва чӣ гуна мо онро барои лоиҳаҳои худ татбиқ кардем

Стандарти умумӣ вуҷуд дорад ошкоро, ки тасвир мекунад, ки чӣ гуна ва чӣ бояд ҷамъ карда шавад, бидуни пайгирӣ ба татбиқи мушаххас дар ягон забон. Масалан, дар Java, ҳама корҳо бо пайгирӣ тавассути API-и маъмули Opentrace анҷом дода мешаванд ва дар зери он, масалан, Jaeger ё татбиқи пешфарзии холӣ, ки ҳеҷ чизро пинҳон кардан мумкин нест.
Мо истифода мебарем Ҷайгер ҳамчун татбиқи Opentrace. Он аз якчанд ҷузъҳо иборат аст:

Tracing Service, OpenTracing ва Jaeger

  • Jaeger-агент як агенти маҳаллӣ мебошад, ки одатан дар ҳар як мошин насб карда мешавад ва хидматҳо ба он дар бандари пешфарзи маҳаллӣ ворид мешаванд. Агар агент мавҷуд набошад, пас осори ҳама хидматҳо дар ин мошин одатан ғайрифаъол мешаванд
  • Jaeger-collector - ҳама агентҳо пайҳои ҷамъшударо ба он мефиристанд ва он онҳоро дар базаи интихобшуда мегузорад
  • Махзани маълумот кассандраи бартарии онҳост, аммо мо elasticsearch-ро истифода мебарем, барои якчанд пойгоҳи додаҳои дигар ва татбиқи хотира мавҷуд аст, ки ҳеҷ чизро дар диск захира намекунад
  • Jaeger-query хидматест, ки ба пойгоҳи додаҳо меравад ва пайҳои аллакай ҷамъшударо барои таҳлил бармегардонад
  • Jaeger-ui интерфейси веб барои ҷустуҷӯ ва дидани пайҳост, он ба jaeger-query меравад

Tracing Service, OpenTracing ва Jaeger

Ҷузъи алоҳидаро метавон татбиқи opentrace jaeger барои забонҳои мушаххас номид, ки тавассути он spans ба jaeger-agent фиристода мешавад.
Пайваст кардани Jagger дар Java ба татбиқи интерфейси io.opentracing.Tracer меояд, ки пас аз он ҳама пайраҳаҳо тавассути он ба агенти воқеӣ парвоз мекунанд.

Tracing Service, OpenTracing ва Jaeger

Инчунин барои ҷузъи баҳор, шумо метавонед пайваст кунед opentracing-spring-cloud-starter ва амалӣ аз Jaeger opentracing-баҳор-jaeger-булут-стартер ки пайгирии ҳама чизеро, ки тавассути ин ҷузъҳо мегузарад, ба таври худкор танзим мекунад, масалан, дархостҳои http ба контроллерҳо, дархостҳо ба пойгоҳи додаҳо тавассути jdbc ва ғайра.

Пайгирии вуруд дар Java

Дар ҷое дар сатҳи боло, Span аввал бояд эҷод карда шавад, ин метавонад ба таври худкор анҷом дода шавад, масалан, аз ҷониби контроллери пружина ҳангоми гирифтани дархост ё дастӣ, агар мавҷуд набошад. Пас аз он тавассути доираи зер интиқол дода мешавад. Агар яке аз усулҳои зер Span илова карданӣ шавад, он activeSpan-и ҷориро аз Scope мегирад, Span-и нав месозад ва мегӯяд, ки волидайни он ActiveSpan дар натиҷа аст ва Span навро фаъол мекунад. Ҳангоми занг задан ба хидматҳои беруна фосилаи фаъоли ҷорӣ ба онҳо интиқол дода мешавад ва он хидматҳо бо истинод ба ин фосила фосилаҳои нав эҷод мекунанд.
Ҳама корҳо тавассути мисоли Tracer мегузарад, шумо метавонед онро тавассути механизми DI ё GlobalTracer.get () ҳамчун тағирёбандаи глобалӣ гиред, агар механизми DI кор накунад. Бо нобаёнӣ, агар пайгирӣ оғоз нашуда бошад, NoopTracer бармегардад, ки ҳеҷ кор намекунад.
Ғайр аз он, миқёси ҷорӣ аз пайгирӣ тавассути ScopeManager ба даст оварда мешавад, доираи нав аз миқёси ҷорӣ бо бастани фосилаи нав сохта мешавад ва сипас Миқёси сохташуда баста мешавад, ки доираи сохташударо мепӯшонад ва Миқёси қаблиро ба ҳолати фаъол. Доира ба ришта пайваст аст, бинобар ин, ҳангоми барномасозии чанд ришта, шумо набояд фаромӯш накунед, ки фосилаи фаъолро ба риштаи дигар интиқол диҳед, то минбаъд фаъолсозии Доираи риштаи дигар бо истинод ба ин фосила.

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.get() -ро истифода баред.
  • Эзоҳҳо кор намекунанд, агар он ҷузъ ё хидмат набошад ё ин усул аз усули ҳамсояи ҳамон синф даъват шуда бошад. Шумо бояд эҳтиёт бошед, ки чӣ кор мекунад ва эҷод кардани пайгирии дастӣ, агар @Traced кор накунад, истифода баред. Шумо инчунин метавонед як компилятори иловагӣ барои эзоҳҳои java замима кунед, пас онҳо бояд дар ҳама ҷо кор кунанд.
  • Дар боркунии кӯҳнаи баҳор ва баҳор, автоматиконфигуратсияи абрии баҳории opentraing аз сабаби хатогиҳо дар 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
  • Кӯшиш кунед, ки бо захираҳо дар groovy кор намекунад, шумо бояд истифода кӯшиш ниҳоят.
  • Ҳар як хидмат бояд spring.application.name-и худро дошта бошад, ки дар зери он пайгирӣ сабт карда мешавад. Чӣ тавр номи алоҳида барои фурӯш ва санҷиш, то ки ба онҳо халал нарасонад якҷоя.
  • Агар шумо GlobalTracer ва tomcat -ро истифода баред, пас ҳамаи хидматҳое, ки дар ин tomcat кор мекунанд, дорои як GlobalTracer мебошанд, бинобар ин ҳамаи онҳо як номи хидматро доранд.
  • Ҳангоми илова кардани пайҳо ба усул, шумо бояд боварӣ дошта бошед, ки он дар як давра чанд маротиба даъват карда намешавад. Барои хамаи зангхо як пайра-каи умумиро илова кардан лозим аст, ки он ба вакти умумии кор кафолат медихад. Дар акси ҳол, бори зиёдатӣ ба вуҷуд меояд.
  • Боре дар яегер-уи дархости аз ҳад зиёд барои шумораи зиёди пайҳо дода шуд ва азбаски онҳо мунтазири посух набуданд, боз ин корро карданд. Дар натиҷа, jaeger-query сар ба хӯрдани хотираи зиёд ва суст тағйирёбанда. Бо аз нав оғоз кардани jaeger-query кӯмак кард

Намунаҳо, нигоҳдорӣ ва дидани пайҳо

Се намуд вуҷуд дорад пайҳои намунагирӣ:

  1. Const, ки ҳама пайраҳоро мефиристад ва захира мекунад.
  2. Эҳтимолист, ки пайҳоро бо эҳтимолияти додашуда филтр мекунад.
  3. Маҳдудкунӣ, ки шумораи пайҳоро дар як сония маҳдуд мекунад. Шумо метавонед ин танзимотҳоро дар муштарӣ, ё дар jaeger-агент ё коллектор танзим кунед. Ҳоло мо const 1-ро дар стеки арзёбӣ истифода мебарем, зеро дархостҳо чандон зиёд нестанд, аммо онҳо вақти зиёдро талаб мекунанд. Дар оянда, агар ин ба система сарбории аз ҳад зиёд расонад, шумо метавонед онро маҳдуд кунед.

Агар шумо кассандраро истифода баред, он гоҳ бо нобаёнӣ он танҳо дар давоми ду рӯз пайҳоро нигоҳ медорад. Мо истифода мебарем эластикиро ҷустуҷӯ кунед ва пайҳо барои ҳама вақт нигоҳ дошта мешаванд ва нест карда намешаванд. Барои ҳар рӯз индекси алоҳида сохта мешавад, масалан jaeger-service-2019-03-04. Дар оянда шумо бояд тозакунии автоматии пайҳои кӯҳнаро танзим кунед.

Барои дидани нишонаҳо ба шумо лозим аст:

  • Хидматеро, ки тавассути он шумо пайраҳоро филтр кардан мехоҳед, интихоб кунед, масалан, tomcat7-default барои хидмате, ки дар tomcat кор мекунад ва номи худро дошта наметавонад.
  • Пас, амалиёт, фосилаи вақт ва вақти ҳадди ақали амалиётро интихоб кунед, масалан, аз 10 сония, барои гирифтани танҳо иҷрои дароз.
    Tracing Service, OpenTracing ва Jaeger
  • Ба яке аз пайраҳо равед ва бубинед, ки дар он ҷо чӣ суст шудааст.
    Tracing Service, OpenTracing ва Jaeger

Инчунин, агар ягон ID-и дархост маълум бошад, пас шумо метавонед бо ин id пайро тавассути ҷустуҷӯи барчасп пайдо кунед, агар ин id дар фосилаи пайгирӣ сабт шуда бошад.

сабт

Мақолаҳо

Видео

Манбаъ: will.com

Илова Эзоҳ