From 56510fc0f5646cc619d492a08bc9e1e66afd24df Mon Sep 17 00:00:00 2001 From: Nicholas Hulston Date: Mon, 27 Jan 2025 14:20:09 -0500 Subject: [PATCH] serialize span links in meta before finishing span --- ddtrace/tracer/span.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/ddtrace/tracer/span.go b/ddtrace/tracer/span.go index 75051ea172..23bb953395 100644 --- a/ddtrace/tracer/span.go +++ b/ddtrace/tracer/span.go @@ -10,6 +10,7 @@ package tracer import ( "context" "encoding/base64" + "encoding/json" "fmt" "os" "reflect" @@ -469,6 +470,21 @@ func (s *span) AddSpanLinks(spanLinks ...ddtrace.SpanLink) { s.SpanLinks = append(s.SpanLinks, spanLinks...) } +// serializeSpanLinksInMeta saves span links as a JSON string under `Span[meta][_dd.span_links]`. +func (s *span) serializeSpanLinksInMeta() { + if len(s.SpanLinks) == 0 { + return + } + spanLinkBytes, err := json.Marshal(s.SpanLinks) + if err != nil { + return + } + if s.Meta == nil { + s.Meta = make(map[string]string) + } + s.Meta["_dd.span_links"] = string(spanLinkBytes) +} + // Finish closes this Span (but not its children) providing the duration // of its part of the tracing session. func (s *span) Finish(opts ...ddtrace.FinishOption) { @@ -519,6 +535,8 @@ func (s *span) Finish(opts ...ddtrace.FinishOption) { } } + s.serializeSpanLinksInMeta() + s.finish(t) orchestrion.GLSPopValue(sharedinternal.ActiveSpanKey) }