title | description | weight | default_lang_commit | htmltest | |||
---|---|---|---|---|---|---|---|
ã©ã€ãã©ãª |
ã©ã€ãã©ãªã«ãã€ãã£ãèšè£
ãè¿œå ããæ¹æ³ã玹ä»ããŸãã |
40 |
d8c5612 |
|
OpenTelemetryã¯ãå€ãã®ã©ã€ãã©ãªã«èšè£ ã©ã€ãã©ãªãæäŸããŠããŠãããã¯éåžžãã©ã€ãã©ãªããã¯ãã¢ã³ããŒãããã©ã€ãã©ãªã³ãŒããéããŠè¡ãããŸãã
OpenTelemetry ã䜿ã£ããã€ãã£ãã®ã©ã€ãã©ãªèšè£ ã¯ããŠãŒã¶ã«ããè¯ããªãã¶ãŒãããªãã£ãšéçºè äœéšãæäŸããã©ã€ãã©ãªãããã¯ãå ¬éããŠãããã¥ã¡ã³ããæžãå¿ èŠæ§ãåãé€ããŸãã
- ã«ã¹ã¿ã ãã®ã³ã°ããã¯ã¯ãäžè¬çã§äœ¿ããããOpenTelemetry APIã«çœ®ãæãããããŠãŒã¶ãŒã¯OpenTelemetryãšã ãããåãããããšã«ãªããŸãã
- ã©ã€ãã©ãªãšã¢ããªã±ãŒã·ã§ã³ã³ãŒãããã®ãã¬ãŒã¹ããã°ãã¡ããªã¯ã¹ãçžé¢ãããäžè²«æ§ãæãããããŸãã
- å ±éèŠçŽã«ããããŠãŒã¶ãŒã¯åãæè¡å ãã©ã€ãã©ãªãèšèªéã§é¡äŒŒããäžè²«æ§ã®ãããã¬ã¡ããªãŒãåŸãããŸãã
- ãã¬ã¡ããªãŒã·ã°ãã«ã¯ãããŸããŸãªæ¶è²»ã·ããªãªã®ããã«ãååã«ããã¥ã¡ã³ããçšæãããå€çš®å€æ§ãªOpenTelemetryæ¡åŒµãã€ã³ãã䜿çšããŠã埮調æŽïŒãã£ã«ã¿ãŒãåŠçãéçŽïŒã§ããŸãã
ãŠã§ããã¬ãŒã ã¯ãŒã¯ãRPCã¯ã©ã€ã¢ã³ããããŒã¿ããŒã¹ãã¡ãã»ãŒãžã³ã°ã¯ã©ã€ã¢ã³ããã€ã³ãã©ãªã©ãã«ããŒããå©çšå¯èœãªã»ãã³ãã£ãã¯èŠçŽããã§ãã¯ããŠãã ããïŒ
ããããªãã®ã©ã€ãã©ãªããã®ãããªãã®ã§ãããªããèŠçŽã«ãããã£ãŠãã ããã èŠçŽã¯äž»èŠãªæ å ±æºã§ãããã©ã®æ å ±ãã¹ãã³ã«å«ãŸããã¹ãããæããŠãããŸãã èŠçŽã¯ãèšè£ ã«äžè²«æ§ãæãããŸãããã¬ã¡ããªãŒã«æºãããŠãŒã¶ãŒã¯ãã©ã€ãã©ãªã®ä»æ§ãåŠã¶å¿ èŠããããŸãããããªãã¶ãŒãããªãã£ãã³ããŒã¯ãããŸããŸãªãã¯ãããžãŒïŒããšãã°ãããŒã¿ããŒã¹ãã¡ãã»ãŒãžã³ã°ã·ã¹ãã ïŒã«å¯Ÿå¿ããäœéšãæ§ç¯ã§ããŸãã ã©ã€ãã©ãªãèŠçŽã«ããããã°ããŠãŒã¶ãŒã®å ¥åãèšå®ãªãã§ãå€ãã®ã·ããªãªããã®ãŸãŸæå¹ã«ãªããŸãã
ã»ãã³ãã£ãã¯èŠçŽã¯åžžã«é²åããŠãããåžžã«æ°ãããã®ãè¿œå ãããŠããŸãã ããããªãã®ã©ã€ãã©ãªã«ãªããã®ãããã°ãè¿œå ããããšãæ€èšããŠãã ããã ã¹ãã³åã«ã¯ç¹ã«æ³šæããŠãã ããã æå³ã®ããååã䜿ãããã«åªããå®çŸ©ããéã«ã¯ã«ãŒãã£ããªãã£ãèæ ®ããŠãã ããã
[schema_url
]ïŒ/docs/specs/otel/schemas/#schema-urlïŒå±æ§ããããã©ã®ããŒãžã§ã³ã®ã»ãã³ãã£ãã¯èŠçŽã䜿çšãããŠããããèšé²ã§ããŸãã
å¯èœã§ããã°ããã®å±æ§ãèšå®ããŠãã ããã
äœããã£ãŒãããã¯ããã£ãããæ°ããèŠçŽãè¿œå ãããå Žåã¯ããã²è²¢ç®ããŠãã ããïŒ
CNCFã®OpenTelemetryã«é¢ããèšè£
ãã£ã³ãã«ïŒ #otel-instrumentation
ïŒãä»æ§ã®ã¬ããžããªããå§ãããšããã§ãããïŒ
ã©ã€ãã©ãªã®å©çšè ã®èŠç¹ããã©ã€ãã©ãªã®ããšãèããå©çšè ãã©ã€ãã©ãªã®åäœãã¢ã¯ãã£ããã£ã«ã€ããŠäœãç¥ããããšæãããèããŠã¿ãŠãã ããã ã©ã€ãã©ãªã®ã¡ã³ãããŒã§ããããªãã¯å éšæ§é ãç¥ã£ãŠããŸããããŠãŒã¶ãŒã¯ã©ã€ãã©ãªã®å éšæ§é ã«ã¯ããŸãèå³ãæãããèªåã®ã¢ããªã±ãŒã·ã§ã³ã®æ©èœã«èå³ãæã€ã§ãããã ã©ã€ãã©ãªã®äœ¿çšç¶æ³ãåæããäžã§ã©ã®ãããªæ å ±ã圹ã«ç«ã€ããèãããã®ããŒã¿ãã¢ãã«åããé©åãªæ¹æ³ãèããŸãããã èæ ®ãã¹ãç¹ã¯ä»¥äžã®éãã§ãã
- ã¹ãã³ãšã¹ãã³ã®éå±€
- ã¹ãã³ã®æ°å€å±æ§ïŒéçŽãããã¡ããªã¯ã¹ã®ä»£æ¿ãšããŠïŒ
- ã¹ãã³ã€ãã³ã
- éçŽãããææš
ããšãã°ãã©ã€ãã©ãªãããŒã¿ããŒã¹ãžã®ãªã¯ãšã¹ããè¡ã£ãŠããå ŽåãããŒã¿ããŒã¹ãžã®è«ççãªãªã¯ãšã¹ãã«å¯ŸããŠã®ã¿ã¹ãã³ãäœæããŸãã ãããã¯ãŒã¯ãä»ããç©ççãªãªã¯ãšã¹ãã¯ããã®æ©èœãå®è£ ããã©ã€ãã©ãªå ã§èšè£ ããå¿ èŠããããŸãã ãŸãããªããžã§ã¯ããããŒã¿ã®ã·ãªã¢ã©ã€ãºã®ãããªä»ã®ã¢ã¯ãã£ããã£ã¯ãè¿œå ã¹ãã³ãšããŠã§ã¯ãªããã¹ãã³ã€ãã³ããšããŠææããããšãããããããŸãã
ã¹ãã³å±æ§ãèšå®ãããšãã¯ãã»ãã³ãã£ãã¯èŠçŽã«ãããã£ãŠãã ããã
ããã€ãã®ã©ã€ãã©ãªã¯ããããã¯ãŒã¯åŒã³åºããã©ããããã·ã³ã¯ã©ã€ã¢ã³ãã§ãã OpenTelemetryã«ãRPCã¯ã©ã€ã¢ã³ãçšã®èšè£ ã©ã€ãã©ãªãããå¯èœæ§ããããŸãïŒã¬ãžã¹ããªããã§ãã¯ããŠãã ããïŒã ãã®å Žåãã©ãããŒã©ã€ãã©ãªã®èšè£ ã¯å¿ èŠãªããããããŸããã äžè¬çãªã¬ã€ãã©ã€ã³ãšããŠãã©ã€ãã©ãªã®èšè£ ã¯ããã®ã©ã€ãã©ãªèªèº«ã®ã¬ãã«ã§ã®ã¿è¡ã£ãŠãã ããã
次ã®ãããªå Žåã¯èšè£ ããªãã§ãã ããã
- ããªãã®ã©ã€ãã©ãªã¯ãããã¥ã¡ã³ãåãããããããã¯èªæãªAPIã®äžã«ããèããããã·ã§ã
- ãã㊠OpenTelemetryã®ãšã³ã·ã¹ãã ã«ãåå°ãšãªããããã¯ãŒã¯åŒã³åºãã®èšè£ ããããŸã
- ãã㊠ãã¬ã¡ããªãŒãå å®ãããããã«ãã©ã€ãã©ãªãããããã¹ãèŠçŽããããŸãã
è¿·ã£ãããèšè£ ã¯ãããŸããããåŸã§å¿ èŠæ§ãæãããšãã«ãã€ã§ãã§ããŸãã
ãããèšè£ ããªãããšãéžæããå Žåã§ããå éšã®RPCã¯ã©ã€ã¢ã³ãã€ã³ã¹ã¿ã³ã¹ã« OpenTelemetryãã³ãã©ãŒãèšå®ããæ¹æ³ãæäŸããããšã¯æçšã§ãããã ããã¯ãå®å šãªèªåèšè£ ããµããŒãããŠããªãèšèªã§ã¯å¿ é ã§ããããã®ä»ã®èšèªã§ãæçšã§ãã
ãã®ææžã®æ®ãã®éšåã§ã¯ãèšè£ ãè¡ãããšã決å®ããå Žåãäœãã©ã®ããã«èšè£ ããã®ãã«ã€ããŠæåŒãã瀺ããŸãã
æåã®ã¹ãããã¯ãOpenTelemetry APIããã±ãŒãžãžäŸåããããšã§ãã
OpenTelemetryã«ã¯2ã€ã®äž»èŠãªã¢ãžã¥ãŒã«ã§ããAPIãšSDKããããŸãã OpenTelemetry API ã¯ãæœè±¡åãšåäœããªãå®è£ ã®ã»ããã§ãã ã¢ããªã±ãŒã·ã§ã³ã OpenTelemetry SDKãã€ã³ããŒãããªãéããããªãã®èšè£ ã¯äœããããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããŸããã
ã©ã€ãã©ãªã¯OpenTelemetry APIã®ã¿ã䜿çšãã¹ãã§ãã
æ°ããäŸåé¢ä¿ãè¿œå ããããšãå¿é ããã®ã¯åœç¶ãããããŸããããäŸåå°çãæå°éã«æããæ¹æ³ã決ããã®ã«åœ¹ç«ã€ããã€ãã®èæ ®äºé ã玹ä»ããŸãããã
- OpenTelemetry Trace APIã¯2021幎åãã«å®å®çã«éããŸããããã®APIã¯Semantic Versioning 2.0ã«ãããã£ãŠããŠãéçºããŒã ã¯APIã®å®å®æ§ãçå£ã«åãæ¢ããŠããŸãã
- äŸåããå Žåã¯ããã£ãšãæ©ãå®å®çã® OpenTelemetry API (1.0.*)ã䜿çšããæ°æ©èœã䜿çšããå¿ èŠããªãéããã¢ããããŒãã¯é¿ããŠãã ããã
- ããªãã®èšè£ ãå®å®ãããŸã§ã®éããããå¥ã®ããã±ãŒãžãšããŠãªãªãŒã¹ããããšãæ€èšããŠãã ããã ããªãã®ã¬ããžããªã«çœ®ããŠããããšãã§ããŸãããOpenTelemetryã«è¿œå ããŠãä»ã®èšè£ ããã±ãŒãžãšäžç·ã«ãªãªãŒã¹ããããšãã§ããŸãã
- ã»ãã³ãã£ãã¯èŠçŽã¯å®å®ããŠããŸãããåŸã ã«çºå±ããŠããŸãã æ©èœçãªåé¡ã¯çºçããŸãããããšãã©ããèšè£ ãã¢ããããŒãããå¿ èŠããããããããŸããã ãã¬ãã¥ãŒãã©ã°ã€ã³ããOpenTelemetry contrib ãªããžããªã«ããã眮ãããšã§ããŠãŒã¶ã®å€æŽãå£ãããšãªããèŠçŽãææ°ã«ä¿ã€ããšãã§ãããããããŸããã
ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã®èšå®ã¯ãTracer API ãéããŠã©ã€ãã©ãªããé èœãããŸãã
ã©ã€ãã©ãªã¯ãã¢ããªã±ãŒã·ã§ã³ã« TracerProvider
ã®ã€ã³ã¹ã¿ã³ã¹ãæž¡ããŠäŸåæ§æ³šå
¥ãšãã¹ãã®å®¹æããä¿é²ããããã°ããŒãã«ã® TracerProvider
ããååŸãããã§ããŸãã
OpenTelemetry èšèªã®å®è£
ã¯ãã€ã³ã¹ã¿ã³ã¹ã®åãæž¡ããã°ããŒãã«ãžã®ã¢ã¯ã»ã¹ã«ã€ããŠãæ
£çšçãªãã®ã«åºã¥ããŠå¥œã¿ãç°ãªããããããŸããã
ãã¬ãŒãµãŒãå ¥æããéãã©ã€ãã©ãªïŒãŸãã¯ãã¬ãŒã·ã³ã°ãã©ã°ã€ã³ïŒã®ååãšããŒãžã§ã³ãæå®ããŠãã ããã ãããã¯ãã¬ã¡ããªãŒã«è¡šç€ºããããŠãŒã¶ãŒããã¬ã¡ããªãŒãåŠçããŠãã£ã«ã¿ãªã³ã°ãããããã©ãããæ¥ãã®ããç解ããèšè£ ã®åé¡ããããã°ïŒå ±åããã®ã«åœ¹ç«ã¡ãŸãã
ãããªãã¯APIåŒã³åºãçšã«äœæãããã¹ãã³ã«ãã£ãŠããŠãŒã¶ãŒã¯ãã¬ã¡ããªãŒãã¢ããªã±ãŒã·ã§ã³ã³ãŒãã«ãããã³ã°ããã©ã€ãã©ãªåŒã³åºãã®æéãšçµæãç解ã§ããŸãã ãã¬ãŒã¹ãã¹ãåŒã³åºãã¯æ¬¡ã®ãšããã§ãã
- å éšã§ãããã¯ãŒã¯ã³ãŒã«ãè¡ããããªãã¯ã¡ãœããããæéãããã倱æããå¯èœæ§ã®ããããŒã«ã«æäœïŒIOãªã©ïŒ
- ãªã¯ãšã¹ããã¡ãã»ãŒãžãåŠçãããã³ãã©ãŒ
èšè£ ã®äŸïŒ
private static Tracer tracer = getTracer(TracerProvider.noop());
public static void setTracerProvider(TracerProvider tracerProvider) {
tracer = getTracer(tracerProvider);
}
private static Tracer getTracer(TracerProvider tracerProvider) {
return tracerProvider.getTracer("demo-db-client", "0.1.0-beta1");
}
private Response selectWithTracing(Query query) {
// ã¹ãã³ã®ååãšå±æ§ã«é¢ããæåŒãã«ã€ããŠã¯ãèŠçŽããã§ãã¯ããããš
Span span = tracer.spanBuilder(String.format("SELECT %s.%s", dbName, collectionName))
.setSpanKind(SpanKind.CLIENT)
.setAttribute("db.name", dbName)
...
.startSpan();
// ã¹ãã³ãã¢ã¯ãã£ãã«ãããã°ãšãã¹ãã¹ãã³ã®é¢é£ä»ããå¯èœã«ãã
try (Scope unused = span.makeCurrent()) {
Response response = query.runWithRetries();
if (response.isSuccessful()) {
span.setStatus(StatusCode.OK);
}
if (span.isRecording()) {
// ã¬ã¹ãã³ã¹ã³ãŒãããã®ä»ã®æ
å ±ãã¬ã¹ãã³ã¹å±æ§ã«å
¥åãã
}
} catch (Exception e) {
span.recordException(e);
span.setStatus(StatusCode.ERROR, e.getClass().getSimpleName());
throw e;
} finally {
span.end();
}
}
å±æ§ãå ¥åããããã®èŠçŽã«åŸã£ãŠãã ããïŒ è©²åœãããã®ããªãå Žåã¯ãäžè¬çãªèŠçŽããã§ãã¯ããŠãã ããã
ãããã¯ãŒã¯åŒã³åºãã¯éåžžã察å¿ããã¯ã©ã€ã¢ã³ãã®å®è£ ãéããŠãOpenTelemetry èªåèšè£ ã§ãã¬ãŒã¹ãããŸãã
OpenTelemetryããããã¯ãŒã¯ã¯ã©ã€ã¢ã³ãã®ãã¬ãŒã¹ããµããŒãããŠããªãå Žåãæåã®å€æãããŠãã ããã
- ãããã¯ãŒã¯åŒã³åºãããã¬ãŒã¹ããããšã§ããŠãŒã¶ãŒãããªãã®ãµããŒãèœåãåäžããã§ãããã
- ããªãã®ã©ã€ãã©ãªã¯ãå
¬éãããããã¥ã¡ã³ãåãããRPC APIäžã®ã©ãããŒã§ãããåé¡ãçºçããå ŽåããŠãŒã¶ãŒã¯åºç€ãšãªããµãŒãã¹ãããµããŒããåããå¿
èŠããããŸããã
- ã©ã€ãã©ãªãŒãèšè£ ããåã ã®ãããã¯ãŒã¯ãã©ã€ããã¬ãŒã¹ããŸãããã
- ã¹ãã³ã䜿ã£ãŠãããã®åŒã³åºãããã¬ãŒã¹ãããšãéåžžã«åé·ã«ãªããŸããããããšãããã©ãŒãã³ã¹ã«é¡èãªåœ±é¿ãäžããŸããã
- åé·æ§ãã¹ãã³ã€ãã³ãã«ã¯ãã°ã䜿ããŸãããããã°ã¯èŠªïŒãããªãã¯APIã³ãŒã«ïŒã«é¢é£ä»ããããã¹ãã³ã€ãã³ãã¯ãããªãã¯APIã¹ãã³ã«èšå®ãããã¹ãã§ãã
- ã¹ãã³ã§ããå¿ èŠãããå ŽåïŒãŠããŒã¯ãªãã¬ãŒã¹ã³ã³ããã¹ããäŒéããäŒæããããïŒãèšå®ãªãã·ã§ã³ã§æå®ããããã«ãããããã©ã«ãã§ã¯ç¡å¹ã«ããŸãããã
OpenTelemetryããã§ã«ãããã¯ãŒã¯åŒã³åºãã®ãã¬ãŒã¹ããµããŒãããŠããã®ã§ããã°ãããããããããè€è£œããå¿ èŠã¯ãªãã§ãããã 以äžã®ããã«äŸå€ããããŸãã
- èªåèšè£ ã䜿çšããªããŠãŒã¶ãŒããµããŒãããå ŽåïŒç°å¢ã«ãã£ãŠã¯æ©èœããªãå ŽåãããŠãŒã¶ãŒãã¢ã³ããŒãããã«æžå¿µãæã€å ŽåãããïŒ
- åºç€ãšãªããµãŒãã¹ãšã®ã«ã¹ã¿ã ïŒã¬ã¬ã·ãŒïŒçžé¢ããã³ã³ã³ããã¹ãäŒæãããã³ã«ãæå¹ã«ããå Žå
- èªåèšè£ ã§ã¯ã«ããŒãããªãã絶察ã«å¿ èŠãªã©ã€ãã©ãªïŒãµãŒãã¹åºæã®æ å ±ã§RPCã¹ãã³ãå å®ãããå Žå
èŠåïŒéè€ãé¿ããããã®äžè¬çãªãœãªã¥ãŒã·ã§ã³ã¯çŸåšäœæäžã§ã ð§
ãã¬ãŒã¹ã¯ãã¢ããªãçºããã·ã°ãã«ã®äžçš®ã§ãã ã€ãã³ãïŒãŸãã¯ãã°ïŒãšãã¬ãŒã¹ã¯ãäºãã«è£å®ãåããã®ã§ãããéè€ãããã®ã§ã¯ãããŸããã åé·æ§ãæãããå¿ èŠãããå Žåã¯ããã¬ãŒã¹ããããã°ã®æ¹ãé©ããŠããŸãã
ããªãã®ã¢ããªã¯ããã§ã«ãã®ã³ã°ãã䌌ããããªã¢ãžã¥ãŒã«ã䜿ã£ãŠããå¯èœæ§ããããŸãã ããªãã®ã¢ãžã¥ãŒã«ã¯ããã§ã« OpenTelemetry ãšçµ±åãããŠãããããããŸãããããã調ã¹ãã«ã¯ãã¬ãžã¹ã㪠ãåç §ããŠãã ããã çµ±åã¯éåžžããã¹ãŠã®ãã°ã«ã¢ã¯ãã£ããªãã¬ãŒã¹ã³ã³ããã¹ããåã蟌ãããšã§ããŠãŒã¶ãããããé¢é£ä»ããããããã«ãªããŸãã
ããªãã®èšèªãšãšã³ã·ã¹ãã ãå ±éã®ãã®ã³ã°ãµããŒããæã£ãŠããªãå Žåãã¹ãã³ã€ãã³ãã䜿ã£ãŠè¿œå ã®ã¢ããªã®è©³çŽ°ãå ±æããŸãã å±æ§ãè¿œå ãããå Žåã¯ãã€ãã³ãã®æ¹ã䟿å©ãããããŸããã
çµéšåãšããŠã詳现ããŒã¿ã«ã¯ã¹ãã³ã§ã¯ãªãã€ãã³ããŸãã¯ãã°ã䜿çšããŸãããã åžžã«ãèšè£ ãäœæããã¹ãã³ã€ã³ã¹ã¿ã³ã¹ã«ã€ãã³ããæ·»ä»ããŠãã ããã ã¢ã¯ãã£ãã¹ãã³ã®äœ¿çšã¯ããããäœãåç §ããŠããã®ãå¶åŸ¡ã§ããªããããã§ããéãé¿ããŠãã ããã
ããããªããã©ã€ãã©ãªããµãŒãã¹ãããšãã°ãŠã§ããã¬ãŒã ã¯ãŒã¯ãã¡ãã»ãŒãžã³ã°ã³ã³ã·ã¥ãŒããŒãªã©ã®äžæµã®åŒã³åºããåä¿¡ãããããªä»äºãããŠãããªããåä¿¡ãããªã¯ãšã¹ãïŒã¡ãã»ãŒãžããã³ã³ããã¹ããæœåºããå¿
èŠããããŸãã
OpenTelemetry㯠Propagator
APIãæäŸããŠããŠãããã¯ç¹å®ã®äŒæåºæºãé ããŠããã¬ãŒã¹ããã Context
ãã¯ã€ã€ãŒããèªã¿åããŸãã
åäžã®ã¬ã¹ãã³ã¹ã®å Žåãã¯ã€ã€ãŒäžã®ã³ã³ããã¹ãã¯1ã€ã ãã§ããããã¯ã©ã€ãã©ãªãäœæããæ°ããã¹ãã³ã®èŠªã«ãªããŸãã
ã¹ãã³ãäœæããåŸãã¹ãã³ãã¢ã¯ãã£ãã«ããããšã§ãæ°ãããã¬ãŒã¹ã³ã³ããã¹ããã¢ããªã±ãŒã·ã§ã³ã³ãŒãïŒã³ãŒã«ããã¯ãŸãã¯ãã³ãã©ãŒïŒã«æž¡ãå¿ èŠããããŸãã
// ã³ã³ããã¹ããæœåºãã
Context extractedContext = propagator.extract(Context.current(), httpExchange, getter);
Span span = tracer.spanBuilder("receive")
.setSpanKind(SpanKind.SERVER)
.setParent(extractedContext)
.startSpan();
// ã¹ãã³ãã¢ã¯ãã£ãã«ãããã¹ãããããã¬ã¡ããªãŒãçžé¢ããããã«ãã
try (Scope unused = span.makeCurrent()) {
userCode();
} catch (Exception e) {
span.recordException(e);
span.setStatus(StatusCode.ERROR);
throw e;
} finally {
span.end();
}
ããã«Java ã§ã®ã³ã³ããã¹ãæœåºã®äŸ ã®å®å šãªãã®ããããŸãã
ã¡ãã»ãŒãžã³ã°ã·ã¹ãã ã®å ŽåãäžåºŠã«è€æ°ã®ã¡ãã»ãŒãžãåãåãããšããããŸãã åä¿¡ããã¡ãã»ãŒãžã¯ãäœæããã¹ãã³ã®ãªã³ã¯ã«ãªããŸãã 詳ããã¯ã¡ãã»ãŒãžã³ã°èŠçŽãåç §ããŠãã ããïŒèŠåïŒã¡ãã»ãŒãžã³ã°èŠçŽã¯çå®äž ð§ ã§ãïŒã
å€éšåŒã³åºããè¡ãå Žåãéåžžã¯ã³ã³ããã¹ããäžæµã®ãµãŒãã¹ã«äŒæ¬ãããããªããŸãã
ãã®å Žåãå€éšåŒã³åºãããã¬ãŒã¹ããæ°ããã¹ãã³ãäœæããPropagator
API ã䜿ã£ãŠã¡ãã»ãŒãžã«ã³ã³ããã¹ãã泚å
¥ããŸãã
éåæåŠççšã®ã¡ãã»ãŒãžãäœæããå Žåãªã©ãã³ã³ããã¹ãã泚å
¥ãããã±ãŒã¹ã¯ä»ã«ããããããããŸããã
Span span = tracer.spanBuilder("send")
.setSpanKind(SpanKind.CLIENT)
.startSpan();
// ã¹ãã³ãã¢ã¯ãã£ãã«ããããšã§ããã¹ãåããããã¬ã¡ããªãçžé¢ããã
// ãããã¯ãŒã¯ã³ãŒã«ã§ããã¹ãã³ããã°ãã€ãã³ãã®ãã¹ãåãããã¬ã€ã€ãŒããããããããªã
try (Scope unused = span.makeCurrent()) {
// ã³ã³ããã¹ãã泚å
¥
propagator.inject(Context.current(), transportLayer, setter);
send();
} catch (Exception e) {
span.recordException(e);
span.setStatus(StatusCode.ERROR);
throw e;
} finally {
span.end();
}
Javaã«ãããã³ã³ããã¹ãæ³šå ¥ã®äŸã®å šäœã¯ãã¡ããåç §ããŠãã ããã
äžèšã®ããã«äŸå€ããããããããŸããã
- äžæµã®ãµãŒãã¹ã¯ã¡ã¿ããŒã¿ããµããŒãããŠããªãããæªç¥ã®ãã£ãŒã«ããçŠæ¢ããŠãã
- äžæµã®ãµãŒãã¹ãçžé¢ãããã³ã«ãå®çŸ©ããŠããªããå°æ¥ã®ãµãŒãã¹ã®ããŒãžã§ã³ã§ãäºææ§ã®ããã³ã³ããã¹ãäŒæããµããŒããããå¯èœæ§ã¯ãããŸããããªããªãå ¥ããŸãããïŒ
- äžæµã®ãµãŒãã¹ã¯ãã«ã¹ã¿ã çžé¢ãããã³ã«ããµããŒãããŠãã
- ã«ã¹ã¿ã ãããã²ãŒã¿ãŒã§ãã¹ããšãã©ãŒãã§å¯Ÿå¿ããŠãããäºææ§ãããã°OpenTelemetryãã¬ãŒã¹ã³ã³ããã¹ãã䜿ããŸãããã
- ãããã¯ã¹ãã³ã«ã«ã¹ã¿ã çžé¢IDãçæããŠåã蟌ã¿ãŸãããã
- ã¹ãã³ãã¢ã¯ãã£ãã«ããïŒå¥åã«ã¬ã³ãïŒãã¹ãã³ããã°ããã¹ããããèªåèšè£ ãšé¢é£ä»ããããŸãã
- ã©ã€ãã©ãªãŒã«ã³ã³ããã¹ãã®æŠå¿µãããå Žåãã¢ã¯ãã£ãã¹ãã³ã«å ããŠããªãã·ã§ã³ã§æ瀺çãªãã¬ãŒã¹ã³ã³ããã¹ãã®äŒæ¬ããµããŒãããŸãããã
- ã©ã€ãã©ãªãäœæããã¹ãã³ïŒãã¬ãŒã¹ã³ã³ããã¹ãïŒãæ瀺çã«ã³ã³ããã¹ãã«çœ®ãããã®ã¢ã¯ã»ã¹æ¹æ³ãããã¥ã¡ã³ãåããŸãããã
- ãŠãŒã¶ãŒãèªåã®ã³ã³ããã¹ãã«ãã¬ãŒã¹ã³ã³ããã¹ããæž¡ããããã«ããŸãããã
- ã©ã€ãã©ãªå
ã§ããã¬ãŒã¹ã³ã³ããã¹ããæ瀺çã«äŒæãããŸããããã³ãŒã«ããã¯äžã«ã¢ã¯ãã£ããªã¹ãã³ãå€æŽãããå¯èœæ§ããããŸãïŒ
- ãããªãã¯APIã®äžã®ãŠãŒã¶ãŒããã¢ã¯ãã£ããªã³ã³ããã¹ããã§ããã ãæ©ãååŸãããããã¹ãã³ã®èŠªã³ã³ããã¹ããšããŠäœ¿çšããŸãã
- ã³ã³ããã¹ããåãæž¡ããæ瀺çã«äŒæãããã€ã³ã¹ã¿ã³ã¹ã«å±æ§ãäŸå€ãã€ãã³ããåã蟌ã¿ãŸãã
- ããã¯ãã¹ã¬ãããæ瀺çã«éå§ããããããã¯ã°ã©ãŠã³ãåŠçãè¡ã£ããããã®ä»ã䜿çšããèšèªã®éåæã³ã³ããã¹ããããŒã®å¶éã«ãã£ãŠå£ããå¯èœæ§ãããå Žåã«äžå¯æ¬ ã§ãã
OpenTelemetryã¬ãžã¹ããªã«ããªãã®èšè£ ã©ã€ãã©ãªãè¿œå ããŠãã ããã
OpenTelemetryã®APIã¯ãã¢ããªã±ãŒã·ã§ã³ã«SDKããªãå Žåãno-opã§ãéåžžã«ããã©ãŒãã³ã¹ãè¯ãã§ãã OpenTelemetry SDK ãèšå®ããããšããã€ã³ãããããªãœãŒã¹ãæ¶è²»ããŸãã
å®éã®ã¢ããªã±ãŒã·ã§ã³ãç¹ã«å€§èŠæš¡ãªãã®ã§ã¯ããããããŒã¹ã®ãµã³ããªã³ã°ãé »ç¹ã«èšå®ãããŸãã ãµã³ããªã³ã°ã¢ãŠããããã¹ãã³ã¯å®äŸ¡ã§ãããå±æ§ã®å ¥åäžã«äœåãªå²ãåœãŠãé«äŸ¡ãªèšç®ãé¿ããããã«ãã¹ãã³ãèšé²ãããŠãããã©ããããã§ãã¯ã§ããŸãã
// ãµã³ããªã³ã°ã«éèŠãªå±æ§ãããå Žåã¯ãäœææã«æäŸããå¿
èŠããã
Span span = tracer.spanBuilder(String.format("SELECT %s.%s", dbName, collectionName))
.setSpanKind(SpanKind.CLIENT)
.setAttribute("db.name", dbName)
...
.startSpan();
// ã¹ãã³ãèšé²ãããå Žåã¯ãä»ã®å±æ§ãç¹ã«èšç®ã³ã¹ãã®ãããå±æ§ãè¿œå ããå¿
èŠããã
if (span.isRecording()) {
span.setAttribute("db.statement", sanitize(query.statement()))
}
OpenTelemetry APIã¯ãå®è¡æã«å¯å®¹ã§ãã ç¡å¹ãªåŒæ°ã§ã¯å€±æããã決ããŠäŸå€ãã¹ããŒããã«é£²ã¿èŸŒã¿ãŸãã ãã®ããã«ããŠãèšè£ ã®åé¡ãã¢ããªã±ãŒã·ã§ã³ããžãã¯ã«åœ±é¿ãäžããªãããã«ããŸãã OpenTelemetry ãå®è¡æã«é ãåé¡ã«æ°ã¥ãããã«ãèšè£ ããã¹ãããŠãã ããã
OpenTelemetry ã«ã¯ããŸããŸãªèªåèšè£ ãããã®ã§ãããªãã®èšè£ ãä»ã®ãã¬ã¡ããªãŒïŒåä¿¡ãªã¯ãšã¹ããéä¿¡ãªã¯ãšã¹ãããã°ãªã©ïŒãšã©ã®ããã«çžäºäœçšããããè©ŠããŠã¿ãã®ã¯äŸ¿å©ã§ãã èšè£ ãè©Šããšãã¯ãäžè¬çãªãã¬ãŒã ã¯ãŒã¯ãšã©ã€ãã©ãªã䜿ãããã¹ãŠã®ãã¬ãŒã¹ãæå¹ã«ããå žåçãªã¢ããªã±ãŒã·ã§ã³ã䜿ã£ãŠãã ããã ããªãã®ã©ã€ãã©ãªãšäŒŒãã©ã€ãã©ãªãã©ã®ããã«è¡šç€ºããããããã§ãã¯ããŠãã ããã
ãŠããããã¹ãã§ã¯ãéåžžãSpanProcessor
ãšSpanExporter
ãã¢ãã¯ãŸãã¯ãã§ã€ã¯ã§ããŸãã
@Test
public void checkInstrumentation() {
SpanExporter exporter = new TestExporter();
Tracer tracer = OpenTelemetrySdk.builder()
.setTracerProvider(SdkTracerProvider.builder()
.addSpanProcessor(SimpleSpanProcessor.create(exporter)).build()).build()
.getTracer("test");
// ãã¹ããå®è¡...
validateSpans(exporter.exportedSpans);
}
class TestExporter implements SpanExporter {
public final List<SpanData> exportedSpans = Collections.synchronizedList(new ArrayList<>());
@Override
public CompletableResultCode export(Collection<SpanData> spans) {
exportedSpans.addAll(spans);
return CompletableResultCode.ofSuccess();
}
...
}