Open2

DataDog

nerusannerusan

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!")
	})
}

https://pkg.go.dev/gopkg.in/DataDog/dd-trace-go.v1/contrib/gin-gonic/gin

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...)

https://docs.datadoghq.com/ja/tracing/troubleshooting/correlated-logs-not-showing-up-in-the-trace-id-panel/?tab=jsonログ