-
Notifications
You must be signed in to change notification settings - Fork 67
/
traces.go
123 lines (101 loc) 路 2.65 KB
/
traces.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package mappings
import (
"strconv"
"github.com/kubeshop/tracetest/server/openapi"
"github.com/kubeshop/tracetest/server/pkg/timing"
"github.com/kubeshop/tracetest/server/traces"
"go.opentelemetry.io/otel/trace"
)
// out
func (m OpenAPI) Trace(in *traces.Trace) openapi.Trace {
if in == nil {
return openapi.Trace{}
}
flat := map[string]openapi.Span{}
for id, span := range in.Flat {
flat[id.String()] = m.Span(*span)
}
return openapi.Trace{
TraceId: in.ID.String(),
Tree: m.Span(in.RootSpan),
Flat: flat,
}
}
func (m OpenAPI) Span(in traces.Span) openapi.Span {
parentID := ""
if in.Parent != nil {
parentID = in.Parent.ID.String()
}
attributes := make(map[string]string, len(in.Attributes))
for name, value := range in.Attributes {
attributes[name] = value
if m.traceConversionConfig.IsTimeField(name) {
valueAsInt, _ := strconv.Atoi(value)
attributes[name] = traces.ConvertNanoSecondsIntoProperTimeUnit(valueAsInt)
}
}
kind := string(in.Kind)
if kind == "" {
kind = string(traces.SpanKindUnespecified)
}
return openapi.Span{
Id: in.ID.String(),
ParentId: parentID,
Kind: kind,
StartTime: in.StartTime.UnixMilli(),
EndTime: in.EndTime.UnixMilli(),
Attributes: attributes,
Children: m.Spans(in.Children),
Name: in.Name,
}
}
func (m OpenAPI) Spans(in []*traces.Span) []openapi.Span {
spans := make([]openapi.Span, len(in))
for i, s := range in {
spans[i] = m.Span(*s)
}
return spans
}
// in
func (m Model) Trace(in openapi.Trace) *traces.Trace {
tid, _ := trace.TraceIDFromHex(in.TraceId)
flat := make(map[trace.SpanID]*traces.Span, len(in.Flat))
for id, span := range in.Flat {
sid, _ := trace.SpanIDFromHex(id)
span := m.Span(span, nil)
flat[sid] = &span
}
tree := m.Span(in.Tree, nil)
if spanIsEmpty(tree) && len(flat) == 0 {
return nil
}
return &traces.Trace{
ID: tid,
RootSpan: tree,
Flat: flat,
}
}
func spanIsEmpty(span traces.Span) bool {
return span.ID == trace.SpanID{} && len(span.Attributes) == 0 && span.Name == "" && len(span.Children) == 0
}
func (m Model) Span(in openapi.Span, parent *traces.Span) traces.Span {
sid, _ := trace.SpanIDFromHex(in.Id)
span := traces.Span{
ID: sid,
Attributes: in.Attributes,
Name: in.Name,
StartTime: timing.ParseUnix(int64(in.StartTime)),
EndTime: timing.ParseUnix(int64(in.EndTime)),
Parent: parent,
}
span.Children = m.Spans(in.Children, &span)
return span
}
func (m Model) Spans(in []openapi.Span, parent *traces.Span) []*traces.Span {
spans := make([]*traces.Span, len(in))
for i, s := range in {
span := m.Span(s, parent)
spans[i] = &span
}
return spans
}