ç§ãã¡ã®ãããžã§ã¯ãã§ã¯ãã€ã¯ããµãŒãã¹ ã¢ãŒããã¯ãã£ã䜿çšããŠããŸãã ããã©ãŒãã³ã¹ã®ããã«ããã¯ãçºçãããšããã°ã®ç£èŠãšè§£æã«å€ãã®æéãè²»ããããŸãã åã
ã®æäœã®ã¿ã€ãã³ã°ããã° ãã¡ã€ã«ã«èšé²ããå Žåãéåžžããããã®æäœãåŒã³åºãããåå ãç解ããŠãã¢ã¯ã·ã§ã³ã®ã·ãŒã±ã³ã¹ããç°ãªããµãŒãã¹ã«ãããå¥ã®æäœã«å¯Ÿãã XNUMX ã€ã®æäœã®æéã·ããã远跡ããããšã¯å°é£ã§ãã
æäœæ¥ãæå°éã«æããããã«ããã¬ãŒã¹ ããŒã«ã® XNUMX ã€ã䜿çšããããšã«ããŸããã ãã¬ãŒã¹ã䜿çšããæ¹æ³ãšãã®çç±ãããã³ãã®å®è¡æ¹æ³ã«ã€ããŠã¯ããã®èšäºã§èª¬æããŸãã
ãã¬ãŒã¹ã«ãã£ãŠã©ã®ãããªåé¡ã解決ã§ããã
- åäžãµãŒãã¹å
ãšãåå ããŠãããã¹ãŠã®ãµãŒãã¹éã®å®è¡ããªãŒå
šäœã®äž¡æ¹ã§ããã©ãŒãã³ã¹ã®ããã«ããã¯ãèŠã€ããŸãã äŸãã°ïŒ
- ãžãªã³ãŒãã£ã³ã°ãããŒã¿ããŒã¹ãªã©ããµãŒãã¹éã®å€æ°ã®çãé£ç¶åŒã³åºãã
- ãããã¯ãŒã¯è»¢éããã£ã¹ã¯èªã¿åããªã©ã®é·ã I/O åŸ æ©ã
- é·ãããŒã¿ã®è§£æã
- CPUãå¿ èŠãšããé·æéã®æäœã
- æçµçµæãåŸãããã«å¿ èŠã§ã¯ãªãã³ãŒãã®ã»ã¯ã·ã§ã³ã¯ãåé€ãŸãã¯é 延ããããšãã§ããŸãã
- ã©ã®ãããªé åºã§äœãåŒã³åºãããæäœãå®è¡ããããšäœãèµ·ããããæ確ã«ç解ããŸãã
ããšãã°ããªã¯ãšã¹ãã WS ãµãŒãã¹ã«å±ãã -> WS ãµãŒãã¹ã R ãµãŒãã¹ãéããŠããŒã¿ãè£å® -> 次㫠V ãµãŒãã¹ã«ãªã¯ãšã¹ããéä¿¡ -> V ãµãŒãã¹ããµãŒãã¹ãã倧éã®ããŒã¿ãããŒãããããšãããããŸãã R ãµãŒãã¹ -> P ãµãŒãã¹ã«ç§»å -> P ãµãŒãã¹ã¯åã³ãµãŒãã¹ R ã«ç§»å -> ãµãŒãã¹ V ã¯çµæãç¡èŠããŠãµãŒãã¹ J ã«ç§»å -> ãã®åŸããµãŒãã¹ WS ã«å¿çãè¿ãããã®éã«ä»ã®èšç®ãç¶ç¶èæ¯ã
ãã®ãããªãã¬ãŒã¹ãããã»ã¹å šäœã®è©³çŽ°ãªããã¥ã¡ã³ãããªããã°ãåããŠã³ãŒããèŠããšãã«äœãèµ·ãã£ãŠããã®ããç解ããã®ã¯éåžžã«é£ãããã³ãŒãã¯ããŸããŸãªãµãŒãã¹ã«æ£åšããå€æ°ã®ãã³ãã€ã³ã¿ãŒãã§ã€ã¹ã®åŸãã«é ããŠããŸãã - åŸç¶ã®é
延åæã®ããã®å®è¡ããªãŒã«é¢ããæ
å ±ã®åéã å®è¡ã®å段éã§ããã®æ®µéã§å©çšå¯èœãªãã¬ãŒã¹ã«æ
å ±ãè¿œå ããã©ã®å
¥åããŒã¿ãåæ§ã®ã·ããªãªã«ã€ãªãã£ãããææ¡ã§ããŸãã äŸãã°ïŒ
- ãŠãŒã¶ãŒID
- æš©å©
- éžæããã¡ãœããã®çš®é¡
- ãã°ãŸãã¯å®è¡ãšã©ãŒ
- ãã¬ãŒã¹ãã¡ããªã¯ã¹ã®ãµãã»ããã«å€æãããã§ã«ã¡ããªã¯ã¹ã®åœ¢åŒã§ããã«åæããŸãã
ãã°ã«èšé²ã§ãããã¬ãŒã¹ã ã¹ãã³
ãã¬ãŒã¹ã«ã¯ã¹ãã³ã®æŠå¿µããããããã¯ã³ã³ãœãŒã«ã«ããã XNUMX ã€ã®ãã°ã«çžåœããŸãã ã¹ãã«ã¯ä»¥äžãåãã£ãŠããŸãã
- åå (éåžžã¯å®è¡ãããã¡ãœããã®åå)
- ã¹ãã³ãçæããããµãŒãã¹ã®åå
- ç¬èªã®åºæID
- ãã°ã€ã³ãããŠããããŒ/å€ã®åœ¢åŒã®äœããã®ã¡ã¿æ å ±ã ããšãã°ãã¡ãœããã®ãã©ã¡ãŒã¿ãã¡ãœããããšã©ãŒã§çµäºãããã©ãããªã©ã§ãã
- ãã®ã¹ãã³ã®éå§æéãšçµäºæé
- 芪ã¹ãã³ID
åã¹ãã³ã¯ã¹ãã³ ã³ã¬ã¯ã¿ãŒã«éä¿¡ãããå®è¡ãå®äºãããšããã«åŸã§ç¢ºèªã§ããããããŒã¿ããŒã¹ã«ä¿åãããŸãã å°æ¥çã«ã¯ã芪 ID ã§æ¥ç¶ããããšã«ããããã¹ãŠã®ã¹ãã³ã®ããªãŒãæ§ç¯ã§ããããã«ãªããŸãã åæãããšãããšãã°ããããµãŒãã¹ã§æéãããã£ããã¹ãŠã®ã¹ãã³ãèŠã€ããããšãã§ããŸãã ããã«ãç¹å®ã®ã¹ãã³ã«ç§»åãããšããã®ã¹ãã³ã®äžäžã«ããããªãŒå šäœã衚瀺ãããŸãã
OpentraceãJaggerãããã³ããããããžã§ã¯ãã«å®è£ ããæ¹æ³
å
±éã®åºæºããã
ç§ãã¡ã䜿çšããŠããã®ã¯
- Jaeger-agent ã¯éåžžãåãã·ã³ã«ã€ã³ã¹ããŒã«ãããããŒã«ã« ãšãŒãžã§ã³ãã§ããããµãŒãã¹ã¯ããŒã«ã«ã®ããã©ã«ã ããŒãã§ãã°ã€ã³ããŸãã ãšãŒãžã§ã³ããååšããªãå Žåãéåžžããã®ãã·ã³äžã®ãã¹ãŠã®ãµãŒãã¹ã®ãã¬ãŒã¹ã¯ç¡å¹ã«ãªããŸãã
- ã€ã§ãŒã¬ãŒã³ã¬ã¯ã¿ãŒ - ãã¹ãŠã®ãšãŒãžã§ã³ããåéãããã¬ãŒã¹ãã€ã§ãŒã¬ãŒã³ã¬ã¯ã¿ãŒã«éä¿¡ããããããéžæããããŒã¿ããŒã¹ã«å ¥ããŸãã
- ããŒã¿ããŒã¹ã¯æšå¥šã® cassandra ã§ãããç§ãã¡ã¯ elasticsearch ã䜿çšããŠããŸããä»ã®ããŒã¿ããŒã¹ã®å®è£ ãšããã£ã¹ã¯ã«äœãä¿åããªãã€ã³ã¡ã¢ãªå®è£ ããããŸãã
- Jaeger-query ã¯ãããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ããåæã®ããã«ãã§ã«åéããããã¬ãŒã¹ãè¿ããµãŒãã¹ã§ãã
- Jaeger-ui ã¯ãã¬ãŒã¹ãæ€çŽ¢ããã³è¡šç€ºããããã® Web ã€ã³ã¿ãŒãã§ã€ã¹ã§ãããjaeger-query ã«ç§»åããŸãã
å¥ã®ã³ã³ããŒãã³ãã¯ãç¹å®ã®èšèªçšã® opentrace jaeger ã®å®è£
ãšåŒã¶ããšãã§ãããããéããŠã¹ãã³ã jaeger-agent ã«éä¿¡ãããŸãã
ã°ãã³ã³ããŒãã³ãã«ã€ããŠãã次ã®ããã«æ¥ç¶ã§ããŸãã
Java ã§ã®ãã¬ãŒã¹ãã°èšé²
æäžäœã¬ãã«ã®ã©ããã§ãæåã®ã¹ãã³ãäœæããå¿
èŠããããŸããããã¯ãããšãã°ãªã¯ãšã¹ããåä¿¡ãããšãã«ã¹ããªã³ã° ã³ã³ãããŒã©ãŒã«ãã£ãŠèªåçã«å®è¡ã§ãããªã¯ãšã¹ãããªãå Žåã¯æåã§å®è¡ã§ããŸãã ãã®åŸã以äžã®ã¹ã³ãŒããéããŠéä¿¡ãããŸãã 以äžã®ã¡ãœããã®ããããã Span ãè¿œå ããå Žåãã¹ã³ãŒãããçŸåšã® activeSpan ãååŸããæ°ãã Span ãäœæãããã®èŠªãçµæã® activeSpan ã§ãããšç€ºããæ°ãã Span ãã¢ã¯ãã£ãã«ããŸãã å€éšãµãŒãã¹ãåŒã³åºããšãçŸåšã¢ã¯ãã£ããªã¹ãã³ãå€éšãµãŒãã¹ã«æž¡ããããããã®ãµãŒãã¹ã¯ãã®ã¹ãã³ãåç
§ããŠæ°ããã¹ãã³ãäœæããŸãã
ãã¹ãŠã®äœæ¥ã¯ Tracer ã€ã³ã¹ã¿ã³ã¹ãä»ããŠè¡ãããDI ã¡ã«ããºã ãä»ããŠååŸã§ããŸããDI ã¡ã«ããºã ãæ©èœããªãå Žå㯠GlobalTracer.get () ãã°ããŒãã«å€æ°ãšããŠååŸã§ããŸãã ããã©ã«ãã§ã¯ããã¬ãŒãµãŒãåæåãããŠããªãå Žåã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();
ç§ãã¡ãçŽé¢ããåé¡
- ãã¬ãŒãµããµãŒãã¹ãŸãã¯ã³ã³ããŒãã³ãã§äœ¿çšãããŠããªãå ŽåãBean ãš DI ã¯åžžã«æ©èœãããšã¯éããŸããã
èªåé ç· Tracer ãæ©èœããªãå¯èœæ§ããããããGlobalTracer.get() ã䜿çšããå¿ èŠããããŸãã - ã¢ãããŒã·ã§ã³ãã³ã³ããŒãã³ããŸãã¯ãµãŒãã¹ã§ãªãå ŽåããŸãã¯ã¡ãœãããåãã¯ã©ã¹ã®é£æ¥ã¡ãœããããåŒã³åºãããå Žåãã¢ãããŒã·ã§ã³ã¯æ©èœããŸããã @Traced ãæ©èœããªãå Žåã¯ãäœãæ©èœããããæ éã«ç¢ºèªããæåãã¬ãŒã¹äœæã䜿çšããå¿ èŠããããŸãã Java ã¢ãããŒã·ã§ã³çšã«è¿œå ã®ã³ã³ãã€ã©ãã¢ã¿ããããããšãã§ããŸããããããã°ãã¢ãããŒã·ã§ã³ã¯ã©ãã§ãæ©èœããã¯ãã§ãã
- å€ã Spring ãš Spring Boot ã§ã¯ãDI ã®ãã°ã«ãã opentraing Spring Cloud ã®èªåæ§æãæ©èœããŸãããSpring ã³ã³ããŒãã³ãã®ãã¬ãŒã¹ãèªåçã«æ©èœããããå Žåã¯ã次ã®ããã«é¡æšã§ããŸãã
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 - ãªãœãŒã¹ã䜿çšãã Try 㯠Groovy ã§ã¯æ©èœããŸãããæåŸã« Try ã䜿çšããå¿ èŠããããŸãã
- åãµãŒãã¹ã«ã¯ããã¬ãŒã¹ãèšé²ãããç¬èªã® spring.application.name ãå¿ èŠã§ãã äžç·ã«éªéã«ãªããªãããã«ã販売ãšãã¹ãã«å¥ã®ååãä»ããã®ã¯ã©ãã§ããã
- GlobalTracer ãš Tomcat ã䜿çšããå Žåããã® Tomcat ã§å®è¡ãããŠãããã¹ãŠã®ãµãŒãã¹ã«ã¯ XNUMX ã€ã® GlobalTracer ãããããããã¹ãŠåããµãŒãã¹åã«ãªããŸãã
- ã¡ãœããã«ãã¬ãŒã¹ãè¿œå ãããšãã¯ããã®ã¡ãœãããã«ãŒãå ã§äœåºŠãåŒã³åºãããªãããã«ããå¿ èŠããããŸãã ãã¹ãŠã®åŒã³åºãã«å¯Ÿã㊠XNUMX ã€ã®å ±éãã¬ãŒã¹ãè¿œå ããå¿ èŠããããŸããããã«ãããåèšäœæ¥æéãä¿èšŒãããŸãã ããããªããšãéå°ãªè² è·ãçºçããŸãã
- äžåºŠ jaeger-ui ã«å ¥ããšã倧éã®ãã¬ãŒã¹ã«å¯ŸããŠå€§ãããããªã¯ãšã¹ããè¡ãããå¿çãåŸ ããªãã£ããããå床ãªã¯ãšã¹ããè¡ãããŸããã ãã®çµæãjaeger-query ã¯å€§éã®ã¡ã¢ãªãæ¶è²»ããElastic ã®é床ãäœäžããå§ããŸããã jaeger-queryãåèµ·åãããšè§£æ±ºããŸã
ãã¬ãŒã¹ã®ãµã³ããªã³ã°ãä¿åã衚瀺
XNUMXã€ã®ã¿ã€ãããããŸã
- ãã¹ãŠã®ãã¬ãŒã¹ãéä¿¡ããŠä¿åããå®æ°ã
- ç¹å®ã®ç¢ºçã§ãã¬ãŒã¹ããã£ã«ã¿ãªã³ã°ãã確çè«çã
- Ratelimiting 㯠1 ç§ãããã®ãã¬ãŒã¹æ°ãå¶éããŸãã ãããã®èšå®ã¯ãjaeger-agent ãŸãã¯ã³ã¬ã¯ã¿ãŒã®ã¯ã©ã€ã¢ã³ãã§æ§æã§ããŸãã ãªã¯ãšã¹ãã¯ããã»ã©å€ããããŸããããæéãããããããè©äŸ¡ã¹ã¿ãã¯ã§ const XNUMX ã䜿çšããŸãã å°æ¥çã«ãããã«ãã£ãŠã·ã¹ãã ã«éå°ãªè² è·ããããå Žåã¯ãå¶éããããšãã§ããŸãã
cassandra ã䜿çšããå Žåãããã©ã«ãã§ã¯ãã¬ãŒã¹ã¯ XNUMX æ¥éã®ã¿ä¿åãããŸãã ç§ãã¡ã䜿çšããŠããã®ã¯
ãã¬ãŒã¹ã衚瀺ããã«ã¯ã次ã®ãã®ãå¿ èŠã§ãã
- ãã¬ãŒã¹ããã£ã«ã¿ãªã³ã°ãããµãŒãã¹ãéžæããŸããããšãã°ãTomcat ã§å®è¡ãããŠãããç¬èªã®ååãæã€ããšãã§ããªããµãŒãã¹ã®å Žåã¯ãtomcat7-default ã§ãã
- 次ã«ãé·ãå®è¡ã®ã¿ãè¡ãããã®æäœãæéééãããã³æå°æäœæéã (ããšãã° 10 ç§ãã) éžæããŸãã
- ãã¬ãŒã¹ã® XNUMX ã€ã«ç§»åããããã§äœãæžéããŠããã®ãã確èªããŸãã
ãŸãããªã¯ãšã¹ã ID ãããã£ãŠããå Žåããã® ID ããã¬ãŒã¹ ã¹ãã³ã«èšé²ãããŠããã°ãã¿ã°æ€çŽ¢ãéããŠãã® ID ã«ãããã¬ãŒã¹ãèŠã€ããããšãã§ããŸãã
ÐПкÑЌеМÑаÑОÑ
- ãªãŒãã³ãã¬ãŒã¹ã®ããã¥ã¡ã³ã
opentracing.io/docs/overview/what-is-tracing - ã€ã§ãŒã¬ãŒã®ããã¥ã¡ã³ã
www.jaegertracing.io/docs/1.10 - ã€ã§ãŒã¬ãŒ Java æ¥ç¶
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 ãããžã§ã¯ãã«ããã Yetager Opentracing ãšãã€ã¯ããµãŒãã¹www.uber.com/distributed-tracing Uber Engineering ã«ãããåæ£ãã¬ãŒã·ã³ã°ã®é²åopentracing.io/guides/java Medium.com/jaegertracing/running-jaeger-agent-on-bare-metal-d1fc47d31fab ãã¢ã¡ã¿ã«äžã§ã®Jaeger Agentã®å®è¡
ãããª
www.youtube.com/watch?v=qg0ENOdP1Lo ã€ã§ãŒã¬ãŒãšããã¡ããŠã¹ã䜿çšããŠè¶ é«éã®ãŠãŒã¶ãŒ ã¯ãšãªãæäŸããæ¹æ³ â ãã©ã€ã¢ã³ ãã¢ããwww.youtube.com/watch?v=WRntQsUajow ã€ã³ãã: ã€ã§ãŒã¬ãŒ - ãŠãŒãªã»ã·ã¥ã¯ãããŠãŒã㌠& ããã«ã»ããã§ã€ãã¬ãããããwww.youtube.com/watch?v=fsHb0qK37bc Serghei Iakovlevãã倧ããªåå©ã®å°ããªç©èª: OpenTracingãAWSãJaegerã
åºæïŒ habr.com