Open2
DataDog

Ginとの連携
context.Contextにtrace_idなどの情報が入っているので、そちらを使うようにする。
ctx *gin.Contextを使うと、トレースとうまく連携できないので注意する。
ctx.Request.Context()でcontext.Contextを抽出してそちらを利用すること。
package main
import (
gintrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/gin-gonic/gin"
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
"github.com/gin-gonic/gin"
)
func main() {
tracer.Start()
defer tracer.Stop()
r := gin.Default()
// make sure that the middleware is initialized before registering any routes
r.Use(gintrace.Middleware("image-encoder"))
r.GET("/image/encode", func(c *gin.Context) {
ctx := c.Request.Context()
// tracer.StartSpanFromContext(c, "image.encode")とするとうまく連携できないので注意
encodeSpan, _ := tracer.StartSpanFromContext(ctx, "image.encode")
// encode an image
encodeSpan.Finish()
c.String(200, "ok!")
})
}
APMとログの連携
jsonログの場合、dd.trace_id
を入れるだけで関連付けされる。
spanに紐づけたい場合は、dd.span_id
を入れる。
if _, ok := ctx.(*gin.Context); ok {
slog.Warn("Do not use *gin.Context to InfoLog")
}
span, ok := tracer.SpanFromContext(ctx)
if !ok {
slog.Info(message, args...)
return
}
spanW3C, ok := span.Context().(ddtrace.SpanContextW3C)
if !ok {
slog.Info(message, args...)
return
}
attrs := append(args, slog.Group("dd", slog.String("trace_id", spanW3C.TraceID128())))
slog.Info(message, attrs...)

ゴルーチンで連携する方法