අපි අපගේ ව්යාපෘතිවල ක්ෂුද්ර සේවා ගෘහ නිර්මාණ ශිල්පය භාවිතා කරමු. කාර්ය සාධන අවහිරතා ඇති වූ විට, ලොග් නිරීක්ෂණය කිරීමට සහ විග්රහ කිරීමට බොහෝ කාලයක් ගත වේ. ලොග් ගොනුවකට තනි මෙහෙයුම් වල වේලාවන් ලොග් කරන විට, විවිධ සේවාවන්හි ක්රියා අනුපිළිවෙල හෝ එක් මෙහෙයුමක කාල මාරුව නිරීක්ෂණය කිරීම, මෙම මෙහෙයුම් ආමන්ත්රණය කිරීමට හේතු වූ දේ තේරුම් ගැනීම සාමාන්යයෙන් අපහසු වේ.
අතින් ශ්රමය අවම කිරීම සඳහා, අපි ලුහුබැඳීමේ මෙවලමක් භාවිතා කිරීමට තීරණය කළෙමු. ඔබට ලුහුබැඳීම භාවිතා කළ හැක්කේ කෙසේද සහ ඇයි සහ අපි එය කළ ආකාරය ගැන සහ මෙම ලිපියෙන් සාකච්ඡා කරනු ඇත.
ලුහුබැඳීමෙන් විසඳිය හැකි ගැටළු මොනවාද?
- සියලුම සහභාගී වන සේවාවන් අතර තනි සේවාවක් තුළ සහ සම්පූර්ණ ක්රියාත්මක කිරීමේ ගස තුළ කාර්ය සාධන බාධක සොයන්න. උදාහරණ වශයෙන්:
- සේවා අතර බොහෝ කෙටි අඛණ්ඩ ඇමතුම්, උදාහරණයක් ලෙස, භූ කේතීකරණයට හෝ දත්ත සමුදායකට.
- ජාල මාරු කිරීම් හෝ තැටි කියවීම් වැනි දිගු I/O බලා සිටීම.
- දිගු දත්ත විග්රහ කිරීම.
- cpu අවශ්ය දිගු මෙහෙයුම්.
- අවසාන ප්රතිඵලය ලබා ගැනීමට අවශ්ය නොවන සහ ඉවත් කළ හැකි හෝ ප්රමාද කළ හැකි කේත කොටස්.
- මෙහෙයුම සිදු කරන විට කුමන අනුපිළිවෙලකින් හඳුන්වන්නේද සහ සිදුවන්නේ කුමක්ද යන්න පැහැදිලිව තේරුම් ගන්න.
උදාහරණයක් ලෙස, WS සේවාව වෙත ඉල්ලීම පැමිණි බව පෙනේ -> WS සේවාව R සේවාව හරහා දත්ත එකතු කළේය -> පසුව V සේවාව වෙත ඉල්ලීමක් යවා -> V සේවාව R වෙතින් දත්ත විශාල ප්රමාණයක් පටවා ඇත. service -> P service වෙත ගියා -> P සේවාව නැවතත් සේවා R -> service V වෙත ගොස් ප්රතිඵලය නොසලකා හැර J -> සේවාව වෙත ගොස් පසුව පමණක් WS සේවාව වෙත ප්රතිචාරය ලබා දී ඇත. පසුබිම.
සමස්ත ක්රියාවලිය සඳහා එවැනි හෝඩුවාවක් හෝ සවිස්තරාත්මක ලියකියවිලි නොමැතිව, ඔබ පළමු වරට කේතය දෙස බලන විට සිදුවන්නේ කුමක්ද යන්න තේරුම් ගැනීම ඉතා අපහසු වන අතර කේතය විවිධ සේවාවන් හරහා විසිරී ඇති අතර බඳුන් සහ අතුරුමුහුණත් පොකුරක් පිටුපස සැඟවී ඇත. - පසුව කල් දැමූ විශ්ලේෂණය සඳහා ක්රියාත්මක කිරීමේ ගස පිළිබඳ තොරතුරු රැස් කිරීම. ක්රියාත්මක කිරීමේ සෑම අදියරකදීම, ඔබට මෙම අදියරේදී ලබා ගත හැකි හෝඩුවාවට තොරතුරු එක් කළ හැකි අතර පසුව සමාන අවස්ථාවට තුඩු දුන් ආදාන දත්ත මොනවාදැයි සොයා බලන්න. උදාහරණ වශයෙන්:
- පරිශීලක ID
- අයිතිවාසිකම්
- තෝරාගත් ක්රමයේ වර්ගය
- ලොග් හෝ ක්රියාත්මක කිරීමේ දෝෂයකි
- හෝඩුවාවන් ප්රමිතික උප කුලකයක් බවට පත් කිරීම සහ දැනටමත් ප්රමිතික ආකාරයෙන් වැඩිදුර විශ්ලේෂණය කිරීම.
කුමන හෝඩුවාවක් ලොග් විය හැකිද. පරතරය
ලුහුබැඳීමේදී පරතරයක් පිළිබඳ සංකල්පය ඇත, මෙය කොන්සෝලයට එක් ලොගයක ප්රතිසමයකි. ස්පා සතුව ඇත්තේ:
- නම, සාමාන්යයෙන් ක්රියාත්මක කරන ලද ක්රමයේ නම
- පරතරය ජනනය කළ සේවාවේ නම
- තමන්ගේම අනන්ය හැඳුනුම්පතක්
- එයට ලොග් වී ඇති යතුරක්/අගයක ස්වරූපයෙන් යම් ආකාරයක මෙටා තොරතුරු. උදාහරණයක් ලෙස, ක්රම පරාමිති හෝ ක්රමය දෝෂයකින් හෝ නැත
- මෙම කාල සීමාව සඳහා ආරම්භක සහ අවසන් වේලාවන්
- මාපිය පරාසය ID
සෑම පරතරයක්ම එහි ක්රියාත්මක කිරීම අවසන් වූ වහාම පසුව සමාලෝචනය සඳහා දත්ත ගබඩාවේ ගබඩා කිරීම සඳහා span එකතු කරන්නා වෙත යවනු ලැබේ. අනාගතයේදී, මාපිය හැඳුනුම්පත මගින් සම්බන්ධ කිරීමෙන් ඔබට සියලු පරාසවල ගසක් සෑදිය හැකිය. විශ්ලේෂණය කරන විට, ඔබට සොයා ගත හැකිය, උදාහරණයක් ලෙස, යම් කාලයක් ගත වූ සමහර සේවාවක ඇති සියලුම පරාසයන්. තවද, නිශ්චිත පරාසයකට යාමෙන්, මෙම පරතරයට ඉහළින් සහ පහළින් සම්පූර්ණ ගසම බලන්න.
Opentrace, Jagger සහ අපි එය අපගේ ව්යාපෘති සඳහා ක්රියාත්මක කළ ආකාරය
පොදු සම්මතයක් ඇත
අපි පාවිච්චි කරනවා
- Jaeger-agent යනු සාමාන්යයෙන් එක් එක් යන්ත්රය මත ස්ථාපනය කර ඇති දේශීය නියෝජිතයෙකු වන අතර සේවා දේශීය පෙරනිමි තොටේ එයට ලොග් වේ. නියෝජිතයෙකු නොමැති නම්, මෙම යන්ත්රයේ සියලුම සේවාවන්හි සලකුණු සාමාන්යයෙන් අක්රිය වේ
- ජේගර්-එකතු කරන්නා - සියලුම නියෝජිතයින් එකතු කරන ලද හෝඩුවාවන් එයට යවන අතර එය ඒවා තෝරාගත් දත්ත ගබඩාවේ තබයි.
- දත්ත සමුදාය ඔවුන් කැමති කැසැන්ඩ්රා වේ, නමුත් අපි භාවිතා කරන්නේ elasticsearch, වෙනත් දත්ත සමුදා කිහිපයක් සඳහා ක්රියාත්මක කිරීම් සහ තැටියට කිසිවක් ඉතිරි නොකරන මතකයේ ක්රියාත්මක කිරීමක් ඇත.
- Jaeger-query යනු දත්ත සමුදාය වෙත ගොස් විශ්ලේෂණය සඳහා දැනටමත් එකතු කර ඇති අංශු ආපසු ලබා දෙන සේවාවකි
- Jaeger-ui යනු හෝඩුවාවන් සෙවීම සහ බැලීම සඳහා වන වෙබ් අතුරු මුහුණතකි, එය jaeger-query වෙත යයි.
විශේෂිත භාෂාවන් සඳහා opentrace jaeger ක්රියාත්මක කිරීම වෙනම සංරචකයක් ලෙස හැඳින්විය හැක, එමඟින් jaeger-agent වෙත ස්පන් යවනු ලැබේ.
වසන්ත සංරචකය සඳහාද, ඔබට සම්බන්ධ කළ හැකිය
ජාවා හි ලොගින් වීමේ සලකුණු
ඉහළ මට්ටමේ කොහේ හරි, පළමු ස්පාන් නිර්මාණය කළ යුතුය, මෙය ස්වයංක්රීයව සිදු කළ හැකිය, නිදසුනක් ලෙස, ඉල්ලීමක් ලැබුණු විට වසන්ත පාලකය මගින් හෝ කිසිවක් නොමැති නම් අතින්. පසුව එය පහත විෂය පථය හරහා සම්ප්රේෂණය වේ. පහත ඕනෑම ක්රමයකට Span එකක් එක් කිරීමට අවශ්ය නම්, එය Scope වෙතින් වත්මන් ActiveSpan ලබාගෙන, නව Span එකක් සාදා එහි මාපිය ප්රතිඵලය වන activeSpan බව පවසන අතර, නව Span එක සක්රීය කරයි. බාහිර සේවා ඇමතීමේදී, වත්මන් සක්රිය පරාසය ඔවුන් වෙත ලබා දෙන අතර, එම සේවා මෙම පරාසයට අදාළව නව පරාසයන් නිර්මාණය කරයි.
සියලුම වැඩ කටයුතු Tracer උදාහරණය හරහා සිදු වේ, DI යාන්ත්රණය ක්රියා නොකරන්නේ නම් ඔබට එය DI යාන්ත්රණය හරහා හෝ GlobalTracer.get () ගෝලීය විචල්යයක් ලෙස ලබා ගත හැක. පෙරනිමියෙන්, tracer ආරම්භ කර නොමැති නම්, 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();
අපි මුහුණ දුන් ගැටළු
- එවිට ට්රේසර් සේවාවක හෝ සං component ටකයක හෝ සංරචකයක භාවිතා නොකෙරේ නම් බෝංචි සහ ඩී.එම්.
ස්වයංක්රීය රැහැන්ගත Tracer ක්රියා නොකරනු ඇති අතර ඔබට GlobalTracer.get() භාවිතා කිරීමට සිදුවේ. - එය සංරචකයක් හෝ සේවාවක් නොවේ නම්, හෝ එම ක්රමය එකම පන්තියේ අසල්වැසි ක්රමයකින් හඳුන්වන්නේ නම් විවරණ ක්රියා නොකරයි. ඔබ ක්රියා කරන්නේ කුමක් දැයි පරීක්ෂා කිරීමට ප්රවේශම් විය යුතු අතර @Traced ක්රියා නොකරන්නේ නම් අතින් හෝඩුවාවක් නිර්මාණය භාවිත කරන්න. ඔබට ජාවා විවරණ සඳහා අමතර සම්පාදකයක් ඇමිණිය හැකිය, එවිට ඒවා සෑම තැනකම ක්රියා කළ යුතුය.
- පැරණි වසන්තයේ සහ වසන්ත ඇරඹුම් වලදී, DI හි ඇති දෝෂ හේතුවෙන් opentraing වසන්ත වලාකුළු ස්වයංක්රීය වින්යාසය ක්රියා නොකරයි, එවිට ඔබට වසන්ත සංරචකවල හෝඩුවාවන් ස්වයංක්රීයව ක්රියා කිරීමට අවශ්ය නම්, ඔබට එය සාදෘශ්යයෙන් කළ හැකිය.
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 නැවත ආරම්භ කිරීමෙන් උදවු විය
නියැදීම, ගබඩා කිරීම සහ හෝඩුවාවන් බැලීම
වර්ග තුනක් ඇත
- සියලුම හෝඩුවාවන් යවන සහ සුරකින කොන්ස්ට්.
- ලබා දී ඇති යම් සම්භාවිතාවක් සහිත හෝඩුවාවන් පෙරහන් කරන සම්භාවිතාව.
- තත්පරයකට හෝඩුවාවන් ගණන සීමා කරන අනුපාත සීමා කිරීම. ඔබට මෙම සැකසුම් සේවාදායකයා මත, jaeger-agent මත හෝ එකතුකරන්නා මත වින්යාසගත කළ හැක. දැන් අපි valuator stack එකේ const 1 භාවිතා කරනවා, මොකද ගොඩක් requests නැති නිසා, නමුත් ඒවා ගොඩක් කල් යනවා. අනාගතයේදී, මෙය පද්ධතිය මත අධික බරක් පැටවෙන්නේ නම්, ඔබට එය සීමා කළ හැකිය.
ඔබ cassandra භාවිතා කරන්නේ නම්, පෙරනිමියෙන් එය දින දෙකක් සඳහා පමණක් හෝඩුවාවන් ගබඩා කරයි. අපි පාවිච්චි කරනවා
ඔබට අවශ්ය හෝඩුවාවන් බැලීම සඳහා:
- ඔබට ට්රේස් පෙරීමට අවශ්ය සේවාව තෝරන්න, උදාහරණයක් ලෙස, tomcat හි ක්රියාත්මක වන සහ එහිම නම තිබිය නොහැකි සේවාවක් සඳහා tomcat7-default.
- ඉන්පසු මෙහෙයුම, කාල පරතරය සහ අවම මෙහෙයුම් කාලය තෝරන්න, උදාහරණයක් ලෙස තත්පර 10 සිට, දිගු ක්රියාත්මක කිරීම් පමණක් ගැනීමට.
- එක ට්රේස් එකකට ගිහින් බලන්න එතන මොකක්ද මන්දා වේගය අඩු වෙන්නේ කියලා.
තවද, යම් ඉල්ලීම් හැඳුනුම්පතක් දන්නා නම්, මෙම id එක ට්රේස් ස්පාන් තුළ ලොග් වී ඇත්නම්, ටැග් සෙවුමක් හරහා ඔබට මෙම හැඳුනුම්පතෙන් හෝඩුවාවක් සොයාගත හැකිය.
ප්රලේඛනය
- ලේඛන විවෘත කිරීම
opentracing.io/docs/overview/what-is-tracing - jaeger ලියකියවිලි
www.jaegertracing.io/docs/1.10 - ජේගර් ජාවා සම්බන්ධතාවය
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 සැබෑ PHP සහ Golang ව්යාපෘතියක Jaeger Opentracing සහ Microserviceswww.uber.com/distributed-tracing Uber Engineering හි විකාශනය වන බෙදා හරින ලද ලුහුබැඳීමopentracing.io/guides/java media.com/jaegertracing/running-jaeger-agent-on-bare-metal-d1fc47d31fab ජෙගර් නියෝජිතයා හිස් ලෝහ මත ධාවනය කිරීම
Видео
www.youtube.com/watch?v=qg0ENOdP1Lo අකුණු වේගයෙන් පරිශීලක විමසුම් ලබා දීමට අපි ජේගර් සහ ප්රොමිතියස් භාවිතා කළ ආකාරය - Bryan Borehamwww.youtube.com/watch?v=WRntQsUajow හැඳින්වීම: ජේගර් - යූරි ෂ්කුරෝ, Uber සහ Pavol Loffay, Red Hatwww.youtube.com/watch?v=fsHb0qK37bc සර්ගෙයි ඉකොව්ලෙව්, “විශාල ජයග්රහණයක කුඩා කතාවක්: OpenTracing, AWS සහ Jaeger”
මූලාශ්රය: www.habr.com