8幎ééçºãç¶ããMTSã§ããã¯ãšã³ãéçºè ãšããŠåããŠããIlya Kaznacheevã¯ãGolangãããžã§ã¯ãã§OpenTelemetryã䜿çšããæ¹æ³ãå ±æããæºåãã§ããŠããŸãã Golang Live 2020äŒè°ã§ã圌ã¯ããã¬ãŒã¹ãšç£èŠã®ããã®æ°ããæšæºã®äœ¿çšãèšå®ãããããžã§ã¯ãã«ãã§ã«ååšããã€ã³ãã©ã¹ãã©ã¯ãã£ãšãããåéã«ããæ¹æ³ã«ã€ããŠè©±ããŸããã
OpenTelemetryã¯æ¯èŒçæè¿ã®æšæºã§ãããæšå¹Žæ«ã«ãªããŸãããåæã«ã圌ã¯ãã¬ãŒã¹ãšç£èŠã®ããã®ãœãããŠã§ã¢ã®å€ãã®ãã³ããŒããå¹ åºãé åžãšãµããŒããåããŸããã
å¯èŠ³æž¬æ§ããŸãã¯å¯èŠ³æž¬æ§ã¯ãå€éšã®å åã«ãã£ãŠã·ã¹ãã ã®å éšç¶æ ãã©ãã ã倿ã§ããããæ±ºå®ããå¶åŸ¡çè«ããã®çšèªã§ããã·ã¹ãã ã¢ãŒããã¯ãã£ã§ã¯ãããã¯å®è¡æã«ã·ã¹ãã ã®ç¶æ ãç£èŠããããã®äžé£ã®ã¢ãããŒããæå³ããŸãããããã®ã¢ãããŒãã«ã¯ããã®ã³ã°ããã¬ãŒã¹ãããã³ç£èŠãå«ãŸããŸãã
ãã¬ãŒã¹ãšç£èŠã®ããã®å€ãã®ãã³ããŒãœãªã¥ãŒã·ã§ã³ããããŸããæè¿ãŸã§ã2016幎ã«ç»å ŽããCNCFã®OpenTracingãš2018幎ã«ç»å ŽããGoogleã®OpenCensusã®2ã€ã®ãªãŒãã³ã¹ã¿ã³ããŒãããããŸããã
ãããã¯ã2019幎ã«ãOpenTelemetryãšåŒã°ãã1ã€ã®æ°ããæšæºã«çµ±åããããšã決å®ãããŸã§ããã°ããã®éäºãã«ç«¶åããŠãã2ã€ã®éåžžã«åªããæšæºã§ãã
ãã®æšæºã«ã¯ã忣ãã¬ãŒã¹ãšç£èŠãå«ãŸããŸããæåã®2ã€ãšäºææ§ããããŸããããã«ãOpenTracingãšOpen Censusã¯2幎以å ã«ãµããŒããçµäºããŠãããå¿ ç¶çã«OpenTelemetryãžã®ç§»è¡ã«è¿ã¥ããŠããŸãã
䜿çšã·ããªãª
ãã®æšæºã¯ããã¹ãŠããã¹ãŠãšçµã¿åãããããã®ååãªæ©äŒãæ³å®ããŠãããå®éãã¡ããªãã¯ãšãã¬ãŒã¹ã®ãœãŒã¹ãšãã®ã³ã³ã·ã¥ãŒããŒã®éã®ã¢ã¯ãã£ããªã¬ã€ã€ãŒã§ãã
äž»ãªã·ããªãªãèŠãŠã¿ãŸãããã
忣ãã¬ãŒã¹ã®å ŽåãJaegerãŸãã¯äœ¿çšããŠãããµãŒãã¹ãžã®æ¥ç¶ãçŽæ¥èšå®ã§ããŸãã
ãã¬ãŒã¹ãçŽæ¥ãããŒããã£ã¹ããããå Žåã¯ãconfigã䜿çšããŠãã©ã€ãã©ãªã眮ãæããããšãã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã§ãã§ã«OpenTracingã䜿çšããŠããå Žåã¯ãOpenTracing Bridgeã䜿çšã§ããŸããããã¯ãOpenTracingAPIãžã®ãªã¯ãšã¹ãããããã¬ãã«ã®OpenTelemetryAPIã«å€æããã©ãããŒã§ãã
ã¡ããªãã¯ãåéããããã«ãã¢ããªã±ãŒã·ã§ã³ã®ã¡ããªãã¯ããŒãã«çŽæ¥ã¢ã¯ã»ã¹ããããã«Prometheusãæ§æããããšãã§ããŸãã
ããã¯ãåçŽãªã€ã³ãã©ã¹ãã©ã¯ãã£ããããã¡ããªãã¯ãçŽæ¥åéããå Žåã«åœ¹ç«ã¡ãŸãããããããã®èŠæ Œã¯ããã«æè»æ§ãæäŸããŸãã
æšæºã䜿çšããããã®äž»ãªã·ããªãªã¯ãã³ã¬ã¯ã¿ãŒãä»ããŠã¡ããªãã¯ãšãã¬ãŒã¹ãåéããããšã§ããã³ã¬ã¯ã¿ãŒã¯ãå¥ã®ã¢ããªã±ãŒã·ã§ã³ãŸãã¯ã³ã³ãããŒã«ãã£ãŠã€ã³ãã©ã¹ãã©ã¯ãã£ãŒã«èµ·åãããŸãããŸããæ¢è£œã®å®¹åšãæã£ãŠèªå® ã«èšçœ®ããããšãã§ããŸãã
ãããè¡ãã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã§OTLP圢åŒã§ãšã¯ã¹ããŒã¿ãŒãæ§æããã ãã§ååã§ããããã¯ãOpenTracing圢åŒã§ããŒã¿ãéä¿¡ããããã®grpcã¹ããŒã ã§ããã³ã¬ã¯ã¿ãŒåŽãããã¡ããªãã¯ãšãã¬ãŒã¹ããšã³ããŠãŒã¶ãŒãŸãã¯ä»ã®åœ¢åŒã«ãšã¯ã¹ããŒãããããã®åœ¢åŒãšãã©ã¡ãŒã¿ãŒãæ§æã§ããŸããããšãã°ãOpenCensusã§ã¯ã
ã³ã¬ã¯ã¿ãŒã䜿çšãããšãåºåã§å€æ°ã®ã¿ã€ãã®ããŒã¿ãœãŒã¹ãšå€ãã®ããŒã¿ã·ã³ã¯ãæ¥ç¶ã§ããŸãã
ãããã£ãŠãOpenTelemetryæšæºã¯ãå€ãã®ãªãŒãã³ãœãŒã¹ããã³ãã³ããŒæšæºãšã®äºææ§ãæäŸããŸãã
æšæºã®ããããŒã«ãã¯æ¡åŒµå¯èœã§ãããããã£ãŠãã»ãšãã©ã®ãã³ããŒã¯ãããããã°ããã§ã«ç¬èªã®ãœãªã¥ãŒã·ã§ã³ã®æºåãã§ããŠããèŒžåºæ¥è ãæã£ãŠããŸããç¬èªã®ãã³ããŒããã¡ããªãã¯ãšãã¬ãŒã¹ãåéããå Žåã§ããOpenTelemetryã䜿çšã§ããŸããããã«ããããã³ããŒã®ããã¯ã€ã³ã«é¢ããåé¡ã解決ãããŸãã OpenTelemetryã«çŽæ¥è¡šç€ºãããŠããªããã®ãããå Žåã§ããOpenCensusãä»ããŠè»¢éã§ããŸãã
ã³ã¬ã¯ã¿ãŒèªäœã¯ãéåžžã®YAMLæ§æã䜿çšããŠéåžžã«ç°¡åã«æ§æã§ããŸã
ãã¬ã·ãŒããŒã¯ããã§æå®ãããŸããã¢ããªã±ãŒã·ã§ã³ã«ã¯ä»ã®ãœãŒã¹ïŒKafkaãªã©ïŒãããå ŽåããããŸã
ããšã¯ã¹ããŒã¿ãŒ-ããŒã¿åä¿¡è ã
ããã»ããµ-ã³ã¬ã¯ã¿å ã§ããŒã¿ãåŠçããæ¹æ³ïŒ
ãããŠãã³ã¬ã¯ã¿ãŒå ãæµããåããŒã¿ã¹ããªãŒã ãã©ã®ããã«åŠçãããããçŽæ¥å®çŸ©ãããã€ãã©ã€ã³ïŒ
1ã€ã®å®äŸãèŠãŠââã¿ãŸãããã
ãã§ã«OpenTelemetryããã蟌ã¿ãæ§æãããã€ã¯ããµãŒãã¹ããããšããŸãããããŠãåæ§ã®æçåã䌎ããã1ã€ã®ãµãŒãã¹ã
ãããŸã§ã®ãšããããã¹ãŠãç°¡åã§ããããããæ¬¡ã®ãã®ããããŸãã
- OpenCensusãä»ããŠå®è¡ãããã¬ã¬ã·ãŒãµãŒãã¹ã
- ç¬èªã®åœ¢åŒã§ããŒã¿ãéä¿¡ããããŒã¿ããŒã¹ïŒããšãã°ãPostgreSQLã®ããã«çŽæ¥Prometheusã«ïŒã
- ã³ã³ããå ã§æ©èœããç¬èªã®åœ¢åŒã§ã¡ããªãã¯ãæäŸãããã®ä»ã®ãµãŒãã¹ããã®ã³ã³ãããåæ§ç¯ããŠãµã€ãã«ãŒãå°ç¡ãã«ããŠãã¡ããªãã¯ãåãã©ãŒãããããããšã¯æãŸãããããŸãããããªãã¯ããããæŸã£ãŠéãããã ãã§ãã
- ã¡ããªãã¯ãåéããäœããã®æ¹æ³ã§ãããã䜿çšãããããŒããŠã§ã¢ã
ãããã®ã¡ããªãã¯ã¯ãã¹ãŠã1ã€ã®ã³ã¬ã¯ã¿ãŒã«çµã¿åãããããšãã§ããŸãã
æ¢åã®ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããã¡ããªãã¯ãšãã¬ãŒã¹ã®å€ãã®ãœãŒã¹ããã§ã«ãµããŒãããŠããŸãããŸãããšããŸããã¯ãªãã®ã䜿çšããŠããå Žåã¯ãç¬èªã®ãã©ã°ã€ã³ãå®è£ ã§ããŸãããããããããå®éã«å¿ èŠã«ãªãå¯èœæ§ã¯äœãã§ããã¡ããªãã¯ãŸãã¯ãã¬ãŒã¹ãäœããã®æ¹æ³ã§ãšã¯ã¹ããŒãããã¢ããªã±ãŒã·ã§ã³ã¯ãããã€ãã®äžè¬çãªæšæºãŸãã¯OpenCensusãªã©ã®ãªãŒãã³æšæºã®ããããã䜿çšããããã§ãã
ããã§ããã®æ å ±ã䜿çšããŸããJaegerããã¬ãŒã¹ã®ãšã¯ã¹ããŒã¿ãŒãšããŠæå®ããã¡ããªãã¯ãPrometheusãŸãã¯äºææ§ã®ãããã®ã«éä¿¡ã§ããŸããã¿ããªã®ãæ°ã«å ¥ãã®VictoriaMetricsãšããŸãããã
ããããçªç¶AWSã«ç§»è¡ããŠãããŒã«ã«ã®X-Rayãã¬ãŒãµãŒã䜿çšããããšã«ããå Žåã¯ã©ããªãã§ãããããåé¡ãªããããã¯ãX âRayã®ãšã¯ã¹ããŒã¿ãŒãããOpenCensusãä»ããŠè»¢éã§ããŸãã
ãããã£ãŠããããã®éšåãããã¡ããªãã¯ãšãã¬ãŒã¹ã®ããã«ãã¹ãŠã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãçµã¿ç«ãŠãããšãã§ããŸãã
çè«ã¯çµãããŸãããå®éã«ãã¬ãŒã¹ã䜿çšããæ¹æ³ã«ã€ããŠè©±ããŸãããã
Golangã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ïŒãã¬ãŒã¹
æåã«ãåŒã³åºãããªãŒãæé·ããã«ãŒãã¹ãã³ãäœæããå¿ èŠããããŸãã
ctx := context.Background() tr := global.Tracer("github.com/me/otel-demo") ctx, span := tr.Start(ctx, "root") span.AddEvent(ctx, "I am a root span!") doSomeAction(ctx, "12345") span.End()
ããã¯ããµãŒãã¹ãŸãã¯ã©ã€ãã©ãªã®ååã§ãããã®ããã«ããŠãã¢ããªã±ãŒã·ã§ã³ã®ãã¬ãŒã ã¯ãŒã¯å ã«ãããã¬ãŒã¹å ã®ã¹ãã³ãšãã€ã³ããŒããããã©ã€ãã©ãªã«éä¿¡ãããã¹ãã³ãå®çŸ©ã§ããŸãã
次ã«ãã«ãŒãã¹ãã³ã次ã®ååã§äœæãããŸãã
ctx, span := tr.Start(ctx, "root")
ãã¬ãŒã¹ã¬ãã«ãæç¢ºã«èª¬æããååãéžæããŠãã ãããããšãã°ãã¡ãœããïŒãŸãã¯ã¯ã©ã¹ãšã¡ãœããïŒã®ååãŸãã¯ã¢ãŒããã¯ãã£å±€ã®ããããã«ãªããŸããããšãã°ãã€ã³ãã©ã¹ãã©ã¯ãã£ã¬ã€ã€ãŒãããžãã¯ã¬ã€ã€ãŒãããŒã¿ããŒã¹ã¬ã€ã€ãŒãªã©ã§ãã
ã¹ãã³ããŒã¿ãã³ã³ããã¹ãã«å ¥ããããŸãã
ctx, span := tr.Start(ctx, "root") span.AddEvent(ctx, "I am a root span!") doSomeAction(ctx, "12345")
ãããã£ãŠããã¬ãŒã¹ããã¡ãœãããã³ã³ããã¹ãã«æž¡ãå¿ èŠããããŸãã
ã¹ãã³ã¯ãã³ãŒã«ããªãŒã®ç¹å®ã®ã¬ãã«ã®ããã»ã¹ã衚ããŸããçºçããå Žåã¯ã屿§ããã°ããšã©ãŒã¹ããŒã¿ã¹ãå«ããããšãã§ããŸããã¹ãã³ã¯æåŸã«éããå¿ èŠããããŸããéããŠããå Žåããã®æéãèšç®ãããŸãã
ctx, span := tr.Start(ctx, "root") span.AddEvent(ctx, "I am a root span!") doSomeAction(ctx, "12345") span.End()
ãããJaegerã§ã®ã¹ãã³ã®å€èг
ã§ããã¹ãã³ ãå±éããŠãã°ãšå±æ§ã確èªã§ããŸãã
次ã«ãæ°ããã¹ãã³ãèšå®ããããªãå Žåã¯ãã³ã³ããã¹ãããåãã¹ãã³ãååŸã§ããŸããããšãã°ã1ã€ã®ã¹ãã³ã«1ã€ã®ã¢ãŒããã¯ãã£ã¬ã€ã€ãŒãèšè¿°ããã¬ã€ã€ãŒãè€æ°ã®ã¡ãœãããšè€æ°ã®åŒã³åºãã¬ãã«ã«åæ£ããŠãããšããŸããããªãã¯ãããæã«å ¥ããããã«æžã蟌ã¿ããããŠããã¯éããŸãã
func doSomeAction(ctx context.Context, requestID string) { span := trace.SpanFromContext(ctx) span.AddEvent(ctx, "I am the same span!") ... }
äœææãšåãæ¹æ³ã§éãããããããã§éããå¿ èŠã¯ãããŸãããç§ãã¡ã¯ãããæèããå€ããŠããã ãã§ãã
ã«ãŒãã¹ãã³ãžã®ã¡ãã»ãŒãžã®æžã蟌ã¿ïŒ
åå¥ã«ååšããããã«ãæ°ããåã¹ãã³ãäœæããå¿ èŠãããå ŽåããããŸãã
func doSomeAction(ctx context.Context, requestID string) { ctx, span := global.Tracer("github.com/me/otel-demo"). Start(ctx, "child") defer span.End() span.AddEvent(ctx, "I am a child span!") ... }
ããã§ãlibraryãšããååã®ã°ããŒãã«ãã¬ãŒãµãŒãååŸããŸãããã®åŒã³åºãã¯ããµãŒãã¹å šäœã§åãã«ãªããããäœããã®ã¡ãœããã§ã©ããããããšããã°ããŒãã«å€æ°ã䜿çšããããšãã§ããŸãã
次ã«ãã³ã³ããã¹ãããåã¹ãã³ãäœæãããæåã«è¡ã£ãã®ãšåãããã«ãååãå²ãåœãŠãããŸãã
Start(ctx, "child")
äœæãããã¡ãœããã®æåŸã§ã¹ãã³ãéããããšãå¿ããªãã§ãã ããã
ctx, span := global.Tracer("github.com/me/otel-demo"). Start(ctx, "child") defer span.End()
åã¹ãã³ã«è©²åœããã¡ãã»ãŒãžãæžã蟌ã¿ãŸãã
ããã§ã¯ãã¡ãã»ãŒãžãéå±€çã«è¡šç€ºãããåã¹ãã³ã芪ã®äžã«ããããšãããããŸããåæåŒã³åºãã ã£ããããçããªããšäºæ³ãããŸãã
ã¹ãã³ã«æžã蟌ãããšãã§ãã屿§ã瀺ããŠããŸãã
func doSomeAction(ctx context.Context, requestID string) { ... span.SetAttributes(label.String("request.id", requestID)) span.AddEvent(ctx, "request validation ok") span.AddEvent(ctx, "entities loaded", label.Int64("count", 123)) span.SetStatus(codes.Error, "insertion error") }
ããšãã°ããªã¯ãšã¹ãã¯ããã«ãããŸããidïŒ
ã€ãã³ãã远å ã§ããŸãïŒ
span.AddEvent(ctx, "request validation ok")
ãŸããããã§ã©ãã«ã远å ã§ããŸããããã¯ãlogrus圢åŒã®æ§é åãã°ãšã»ãŒåãããã«æ©èœããŸãã
span.AddEvent(ctx, "entities loaded", label.Int64("count", 123))
ããã§ã¯ãã¹ãã³ãã°ã«ã¡ãã»ãŒãžã衚瀺ãããŸããå±éããŠã©ãã«ã衚瀺ã§ããŸãããã®äŸã§ã¯ãã©ãã«ã«ãŠã³ããããã«è¿œå ãããŠã
ãŸããæ€çŽ¢ã§ãã£ã«ã¿ãªã³ã°ãããšãã«äœ¿çšãããšäŸ¿å©ã§ãã
ãšã©ãŒãçºçããå Žåã¯ãã¹ãã³ã«ã¹ããŒã¿ã¹ã远å ã§ããŸãããã®å Žåãç¡å¹ãšããŠããŒã¯ãããŸãã
span.SetStatus(codes.Error, "insertion error")
OpenCensusããã®ãšã©ãŒã³ãŒãã䜿çšããããã«äœ¿çšãããæšæºã§ããããããã¯grpcããã®ãã®ã§ãããããã§ãOKãERRORãããã³UNSETã®ã¿ãæ®ããŸãã OKãããã©ã«ãã§ããšã©ãŒã®å Žåã¯ERRORã远å ãããŸãã
ããã§ã¯ããšã©ãŒãã¬ãŒã¹ãèµ€ãã¢ã€ã³ã³ã§ããŒã¯ãããŠããããšãããããŸãããšã©ãŒã³ãŒããšããã«é¢ããã¡ãã»ãŒãžããããŸã
ããã¬ãŒã¹ã¯ãã°ã®ä»£ããã§ã¯ãªãããšãå¿ããŠã¯ãªããŸãããéèŠãªç¹ã¯ã忣ã·ã¹ãã ãä»ããæ å ±ã®æµãã远跡ããããšã§ãããã®ããã«ã¯ããããã¯ãŒã¯èŠæ±ã«ãã¬ãŒã¹ãå ¥ããŠãããããèªã¿åãããšãã§ããããã«ããå¿ èŠããããŸãã
ãã¬ãŒã¹ãã€ã¯ããµãŒãã¹
OpenTelemetryã«ã¯ãããŸããŸãªãã¬ãŒã ã¯ãŒã¯ãšã©ã€ãã©ãªçšã®ã€ã³ã¿ãŒã»ãã¿ãŒãšããã«ãŠã§ã¢ã®å€ãã®ã»ããããŒãã£å®è£ ããã§ã«ãããŸãããããã¯ãªããžããªã«ãããŸãïŒ github.com/open-telemetry/opentelemetry-go-contrib
ã€ã³ã¿ãŒã»ãã¿ãŒãšããã«ãŠã§ã¢ãååšãããã¬ãŒã ã¯ãŒã¯ã®ãªã¹ãïŒ
- ããŒãŽ
- èœã¡çããŠ
- ãžã³
- gocql
- ããã¯ã¹
- ãšã³ãŒ
- http
- grpc
- ãµã©ã
- memcache
- ã¢ã³ãŽ
- ãã«ãã³
äŸãšããŠãæšæºã®httpã¯ã©ã€ã¢ã³ããšãµãŒããŒã䜿çšããŠããã䜿çšããæ¹æ³ãèŠãŠã¿ãŸãããã
ããã«ãŠã§ã¢ã¯ã©ã€ã¢ã³ã
ã¯ã©ã€ã¢ã³ãã§ã¯ããã©ã³ã¹ããŒããšããŠã€ã³ã¿ãŒã»ãã¿ãŒã远å ããã ãã§ãããã®åŸããªã¯ãšã¹ãã¯trace.idãšãã¬ãŒã¹ãç¶è¡ããããã«å¿ èŠãªæ å ±ã§åŒ·åãããŸãã
client := http.Client{ Transport: otelhttp.NewTransport(http.DefaultTransport), } req, _ := http.NewRequestWithContext(ctx, "GET", url, nil) resp, err := client.Do(req)
ããã«ãŠã§ã¢ãµãŒããŒ
ã©ã€ãã©ãªã®ååãæã€å°ããªããã«ãŠã§ã¢ããµãŒããŒã«è¿œå ãããŸãã
http.Handle("/", otelhttp.NewHandler( http.HandlerFunc(get), "root")) err := http.ListenAndServe(addr, nil)
次ã«ããã€ãã®ããã«ãã³ã³ããã¹ãããã¹ãã³ãååŸãããããæäœããäœããæžã蟌ã¿ãåã¹ãã³ãäœæããããããéããŸãã
ããã¯ã3ã€ã®ãµãŒãã¹ãééãããåçŽãªèŠæ±ã®å€èгã§ã
ãã¹ã¯ãªãŒã³ã·ã§ããã¯ãåŒã³åºãã®éå±€ããµãŒãã¹ãžã®åå²ããããã®æéãã·ãŒã±ã³ã¹ã瀺ããŠããŸãããããããã¯ãªãã¯ãããšãããè©³çŽ°ãªæ å ±ã衚瀺ãããŸãã
ãããŠãããã¯ãšã©ãŒãã©ã®ããã«èŠãããã§ãïŒ
ãããèµ·ãã£ãå Žæããã€ãã©ããããã®æéãçµéãããã远跡ããã®ã¯ç°¡åã§ãã
ã¹ãã³ã§ã¯ããšã©ãŒãçºçããã³ã³ããã¹ãã«é¢ãã詳现æ å ±ã確èªã§ããŸãã
ããã«ãã¹ãã³å šäœãåç §ãããã£ãŒã«ãïŒããŸããŸãªãªã¯ãšã¹ãIDããªã¯ãšã¹ãå ã®ããŒãã«ã®ããŒãã£ãŒã«ããé 眮ãããã®ä»ã®ã¡ã¿ããŒã¿ïŒã¯ãäœææã«ã¹ãã³ã«ãã¹ãã§ããŸãã倧ãŸãã«èšãã°ãããããã¹ãŠã®ãã£ãŒã«ããã³ããŒããŠããšã©ãŒãåŠçãããã¹ãŠã®å Žæã«è²Œãä»ããå¿ èŠã¯ãããŸãããããªãã¯ããã«ã€ããŠã®ããŒã¿ãã¹ãã³ããããã«æžãããšãã§ããŸãã
ããã«ãŠã§ã¢æ©èœ
ããã«å°ãããŒãã¹ããããŸãïŒãŽãªã©ããžã³ã®ãããªãã®ã®ããã®ã°ããŒãã«ããã«ãŠã§ã¢ãšããŠããã䜿çšã§ããããã«ããã«ãŠã§ã¢ãäœãæ¹æ³ïŒ
middleware := func(h http.Handler) http.Handler { return otelhttp.NewHandler(h, "root") }
Golang Application InstrumentationïŒã¢ãã¿ãªã³ã°ã¢ãã¿ãªã³ã°
ã«ã€ããŠè©±ãæãæ¥ãŸããã
ç£èŠã·ã¹ãã ãžã®æ¥ç¶ã¯ããã¬ãŒã¹ã®å Žåãšåãæ¹æ³ã§æ§æãããŸãã
枬å®ã¯2ã€ã®ã¿ã€ãã«åããããŸãïŒ
1ãåæããŠãŒã¶ãŒãåŒã³åºãæã«æç€ºçã«å€ãæž¡ãå ŽåïŒ
- ã«ãŠã³ã¿ãŒ
- UpDownCounter
- ValueRecorder
int64ãfloat64
2.éåæãSDK ã¯ãã¢ããªã±ãŒã·ã§ã³ããã®ããŒã¿åéæã«æ¬¡ã®ããã«èªã¿åããŸãã
- SumObserver
- UpDownSumObserver
- ValueObserver
int64ãfloat64
ã¡ããªãã¯èªäœã¯æ¬¡ã®ãšããã§ãã
- æ£ã®æ°ãåèšããæžå°ããªãå æ³ããã³å調ïŒCounterãSumObserverïŒã
- æ£ãšè² ã®æ°ãåèšã§ãããå調ã§ã¯ãªãå æ³ïŒUpDownCounterãUpDownSumObserverïŒã
- å€ã®ã·ãŒã±ã³ã¹ãåã«èšé²ããéå æ³ïŒValueRecorderãValueObserverïŒãããšãã°ãããçš®ã®é åžã
ããã°ã©ã ã®éå§æã«ãã°ããŒãã«ã¡ãŒã¿ãŒãäœæãããã©ã€ãã©ãªãŸãã¯ãµãŒãã¹ã®ååã瀺ãããŸãã
meter := global.Meter("github.com/ilyakaznacheev/otel-demo") floatCounter := metric.Must(meter).NewFloat64Counter( "float_counter", metric.WithDescription("Cumulative float counter"), ).Bind(label.String("label_a", "some label")) defer floatCounter.Unbind()
次ã«ãã¡ããªãã¯ãäœæãããŸãã
floatCounter := metric.Must(meter).NewFloat64Counter( "float_counter", metric.WithDescription("Cumulative float counter"), ).Bind(label.String("label_a", "some label"))
圌女ã«ã¯ååãä»ããããŠããŸãïŒ
"float_counter",
説æïŒ
⊠metric.WithDescription("Cumulative float counter"), âŠ
ãªã¯ãšã¹ãããã£ã«ã¿ãªã³ã°ããããã®ã©ãã«ã®ã»ãããããšãã°ãGrafanaã§ããã·ã¥ããŒããäœæããå ŽåïŒ
⊠).Bind(label.String("label_a", "some label")) âŠ
ããã°ã©ã ã®æåŸã«ãã¡ããªãã¯ããšã«UnbindãåŒã³åºãå¿ èŠããããŸããããã«ããããªãœãŒã¹ãè§£æŸãããæ£ããéããããŸãã
⊠defer floatCounter.Unbind() âŠ
倿Žã®èšé²ã¯ç°¡åã§ãã
var ( counter metric.BoundFloat64Counter udCounter metric.BoundFloat64UpDownCounter valueRecorder metric.BoundFloat64ValueRecorder ) ... counter.Add(ctx, 1.5) udCounter.Add(ctx, -2.5) valueRecorder.Record(ctx, 3.5)
ãããã¯ãCounterã®æ£ã®æ°å€ãåèšãããUpDownCounterã®æ°å€ãããã³ValueRecorderã®æ°å€ã§ãããã¹ãŠã®çš®é¡ã®æ©åšã§ãGoã¯int64ãšfloat64ããµããŒãããŠããŸãã
ãããåºåã§åŸããããã®ã§ãã
# HELP float_counter Cumulative float counter # TYPE float_counter counter float_counter{label_a="some label"} 20
ããã¯ãã³ã¡ã³ããšç¹å®ã®ã©ãã«ãä»ããã¡ããªãã¯ã§ããæ¬¡ã«ãPrometheusããçŽæ¥ååŸããããOpenTelemetryã³ã¬ã¯ã¿ãŒãããšã¯ã¹ããŒãããŠãå¿ èŠãªå Žæã§äœ¿çšã§ããŸãã
Golang Application InstrumentationïŒã©ã€ãã©ãª
ç§ãèšãããæåŸã®ããšã¯ãæšæºãã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ã©ã€ãã©ãªã«æäŸããæ©èœã§ãã
以åã¯ãOpenCensusãšOpenTracingã䜿çšããå Žåãåã ã®ã©ã€ãã©ãªãç¹ã«ãªãŒãã³ãœãŒã¹ã©ã€ãã©ãªãã€ã³ã¹ãã«ã¡ã³ãåã§ããŸããã§ããããã®å Žåããã³ããŒã®ããã¯ã€ã³ãçºçããããã§ãããã¬ãŒã¹ã坿¥ã«æ±ã£ãããšã®ãã人ãªã誰ã§ããå€§èŠæš¡ãªã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªãã¯ã©ãŠããµãŒãã¹çšã®å€§èŠæš¡ãªAPIãã説æãã«ãããšã©ãŒã§ã¯ã©ãã·ã¥ããããšããããšããäºå®ã«ããããæ³šæãæã£ãŠããŸãã
ããã§ã¯ããã¬ãŒã¹ãéåžžã«åœ¹ç«ã¡ãŸããç¹ã«çç£æ§ã®é¢ã§ã¯ããªãããã®äžæç¢ºãªç¶æ³ãããããªããããèµ·ãã£ãã®ããç¥ããããšæããŸãããã ããã€ã³ããŒãããã©ã€ãã©ãªããã®ãšã©ãŒã¡ãã»ãŒãžã ãã衚瀺ãããŸãã
OpenTelemetryã¯ãã®åé¡ã解決ããŸãã
SDKãšAPIã¯æšæºã§åé¢ãããŠãããããSDKãç¹å®ã®ããŒã¿ãšã¯ã¹ããŒãèšå®ã«é¢ä¿ãªããã¡ããªãã¯ãã¬ãŒã¹APIã䜿çšã§ããŸããããã«ãæåã«ã¡ãœãããã€ã³ã¹ãã«ã¡ã³ãåããŠããããã®ããŒã¿ã®å€éšãžã®ãšã¯ã¹ããŒããæ§æããããšãã§ããŸãã
ãã®ããã«ããŠãããŒã¿ããšã¯ã¹ããŒãããæ¹æ³ãšå Žæãæ°ã«ããããšãªããã€ã³ããŒãããã©ã€ãã©ãªãã€ã³ã¹ãã«ã¡ã³ãåã§ããŸããããã¯ãå éšã©ã€ãã©ãªãšãªãŒãã³ãœãŒã¹ã©ã€ãã©ãªã®äž¡æ¹ã§æ©èœããŸãã
ãã³ããŒã®ããã¯ã€ã³ã«ã€ããŠå¿é ããå¿ èŠã¯ãããŸããããã®æ å ±ãã©ã®ããã«äœ¿çšããããããŸãã¯ãŸã£ãã䜿çšããããã©ããã«ã€ããŠå¿é ããå¿ èŠã¯ãããŸãããã©ã€ãã©ãªãšã¢ããªã±ãŒã·ã§ã³ã¯äºåã«ã€ã³ã¹ãã«ã¡ã³ãåãããŠãããããŒã¿ãšã¯ã¹ããŒãæ§æã¯ã¢ããªã±ãŒã·ã§ã³ã®åæåæã«æå®ãããŸãã
ãããã£ãŠãæ§æèšå®ãSDKã¢ããªã±ãŒã·ã§ã³ã§èšå®ãããŠããããšãããããŸããæ¬¡ã«ããã¬ãŒã¹ãšã¡ããªãã¯ã®ãšã¯ã¹ããŒã¿ãŒã«å¯ŸåŠããå¿ èŠããããŸãã OpenTelemetryã³ã¬ã¯ã¿ãŒã«ãšã¯ã¹ããŒãããå Žåã¯ãOTLPãä»ããŠ1ã€ã®ãšã¯ã¹ããŒã¿ãŒã«ããããšãã§ããŸããæ¬¡ã«ãå¿ èŠãªãã¹ãŠã®ãã¬ãŒã¹ãšã¡ããªãã¯ãã³ã³ããã¹ãã«åé¡ãããå¥ã®ã¡ãœããã«ãã£ãŠåŒã³åºãããªãŒã«äŒæãããŸãã
ã¢ããªã±ãŒã·ã§ã³ã¯ãOpenTelemetry APIãšã³ã³ããã¹ãå ã®ããŒã¿ã䜿çšããã ãã§ãæ®ãã®ã¹ãã³ãã«ãŒãã¹ãã³ããç¶æ¿ããŸãããã®å Žåãã€ã³ããŒããããã©ã€ãã©ãªã¯å ¥åãšããŠã³ã³ããã¹ãã¡ãœãããåãåãããã®ã¡ãœããããã«ãŒãã¹ãã³ã«é¢ããæ å ±ãèªã¿åãããšããŸããããã«ãªãå Žåã¯ãç¬èªã«äœæããŠãããããžãã¯ã«æç€ºããŸãããã®ããã«ããŠãæåã«ã©ã€ãã©ãªãã€ã³ã¹ãã«ã¡ã³ãåã§ããŸãã
ããã«ããã¹ãŠãã€ã³ã¹ãã«ã¡ã³ãåããããšã¯ã§ããŸãããããŒã¿ãšã¯ã¹ããŒã¿ãŒãæ§æããããšã¯ã§ããããããã€ããã ãã§ãã
ããã¯æ¬çªç°å¢ã§æ©èœããå¯èœæ§ããããã€ã³ãã©ã¹ãã©ã¯ãã£ãå®å®ãããŸã§ããã¬ãŒã¹ãšç£èŠãæ§æããããšã¯ã§ããŸãããæ¬¡ã«ãããããæ§æããããã«ã³ã¬ã¯ã¿ãŒããã®ããŒã¿ãåéããããã®ããã€ãã®ã¢ããªã±ãŒã·ã§ã³ããããã€ãããšããã¹ãŠãæ©èœããŸããã¡ãœããèªäœã§çŽæ¥äœã倿Žããå¿ èŠã¯ãããŸããã
ãããã£ãŠããªãŒãã³ãœãŒã¹ã©ã€ãã©ãªãããå Žåã¯ãOpenTelemetryã䜿çšããŠã€ã³ã¹ãã«ã¡ã³ãåã§ããŸããæ¬¡ã«ãããã䜿çšãã人ã ãOpenTelemetryãæ§æãããã®ããŒã¿ã䜿çšããŸãã
çµè«ãšããŠãOpenTelemetryæšæºã¯ææã§ãããšèšããããšæããŸãããããããæåŸã«ãããã¯ç§ãã¡å šå¡ãèŠããã£ãã®ãšåãæ®éçãªæšæºã§ãã
åœç€Ÿã¯ãOpenCensusæšæºãç©æ¥µçã«äœ¿çšããŠãäŒç€Ÿã®ãã€ã¯ããµãŒãã¹ã©ã³ãã¹ã±ãŒãã远跡ããã³ç£èŠããŠããŸãããªãªãŒã¹åŸã«OpenTelemetryãå®è£ ããäºå®ã§ãã