Мо дар лоиҳаҳои худ архитектураи микросервисро истифода мебарем. Вақте ки монеаҳои иҷроиш ба амал меоянд, вақти зиёд барои назорат ва таҳлили гузоришҳо сарф мешавад. Ҳангоми сабти вақтҳои амалиёти инфиродӣ ба файли журнал, одатан фаҳмидан душвор аст, ки чӣ боиси даъвати ин амалиётҳо гардид, пайгирӣ кардани пайдарпайии амалҳо ё тағирёбии вақти як амалиёт нисбат ба дигараш дар хидматҳои гуногун.
Барои кам кардани мехнати дастй мо карор додем, ки яке аз асбобхои пайра-виро истифода барем. Дар бораи чӣ гуна ва чаро шумо метавонед пайгирӣ истифода баред ва чӣ гуна мо онро анҷом додем ва дар ин мақола муҳокима карда мешавад.
Кадом мушкилотро бо пайгирӣ ҳал кардан мумкин аст
- Монеаҳои иҷроишро ҳам дар дохили як хидмат ва ҳам дар тамоми дарахти иҷро байни ҳамаи хидматҳои ширкаткунанда пайдо кунед. Барои намуна:
- Бисёре аз зангҳои кӯтоҳмуддати пайдарпай байни хидматҳо, масалан, ба географӣ ё пойгоҳи додаҳо.
- Интизории дарозмуддати вуруд/чор, ба монанди интиқоли шабака ё хондани диск.
- Таҳлили дарозии маълумот.
- Амалиётҳои тӯлонӣ, ки CPU талаб мекунанд.
- Қисмҳои код, ки барои ба даст овардани натиҷаи ниҳоӣ лозим нестанд ва метавонанд хориҷ карда шаванд ё таъхир карда шаванд.
- Ба таври возеҳ фаҳмед, ки чӣ гуна пайдарпай номида мешавад ва ҳангоми анҷом додани амалиёт чӣ рӯй медиҳад.
Чунин дидан мумкин аст, ки масалан, дархост ба хидмати WS омад -> хидмати WS маълумотро тавассути хидмати R пурра кард -> сипас ба хидмати V дархост фиристод -> хидмати V миқдори зиёди маълумотро аз хидмат бор кард. Хизматрасонии R -> ба хидмати P рафт -> хидмати P боз ба хидмат рафт R -> хидмати V натиҷаро нодида гирифт ва ба хидмати J -> рафт ва танҳо баъд ҷавобро ба хидмати WS баргардонд, дар ҳоле ки ҳисоб кардани чизи дигаре дар замина.
Бе чунин пайгирӣ ё ҳуҷҷатҳои муфассал барои тамоми раванд, фаҳмидани он, ки ҳангоми бори аввал ба код нигоҳ кардан, чӣ рӯй дода истодааст, хеле душвор аст ва код дар саросари хидматҳои гуногун пароканда ва дар паси як қатор қуттиҳо ва интерфейсҳо пинҳон шудааст. - Ҷамъоварии маълумот дар бораи дарахти иҷро барои таҳлили минбаъдаи таъхирнопазир. Дар ҳар як марҳилаи иҷро, шумо метавонед ба пайраҳае, ки дар ин марҳила мавҷуд аст, илова кунед ва сипас бифаҳмед, ки кадом маълумоти воридотӣ ба сенарияи шабеҳ оварда расонд. Барои намуна:
- Шаҳодатномаи Корбар
- Ҳуқуқҳо
- Навъи усули интихобшуда
- Хатогии сабт ё иҷро
- Табдил додани пайҳо ба зермаҷмӯи метрика ва таҳлили минбаъда аллакай дар шакли метрика.
Кадом пайраҳа метавонад сабт шавад. Фосила
Дар пайгирӣ мафҳуми фосила вуҷуд дорад, ки ин аналоги як лог аст, ба консол. Курорт дорои:
- Ном, одатан номи усули иҷрошуда
- Номи хидмате, ки дар он фосила тавлид шудааст
- ID беназири худ
- Як навъ иттилооти мета дар шакли калид/арзише, ки ба он ворид шудааст. Масалан, параметрҳои усул ё усул бо хато анҷом ёфт ё не
- Вақти оғоз ва анҷоми ин фосила
- ID фарогирии волидайн
Ҳар як фосила ба коллектори фосила фиристода мешавад, то дар базаи маълумот барои баррасии дертар пас аз анҷоми иҷроиш нигоҳ дошта шавад. Дар оянда, шумо метавонед бо пайвастшавӣ бо ID-и волидайн як дарахти ҳама қафо бунёд кунед. Ҳангоми таҳлил, шумо метавонед, масалан, ҳамаи фосилаҳои баъзе хидматҳоро, ки бештар аз чанд вақтро талаб мекарданд, пайдо кунед. Ғайр аз он, бо рафтан ба як фосилаи мушаххас, тамоми дарахтро дар боло ва поёни ин фосила бубинед.
Opentrace, Jagger ва чӣ гуна мо онро барои лоиҳаҳои худ татбиқ кардем
Стандарти умумӣ вуҷуд дорад
Мо истифода мебарем
- Jaeger-агент як агенти маҳаллӣ мебошад, ки одатан дар ҳар як мошин насб карда мешавад ва хидматҳо ба он дар бандари пешфарзи маҳаллӣ ворид мешаванд. Агар агент мавҷуд набошад, пас осори ҳама хидматҳо дар ин мошин одатан ғайрифаъол мешаванд
- Jaeger-collector - ҳама агентҳо пайҳои ҷамъшударо ба он мефиристанд ва он онҳоро дар базаи интихобшуда мегузорад
- Махзани маълумот кассандраи бартарии онҳост, аммо мо elasticsearch-ро истифода мебарем, барои якчанд пойгоҳи додаҳои дигар ва татбиқи хотира мавҷуд аст, ки ҳеҷ чизро дар диск захира намекунад
- Jaeger-query хидматест, ки ба пойгоҳи додаҳо меравад ва пайҳои аллакай ҷамъшударо барои таҳлил бармегардонад
- Jaeger-ui интерфейси веб барои ҷустуҷӯ ва дидани пайҳост, он ба jaeger-query меравад
Ҷузъи алоҳидаро метавон татбиқи opentrace jaeger барои забонҳои мушаххас номид, ки тавассути он spans ба jaeger-agent фиристода мешавад.
Инчунин барои ҷузъи баҳор, шумо метавонед пайваст кунед
Пайгирии вуруд дар 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 вуҷуд дорад
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 кӯмак кард
Намунаҳо, нигоҳдорӣ ва дидани пайҳо
Се намуд вуҷуд дорад
- Const, ки ҳама пайраҳоро мефиристад ва захира мекунад.
- Эҳтимолист, ки пайҳоро бо эҳтимолияти додашуда филтр мекунад.
- Маҳдудкунӣ, ки шумораи пайҳоро дар як сония маҳдуд мекунад. Шумо метавонед ин танзимотҳоро дар муштарӣ, ё дар jaeger-агент ё коллектор танзим кунед. Ҳоло мо const 1-ро дар стеки арзёбӣ истифода мебарем, зеро дархостҳо чандон зиёд нестанд, аммо онҳо вақти зиёдро талаб мекунанд. Дар оянда, агар ин ба система сарбории аз ҳад зиёд расонад, шумо метавонед онро маҳдуд кунед.
Агар шумо кассандраро истифода баред, он гоҳ бо нобаёнӣ он танҳо дар давоми ду рӯз пайҳоро нигоҳ медорад. Мо истифода мебарем
Барои дидани нишонаҳо ба шумо лозим аст:
- Хидматеро, ки тавассути он шумо пайраҳоро филтр кардан мехоҳед, интихоб кунед, масалан, tomcat7-default барои хидмате, ки дар tomcat кор мекунад ва номи худро дошта наметавонад.
- Пас, амалиёт, фосилаи вақт ва вақти ҳадди ақали амалиётро интихоб кунед, масалан, аз 10 сония, барои гирифтани танҳо иҷрои дароз.
- Ба яке аз пайраҳо равед ва бубинед, ки дар он ҷо чӣ суст шудааст.
Инчунин, агар ягон ID-и дархост маълум бошад, пас шумо метавонед бо ин id пайро тавассути ҷустуҷӯи барчасп пайдо кунед, агар ин id дар фосилаи пайгирӣ сабт шуда бошад.
сабт
- ҳуҷҷатҳои кушодаасос
opentracing.io/docs/overview/what-is-tracing - ҳуҷҷатҳои jaeger
www.jaegertracing.io/docs/1.10 - Пайвастшавии java Jaeger
github.com/jaegertracing/jaeger-client-java - Пайвасти пайгирии баҳорӣ
github.com/jaegertracing/jaeger-client-java
github.com/opentracing-contrib/java-spring-cloud
Мақолаҳо
habr.com/ru/company/carprice/blog/340946 Jaeger Opentracing ва Microservices дар лоиҳаи воқеии PHP ва Golangwww.uber.com/distributed-tracing Таҳияи пайгирии тақсимшуда дар Uber Engineeringopentracing.io/guides/java media.com/jaegertracing/running-jaeger-agent-on-bare-metal-d1fc47d31fab Иҷрои агенти Jaeger дар металли урён
Видео
www.youtube.com/watch?v=qg0ENOdP1Lo Чӣ тавр мо Jaeger ва Prometheus-ро барои расонидани пурсишҳои корбар зуд истифода бурдем - Брайан Бореҳамwww.youtube.com/watch?v=WRntQsUajow Муқаддима: Ҷейгер - Юрий Шкуро, Убер ва Павол Лоффай, Red Hatwww.youtube.com/watch?v=fsHb0qK37bc Сергей Яковлев, "Ҳикояи хурди ғалабаи бузург: OpenTracing, AWS ва Jaeger"
Манбаъ: will.com