Service Tracing, OpenTracing සහ Jaeger

Service Tracing, OpenTracing සහ Jaeger

අපි අපගේ ව්‍යාපෘතිවල ක්ෂුද්‍ර සේවා ගෘහ නිර්මාණ ශිල්පය භාවිතා කරමු. කාර්ය සාධන අවහිරතා ඇති වූ විට, ලොග් නිරීක්ෂණය කිරීමට සහ විග්‍රහ කිරීමට බොහෝ කාලයක් ගත වේ. ලොග් ගොනුවකට තනි මෙහෙයුම් වල වේලාවන් ලොග් කරන විට, විවිධ සේවාවන්හි ක්‍රියා අනුපිළිවෙල හෝ එක් මෙහෙයුමක කාල මාරුව නිරීක්ෂණය කිරීම, මෙම මෙහෙයුම් ආමන්ත්‍රණය කිරීමට හේතු වූ දේ තේරුම් ගැනීම සාමාන්‍යයෙන් අපහසු වේ.

අතින් ශ්‍රමය අවම කිරීම සඳහා, අපි ලුහුබැඳීමේ මෙවලමක් භාවිතා කිරීමට තීරණය කළෙමු. ඔබට ලුහුබැඳීම භාවිතා කළ හැක්කේ කෙසේද සහ ඇයි සහ අපි එය කළ ආකාරය ගැන සහ මෙම ලිපියෙන් සාකච්ඡා කරනු ඇත.

ලුහුබැඳීමෙන් විසඳිය හැකි ගැටළු මොනවාද?

  1. සියලුම සහභාගී වන සේවාවන් අතර තනි සේවාවක් තුළ සහ සම්පූර්ණ ක්‍රියාත්මක කිරීමේ ගස තුළ කාර්ය සාධන බාධක සොයන්න. උදාහරණ වශයෙන්:
    • සේවා අතර බොහෝ කෙටි අඛණ්ඩ ඇමතුම්, උදාහරණයක් ලෙස, භූ කේතීකරණයට හෝ දත්ත සමුදායකට.
    • ජාල මාරු කිරීම් හෝ තැටි කියවීම් වැනි දිගු I/O බලා සිටීම.
    • දිගු දත්ත විග්‍රහ කිරීම.
    • cpu අවශ්‍ය දිගු මෙහෙයුම්.
    • අවසාන ප්‍රතිඵලය ලබා ගැනීමට අවශ්‍ය නොවන සහ ඉවත් කළ හැකි හෝ ප්‍රමාද කළ හැකි කේත කොටස්.
  2. මෙහෙයුම සිදු කරන විට කුමන අනුපිළිවෙලකින් හඳුන්වන්නේද සහ සිදුවන්නේ කුමක්ද යන්න පැහැදිලිව තේරුම් ගන්න.
    Service Tracing, OpenTracing සහ Jaeger
    උදාහරණයක් ලෙස, WS සේවාව වෙත ඉල්ලීම පැමිණි බව පෙනේ -> WS සේවාව R සේවාව හරහා දත්ත එකතු කළේය -> පසුව V සේවාව වෙත ඉල්ලීමක් යවා -> V සේවාව R වෙතින් දත්ත විශාල ප්‍රමාණයක් පටවා ඇත. service -> P service වෙත ගියා -> P සේවාව නැවතත් සේවා R -> service V වෙත ගොස් ප්‍රතිඵලය නොසලකා හැර J -> සේවාව වෙත ගොස් පසුව පමණක් WS සේවාව වෙත ප්‍රතිචාරය ලබා දී ඇත. පසුබිම.
    සමස්ත ක්‍රියාවලිය සඳහා එවැනි හෝඩුවාවක් හෝ සවිස්තරාත්මක ලියකියවිලි නොමැතිව, ඔබ පළමු වරට කේතය දෙස බලන විට සිදුවන්නේ කුමක්ද යන්න තේරුම් ගැනීම ඉතා අපහසු වන අතර කේතය විවිධ සේවාවන් හරහා විසිරී ඇති අතර බඳුන් සහ අතුරුමුහුණත් පොකුරක් පිටුපස සැඟවී ඇත.
  3. පසුව කල් දැමූ විශ්ලේෂණය සඳහා ක්රියාත්මක කිරීමේ ගස පිළිබඳ තොරතුරු රැස් කිරීම. ක්‍රියාත්මක කිරීමේ සෑම අදියරකදීම, ඔබට මෙම අදියරේදී ලබා ගත හැකි හෝඩුවාවට තොරතුරු එක් කළ හැකි අතර පසුව සමාන අවස්ථාවට තුඩු දුන් ආදාන දත්ත මොනවාදැයි සොයා බලන්න. උදාහරණ වශයෙන්:
    • පරිශීලක ID
    • අයිතිවාසිකම්
    • තෝරාගත් ක්රමයේ වර්ගය
    • ලොග් හෝ ක්‍රියාත්මක කිරීමේ දෝෂයකි
  4. හෝඩුවාවන් ප්‍රමිතික උප කුලකයක් බවට පත් කිරීම සහ දැනටමත් ප්‍රමිතික ආකාරයෙන් වැඩිදුර විශ්ලේෂණය කිරීම.

කුමන හෝඩුවාවක් ලොග් විය හැකිද. පරතරය

ලුහුබැඳීමේදී පරතරයක් පිළිබඳ සංකල්පය ඇත, මෙය කොන්සෝලයට එක් ලොගයක ප්‍රතිසමයකි. ස්පා සතුව ඇත්තේ:

  • නම, සාමාන්යයෙන් ක්රියාත්මක කරන ලද ක්රමයේ නම
  • පරතරය ජනනය කළ සේවාවේ නම
  • තමන්ගේම අනන්‍ය හැඳුනුම්පතක්
  • එයට ලොග් වී ඇති යතුරක්/අගයක ස්වරූපයෙන් යම් ආකාරයක මෙටා තොරතුරු. උදාහරණයක් ලෙස, ක්‍රම පරාමිති හෝ ක්‍රමය දෝෂයකින් හෝ නැත
  • මෙම කාල සීමාව සඳහා ආරම්භක සහ අවසන් වේලාවන්
  • මාපිය පරාසය ID

සෑම පරතරයක්ම එහි ක්‍රියාත්මක කිරීම අවසන් වූ වහාම පසුව සමාලෝචනය සඳහා දත්ත ගබඩාවේ ගබඩා කිරීම සඳහා span එකතු කරන්නා වෙත යවනු ලැබේ. අනාගතයේදී, මාපිය හැඳුනුම්පත මගින් සම්බන්ධ කිරීමෙන් ඔබට සියලු පරාසවල ගසක් සෑදිය හැකිය. විශ්ලේෂණය කරන විට, ඔබට සොයා ගත හැකිය, උදාහරණයක් ලෙස, යම් කාලයක් ගත වූ සමහර සේවාවක ඇති සියලුම පරාසයන්. තවද, නිශ්චිත පරාසයකට යාමෙන්, මෙම පරතරයට ඉහළින් සහ පහළින් සම්පූර්ණ ගසම බලන්න.

Service Tracing, OpenTracing සහ Jaeger

Opentrace, Jagger සහ අපි එය අපගේ ව්‍යාපෘති සඳහා ක්‍රියාත්මක කළ ආකාරය

පොදු සම්මතයක් ඇත opentrace, කිසියම් භාෂාවක නිශ්චිත ක්‍රියාත්මක කිරීමකට සම්බන්ධ නොවී, එකතු කළ යුත්තේ කෙසේද සහ කුමක් ද යන්න විස්තර කරයි. උදාහරණයක් ලෙස, ජාවා වලදී, හෝඩුවාවන් සහිත සියලුම වැඩ පොදු Opentrace API හරහා සිදු කරනු ලබන අතර, එය යටතේ, උදාහරණයක් ලෙස, Jaeger හෝ කිසිවක් නොකරන හිස් පෙරනිමි ක්රියාත්මක කිරීමක් සැඟවිය හැක.
අපි පාවිච්චි කරනවා ඊයෙගර් Opentrace ක්‍රියාත්මක කිරීමක් ලෙස. එය සංරචක කිහිපයකින් සමන්විත වේ:

Service Tracing, OpenTracing සහ Jaeger

  • Jaeger-agent යනු සාමාන්‍යයෙන් එක් එක් යන්ත්‍රය මත ස්ථාපනය කර ඇති දේශීය නියෝජිතයෙකු වන අතර සේවා දේශීය පෙරනිමි තොටේ එයට ලොග් වේ. නියෝජිතයෙකු නොමැති නම්, මෙම යන්ත්‍රයේ සියලුම සේවාවන්හි සලකුණු සාමාන්‍යයෙන් අක්‍රිය වේ
  • ජේගර්-එකතු කරන්නා - සියලුම නියෝජිතයින් එකතු කරන ලද හෝඩුවාවන් එයට යවන අතර එය ඒවා තෝරාගත් දත්ත ගබඩාවේ තබයි.
  • දත්ත සමුදාය ඔවුන් කැමති කැසැන්ඩ්‍රා වේ, නමුත් අපි භාවිතා කරන්නේ elasticsearch, වෙනත් දත්ත සමුදා කිහිපයක් සඳහා ක්‍රියාත්මක කිරීම් සහ තැටියට කිසිවක් ඉතිරි නොකරන මතකයේ ක්‍රියාත්මක කිරීමක් ඇත.
  • Jaeger-query යනු දත්ත සමුදාය වෙත ගොස් විශ්ලේෂණය සඳහා දැනටමත් එකතු කර ඇති අංශු ආපසු ලබා දෙන සේවාවකි
  • Jaeger-ui යනු හෝඩුවාවන් සෙවීම සහ බැලීම සඳහා වන වෙබ් අතුරු මුහුණතකි, එය jaeger-query වෙත යයි.

Service Tracing, OpenTracing සහ Jaeger

විශේෂිත භාෂාවන් සඳහා opentrace jaeger ක්‍රියාත්මක කිරීම වෙනම සංරචකයක් ලෙස හැඳින්විය හැක, එමඟින් jaeger-agent වෙත ස්පන් යවනු ලැබේ.
Java හි Jagger සම්බන්ධ කිරීම io.opentracing.Tracer අතුරුමුහුණත ක්‍රියාත්මක කිරීම දක්වා පැමිණේ, ඉන් පසුව එය හරහා ඇති සියලුම හෝඩුවාවන් සැබෑ නියෝජිතයා වෙත පියාසර කරනු ඇත.

Service Tracing, OpenTracing සහ Jaeger

වසන්ත සංරචකය සඳහාද, ඔබට සම්බන්ධ කළ හැකිය opentracing-spring-Cloud-starter සහ ජේගර් වෙතින් ක්රියාත්මක කිරීම opentracing-spring-jaeger-Cloud-starter මෙම සංරචක හරහා ගමන් කරන සෑම දෙයක්ම ස්වයංක්‍රීයව වින්‍යාස කරනු ඇත, උදාහරණයක් ලෙස http පාලකයන් වෙත ඉල්ලීම්, jdbc හරහා දත්ත සමුදායට ඉල්ලීම් යනාදිය.

ජාවා හි ලොගින් වීමේ සලකුණු

ඉහළ මට්ටමේ කොහේ හරි, පළමු ස්පාන් නිර්මාණය කළ යුතුය, මෙය ස්වයංක්රීයව සිදු කළ හැකිය, නිදසුනක් ලෙස, ඉල්ලීමක් ලැබුණු විට වසන්ත පාලකය මගින් හෝ කිසිවක් නොමැති නම් අතින්. පසුව එය පහත විෂය පථය හරහා සම්ප්‍රේෂණය වේ. පහත ඕනෑම ක්‍රමයකට 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 ඉල්ලීම් සඳහා ඇත TracingHttpClient

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 නැවත ආරම්භ කිරීමෙන් උදවු විය

නියැදීම, ගබඩා කිරීම සහ හෝඩුවාවන් බැලීම

වර්ග තුනක් ඇත නියැදි හෝඩුවාවන්:

  1. සියලුම හෝඩුවාවන් යවන සහ සුරකින කොන්ස්ට්.
  2. ලබා දී ඇති යම් සම්භාවිතාවක් සහිත හෝඩුවාවන් පෙරහන් කරන සම්භාවිතාව.
  3. තත්පරයකට හෝඩුවාවන් ගණන සීමා කරන අනුපාත සීමා කිරීම. ඔබට මෙම සැකසුම් සේවාදායකයා මත, jaeger-agent මත හෝ එකතුකරන්නා මත වින්‍යාසගත කළ හැක. දැන් අපි valuator stack එකේ const 1 භාවිතා කරනවා, මොකද ගොඩක් requests නැති නිසා, නමුත් ඒවා ගොඩක් කල් යනවා. අනාගතයේදී, මෙය පද්ධතිය මත අධික බරක් පැටවෙන්නේ නම්, ඔබට එය සීමා කළ හැකිය.

ඔබ cassandra භාවිතා කරන්නේ නම්, පෙරනිමියෙන් එය දින දෙකක් සඳහා පමණක් හෝඩුවාවන් ගබඩා කරයි. අපි පාවිච්චි කරනවා ප්‍රත්‍යාස්ථ සෙවුම සහ සලකුණු සෑම විටම ගබඩා කර ඇති අතර ඒවා මකා නොදමනු ලැබේ. එක් එක් දින සඳහා වෙනම දර්ශකයක් සාදනු ලැබේ, උදාහරණයක් ලෙස jaeger-service-2019-03-04. අනාගතයේදී, ඔබ පැරණි හෝඩුවාවන් ස්වයංක්‍රීයව පිරිසිදු කිරීම වින්‍යාසගත කළ යුතුය.

ඔබට අවශ්‍ය හෝඩුවාවන් බැලීම සඳහා:

  • ඔබට ට්‍රේස් පෙරීමට අවශ්‍ය සේවාව තෝරන්න, උදාහරණයක් ලෙස, tomcat හි ක්‍රියාත්මක වන සහ එහිම නම තිබිය නොහැකි සේවාවක් සඳහා tomcat7-default.
  • ඉන්පසු මෙහෙයුම, කාල පරතරය සහ අවම මෙහෙයුම් කාලය තෝරන්න, උදාහරණයක් ලෙස තත්පර 10 සිට, දිගු ක්රියාත්මක කිරීම් පමණක් ගැනීමට.
    Service Tracing, OpenTracing සහ Jaeger
  • එක ට්‍රේස් එකකට ගිහින් බලන්න එතන මොකක්ද මන්දා වේගය අඩු වෙන්නේ කියලා.
    Service Tracing, OpenTracing සහ Jaeger

තවද, යම් ඉල්ලීම් හැඳුනුම්පතක් දන්නා නම්, මෙම id එක ට්‍රේස් ස්පාන් තුළ ලොග් වී ඇත්නම්, ටැග් සෙවුමක් හරහා ඔබට මෙම හැඳුනුම්පතෙන් හෝඩුවාවක් සොයාගත හැකිය.

ප්‍රලේඛනය

ලිපි

Видео

  • www.youtube.com/watch?v=qg0ENOdP1Lo අකුණු වේගයෙන් පරිශීලක විමසුම් ලබා දීමට අපි ජේගර් සහ ප්‍රොමිතියස් භාවිතා කළ ආකාරය - Bryan Boreham
  • www.youtube.com/watch?v=WRntQsUajow හැඳින්වීම: ජේගර් - යූරි ෂ්කුරෝ, Uber සහ Pavol Loffay, Red Hat
  • www.youtube.com/watch?v=fsHb0qK37bc සර්ගෙයි ඉකොව්ලෙව්, “විශාල ජයග්‍රහණයක කුඩා කතාවක්: OpenTracing, AWS සහ Jaeger”

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න