ReplaceAttrでOpenTelemetryのトレースID/スパンIDを仕込む
code:log_test.go
var (
traceID = trace.TraceID{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}
spanID = trace.SpanID{'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n'}
)
sc := trace.NewSpanContext(trace.SpanContextConfig{
TraceID: traceID,
SpanID: spanID,
})
tracedCtx := trace.ContextWithSpanContext(ctx, sc)
slog.Info("msg")
code:handler.go
func addSpanContextAttrs(record *slog.Record, sc trace.SpanContext) {
ret := slog.NewRecord(record.Time, record.Level, record.Message, record.PC)
defer func() { *record = ret }()
attrTraceID := slog.String("trace_id", sc.TraceID().String())
attrSpanID := slog.String("span_id", sc.SpanID().String())
for a := range record.Attrs {
if a.Key == "otel" && a.Value.Kind() == slog.KindGroup {
subAttrs := a.Value.Group()
subAttrs = append(subAttrs, attrTraceID, attrSpanID)
ret.AddAttrs(slog.GroupAttrs(a.Key, subAttrs...))
return
}
ret.AddAttrs(a)
}
ret.AddAttrs(slog.GroupAttrs("otel", attrTraceID, attrSpanID))
}