በፕሮጀክቶቻችን ውስጥ የማይክሮ ሰርቪስ አርክቴክቸር እንጠቀማለን። የአፈጻጸም ማነቆዎች ሲከሰቱ፣ ብዙ ጊዜ መዝገቦችን በመከታተል እና በመተንተን ያሳልፋል። የግለሰቦችን ኦፕሬሽኖች ጊዜ ወደ ሎግ ፋይል በሚገቡበት ጊዜ ፣ለእነዚህ ኦፕሬሽኖች ጥሪ ያደረሰውን ምክንያት ለመረዳት ፣የድርጊቶችን ቅደም ተከተል ወይም የአንድ ኦፕሬሽንን የጊዜ ፈረቃ በተለያዩ አገልግሎቶች ውስጥ ለመከታተል ብዙውን ጊዜ አስቸጋሪ ነው።
የእጅ ሥራን ለመቀነስ, አንዱን የመከታተያ መሳሪያዎች ለመጠቀም ወስነናል. ፍለጋን እንዴት እና ለምን መጠቀም እንደሚችሉ እና እንዴት እንደሰራን, እና በዚህ ጽሑፍ ውስጥ ይብራራል.
በክትትል ምን ችግሮች ሊፈቱ ይችላሉ
- በአንድ አገልግሎት ውስጥ እና በሁሉም ተሳታፊ አገልግሎቶች መካከል ባለው የአፈፃፀም ዛፍ ላይ ሁለቱንም የአፈፃፀም ማነቆዎችን ያግኙ። ለምሳሌ:
- በአገልግሎቶች መካከል ብዙ አጭር ተከታታይ ጥሪዎች ለምሳሌ ወደ ጂኦኮዲንግ ወይም ወደ የውሂብ ጎታ።
- ረጅም I/O ይጠብቃል፣ ለምሳሌ የአውታረ መረብ ዝውውሮች ወይም ዲስክ ማንበብ።
- ረጅም ውሂብ መተንተን።
- ሲፒዩ የሚያስፈልጋቸው ረጅም ክዋኔዎች።
- የመጨረሻውን ውጤት ለማግኘት የማያስፈልጉ እና ሊወገዱ ወይም ሊዘገዩ የሚችሉ የኮድ ክፍሎች።
- ቀዶ ጥገናው በሚካሄድበት ጊዜ ምን እንደሚጠራ እና ምን እንደሚከሰት በግልጽ ይረዱ.
ለምሳሌ ጥያቄው ወደ WS አገልግሎት እንደመጣ ማየት ይቻላል -> የ WS አገልግሎት መረጃውን በ R አገልግሎት በኩል አጠናክሯል -> ከዚያም ወደ ቪ አገልግሎት ጥያቄ ልኳል -> የቪ አገልግሎቱ ብዙ መረጃዎችን ከ R አገልግሎት -> ወደ ፒ አገልግሎት ሄደ -> የፒ አገልግሎት እንደገና ወደ አገልግሎት ሄደ R -> አገልግሎት V ውጤቱን ችላ በማለት ወደ አገልግሎት J -> ሄደ እና ከዚያ በኋላ ብቻ መልሱን ለአገልግሎት WS መለሰ ፣ ሌላ ነገር ማስላት ሲቀጥል ዳራ ።
ለጠቅላላው ሂደት እንደዚህ ያለ ዱካ ወይም ዝርዝር ሰነድ ከሌለ ፣ ለመጀመሪያ ጊዜ ኮዱን ሲመለከቱ ምን እየተፈጠረ እንዳለ ለመረዳት በጣም ከባድ ነው ፣ እና ኮዱ በተለያዩ አገልግሎቶች ውስጥ ተበታትኖ እና ከባንኮች እና መገናኛዎች በስተጀርባ ተደብቋል። - ለቀጣይ የዘገየ ትንተና ስለ ማስፈጸሚያ ዛፍ መረጃ መሰብሰብ. በእያንዳንዱ የአፈጻጸም ደረጃ፣ በዚህ ደረጃ ላይ ባለው ፈለግ ላይ መረጃን ማከል እና ምን አይነት የግቤት ውሂብ ወደ ተመሳሳይ ሁኔታ እንዳመጣ ማወቅ ይችላሉ። ለምሳሌ:
- የተጠቃሚው መለያ
- መብቶች
- የተመረጠው ዘዴ ዓይነት
- የምዝግብ ማስታወሻ ወይም የአፈፃፀም ስህተት
- ዱካዎችን ወደ የመለኪያዎች ስብስብ እና ተጨማሪ ትንተና ቀድሞውኑ በመለኪያዎች መልክ መለወጥ።
ምን ዱካ ሊመዘገብ ይችላል። ስፋት
በክትትል ውስጥ የስፓን ጽንሰ-ሀሳብ አለ ፣ ይህ የአንድ ሎግ አናሎግ ነው ፣ ወደ ኮንሶሉ። ስፓው አለው:
- ስም ፣ ብዙውን ጊዜ የተከናወነው ዘዴ ስም
- ስፋቱ የተፈጠረበት የአገልግሎት ስም
- የራሱ ልዩ መታወቂያ
- በውስጡ የገባ በቁልፍ/ዋጋ መልክ የሆነ ዓይነት ሜታ መረጃ። ለምሳሌ የስልት መለኪያዎች ወይም ዘዴው በስህተት አልቋል ወይም አላበቃም።
- ለዚህ ጊዜ የሚጀምር እና የሚያበቃበት ጊዜ
- የወላጅ ስፋት መታወቂያ
እያንዳንዱ ስፓን አፈፃፀሙን እንዳጠናቀቀ በኋላ ለግምገማ በዳታቤዝ ውስጥ እንዲከማች ወደ ስፓን ሰብሳቢው ይላካል። ለወደፊት በወላጅ መታወቂያ በማገናኘት ሁሉንም አይነት ዛፎች መገንባት ይችላሉ. ሲተነተኑ፣ ለምሳሌ፣ ከተወሰነ ጊዜ በላይ የፈጁ አንዳንድ አገልግሎቶችን ሁሉንም ክፍተቶች ማግኘት ይችላሉ። በተጨማሪ፣ ወደ አንድ የተወሰነ ቦታ በመሄድ፣ ሙሉውን ዛፍ ከዚህ ስፋት በላይ እና በታች ይመልከቱ።
Opentrace፣ Jagger እና ለፕሮጀክቶቻችን እንዴት እንደተገበርነው
አንድ የተለመደ መስፈርት አለ
እየተጠቀምን ነው።
- Jaeger-ኤጀንት አብዛኛውን ጊዜ በእያንዳንዱ ማሽን ላይ የተጫነ እና አገልግሎቶች በአካባቢው ነባሪ ወደብ ላይ የሚገቡት የአገር ውስጥ ወኪል ነው. ወኪል ከሌለ በዚህ ማሽን ላይ ያሉት ሁሉም አገልግሎቶች ዱካዎች ብዙውን ጊዜ ይሰናከላሉ።
- ጃገር ሰብሳቢ - ሁሉም ወኪሎች የተሰበሰቡ ዱካዎችን ወደ እሱ ይልካሉ እና በተመረጠው የውሂብ ጎታ ውስጥ ያስቀምጣቸዋል.
- የመረጃ ቋቱ የእነርሱ ተመራጭ ካሳንድራ ነው፣ እኛ ግን elasticsearchን እንጠቀማለን፣ ለሌላ ሁለት የውሂብ ጎታዎች አተገባበር እና በዲስክ ላይ ምንም ነገር የማያስቀምጥ የማስታወሻ ትግበራ አለ።
- Jaeger-query ወደ ዳታቤዝ የሚሄድ እና አስቀድሞ የተሰበሰቡ ዱካዎችን ለመተንተን የሚመልስ አገልግሎት ነው።
- Jaeger-ui ዱካዎችን ለመፈለግ እና ለመመልከት የድር በይነገጽ ነው፣ ወደ jaeger-query ይሄዳል።
የተለየ ክፍል ለተወሰኑ ቋንቋዎች ክፍት ትራስ jaeger ትግበራ ተብሎ ሊጠራ ይችላል ፣ በዚህ በኩል ወደ jaeger-agent ይላካል።
እንዲሁም ለፀደይ አካል, መገናኘት ይችላሉ
በጃቫ ውስጥ የመግባት ዱካዎች
በከፍተኛ ደረጃ ላይ ያለ ቦታ, የመጀመሪያው ስፓን መፈጠር አለበት, ይህ በራስ-ሰር ሊከናወን ይችላል, ለምሳሌ, ጥያቄ ሲደርሰው በፀደይ መቆጣጠሪያ, ወይም በእጅ ከሌለ. ከዚያም ከታች ባለው ወሰን በኩል ይተላለፋል. ከታች ካሉት ዘዴዎች ውስጥ አንዳቸውም ስፓን ለመጨመር ከፈለጉ የአሁኑን አክቲቭስፓን ከ ስኮፕ ይወስዳል፣ አዲስ Span ይፈጥራል እና ወላጁ የነቃ እስፓን ነው ይላል እና አዲሱን እስፓን ንቁ ያደርገዋል። የውጭ አገልግሎቶችን በሚደውሉበት ጊዜ፣ አሁን ያለው ንቁ ጊዜ ወደ እነርሱ ይተላለፋል፣ እና እነዚያ አገልግሎቶች ይህንን ጊዜ በማጣቀስ አዲስ ክፍተቶችን ይፈጥራሉ።
ሁሉም ስራዎች በ Tracer ምሳሌ በኩል ያልፋሉ፣ በ DI ሜካኒካል ወይም GlobalTracer.get () እንደ አለምአቀፍ ተለዋዋጭ የ DI ዘዴ የማይሰራ ከሆነ ሊያገኙት ይችላሉ። በነባሪነት፣ መከታተያ ካልተጀመረ ኖፕትራክተር ምንም የማያደርግ ይመለሳል።
በተጨማሪም የአሁኑ ወሰን ከክትትል በ 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();
ያጋጠሙን ችግሮች
- ባቄላ እና ዲአይዲ ሁልጊዜ አይሰሩም መፈለጊያው በአገልግሎት ወይም አካል ውስጥ ጥቅም ላይ ካልዋለ
በራስ-ሰር የተሰራ Tracer ላይሰራ ይችላል እና GlobalTracer.get() መጠቀም አለብህ። - ማብራሪያዎች አካል ወይም አገልግሎት ካልሆነ ወይም ዘዴው ከተመሳሳይ ክፍል ጎረቤት ዘዴ ከተጠራ አይሰራም. የሚሰራውን ለመፈተሽ መጠንቀቅ አለብህ እና @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 - ከሀብቶች ጋር ይሞክሩ በግሩቭ ውስጥ አይሰራም ፣ በመጨረሻ ይሞክሩት መጠቀም አለብዎት።
- እያንዳንዱ አገልግሎት የራሱ የሆነ የስፕሪንግ.application.ስም ሊኖረው ይገባል ይህም ዱካዎች የሚመዘገቡበት ነው። ለሽያጭ እና ለሙከራው የተለየ ስም ምን ማለት ነው, ከእነሱ ጋር አንድ ላይ ጣልቃ እንዳይገቡ.
- GlobalTracer እና Tomcat የምትጠቀም ከሆነ በዚህ ቶምካት ውስጥ የሚሰሩ ሁሉም አገልግሎቶች አንድ GlobalTracer ስላላቸው ሁሉም ተመሳሳይ የአገልግሎት ስም ይኖራቸዋል።
- በአንድ ዘዴ ላይ ዱካዎችን ሲጨምሩ, በ loop ውስጥ ብዙ ጊዜ እንደማይጠራ እርግጠኛ መሆን አለብዎት. ለሁሉም ጥሪዎች አንድ የተለመደ ዱካ ማከል አስፈላጊ ነው, ይህም አጠቃላይ የስራ ጊዜን ያረጋግጣል. አለበለዚያ ከመጠን በላይ ጭነት ይፈጠራል.
- አንዴ በጃገር-ዩኢ ውስጥ፣ በጣም ትልቅ ጥያቄዎች ለብዙ ቁጥር ፍለጋ ቀርበዋል፣ እና ምላሽ ስላልጠበቁ፣ እንደገና አደረጉት። በውጤቱም, ዣገር-ጥያቄ ብዙ ማህደረ ትውስታን መብላት እና የመለጠጥ ፍጥነት መቀነስ ጀመረ. jaeger-queryን እንደገና በማስጀመር ረድቷል።
ናሙናዎች, ማከማቻ እና የእይታ ዱካዎች
ሦስት ዓይነት ዓይነቶች አሉ
- ሁሉንም ዱካዎች የሚልክ እና የሚያስቀምጥ Const።
- በተወሰነ ዕድል ዱካዎችን የሚያጣራ ሊሆን ይችላል።
- በሰከንድ የመከታተያ ብዛት የሚገድበው ደረጃ መስጠት። እነዚህን መቼቶች በደንበኛው ላይ, በጃገር-ኤጀንት ወይም በአሰባሳቢው ላይ ማዋቀር ይችላሉ. አሁን const 1 ን በቫሉተር ቁልል ውስጥ እንጠቀማለን ፣ ምክንያቱም ብዙ ጥያቄዎች ስለሌሉ ፣ ግን ረጅም ጊዜ ይወስዳሉ። ለወደፊቱ, ይህ በሲስተሙ ላይ ከመጠን በላይ ጭነት የሚፈጥር ከሆነ, ሊገድቡት ይችላሉ.
ካሳንድራ የሚጠቀሙ ከሆነ በነባሪነት ለሁለት ቀናት ብቻ ዱካዎችን ያከማቻል። እየተጠቀምን ነው።
ዱካውን ለማየት የሚከተሉትን ያስፈልግዎታል
- ዱካዎችን ለማጣራት የሚፈልጉትን አገልግሎት ይምረጡ ፣ ለምሳሌ ፣ tomcat7-default በቶምካት ውስጥ ለሚሰራ እና የራሱ ስም ሊኖረው አይችልም።
- ከዚያም ቀዶ ጥገናውን, የጊዜ ክፍተቱን እና አነስተኛውን የአሠራር ጊዜ ይምረጡ, ለምሳሌ ከ 10 ሰከንድ, ረጅም ግድፈቶችን ብቻ ለመውሰድ.
- ወደ አንዱ ዱካ ይሂዱ እና እዚያ ምን እየቀዘቀዘ እንዳለ ይመልከቱ።
እንዲሁም፣ አንዳንድ የጥያቄ መታወቂያ የሚታወቅ ከሆነ፣ ይህ መታወቂያ በክትትል ስፔን ውስጥ የገባ ከሆነ በዚህ መታወቂያ በመለያ ፍለጋ በኩል ዱካ ማግኘት ይችላሉ።
ሰነድ
- የመክፈቻ ሰነዶች
opentracing.io/docs/overview/ምን-ክትትል ነው። - 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 በእውነተኛ ፒኤችፒ እና የጎላንግ ፕሮጀክት ውስጥ Jaeger Opentracing እና Microserviceswww.uber.com/distributed-tracing በኡበር ኢንጂነሪንግ የተከፋፈለ ክትትልን ማዳበርopentracing.io/guides/java medium.com/jaegertracing/running-jaeger-agent-on-bare-metal-d1fc47d31fab በባዶ ብረት ላይ የጃገር ወኪል እየሮጠ
Видео
www.youtube.com/watch?v=qg0ENOdP1Lo የመብረቅ ፈጣን የተጠቃሚ ጥያቄዎችን ለማቅረብ ጃገርን እና ፕሮሜቲየስን እንዴት እንደተጠቀምን - ብራያን ቦረሃምwww.youtube.com/watch?v=WRntQsUajow መግቢያ፡ ጃገር - ዩሪ ሽኩሮ፣ ኡበር እና ፓቮል ሎፋይ፣ ቀይ ኮፍያwww.youtube.com/watch?v=fsHb0qK37bc ሰርጌይ ኢኮቭሌቭ፣ “የትልቅ ድል ትንሽ ታሪክ፡ ክፍት ትራሲንግ፣ AWS እና Jaeger”
ምንጭ: hab.com