in pkg/display/graph/tree/adapter.go [29:75]
func Adapt(trace api.Trace) (roots []*Node, serviceNames []string) {
all := make(map[string]*Node)
set := make(map[string]bool)
var traceID string
for _, span := range trace.Spans {
if !set[span.ServiceCode] {
serviceNames = append(serviceNames, span.ServiceCode)
set[span.ServiceCode] = true
}
all[id(span)] = node(span)
if traceID == "" {
traceID = span.TraceID
}
}
seen := make(map[string]bool)
for _, span := range trace.Spans {
if isRoot(span) {
roots = append(roots, all[id(span)])
seen[id(span)] = true
}
for _, ref := range span.Refs {
if all[id0(ref)] == nil {
for i := 0; i <= ref.ParentSpanID; i++ {
if traceID != ref.TraceID {
continue
}
virtualSpan := virtualSpan(i, *ref)
if all[id(virtualSpan)] != nil {
continue
}
all[id(virtualSpan)] = node(virtualSpan)
if i == 0 {
roots = append(roots, all[id(virtualSpan)])
seen[id(virtualSpan)] = true
} else if all[id1(ref)] != nil {
all[id1(ref)].Children = append(all[id1(ref)].Children, all[id(virtualSpan)])
seen[id(virtualSpan)] = true
}
}
}
}
}
buildTree(all, seen, trace)
return roots, serviceNames
}