-
Notifications
You must be signed in to change notification settings - Fork 510
/
sort.go
60 lines (51 loc) · 1.61 KB
/
sort.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
package model
import (
"bytes"
"sort"
"github.com/grafana/tempo/pkg/tempopb"
v1 "github.com/grafana/tempo/pkg/tempopb/trace/v1"
)
// SortTrace sorts a *tempopb.Trace
func SortTrace(t *tempopb.Trace) {
// Sort bottom up by span start times
for _, b := range t.Batches {
for _, ils := range b.InstrumentationLibrarySpans {
sort.Slice(ils.Spans, func(i, j int) bool {
return compareSpans(ils.Spans[i], ils.Spans[j])
})
}
sort.Slice(b.InstrumentationLibrarySpans, func(i, j int) bool {
return compareIls(b.InstrumentationLibrarySpans[i], b.InstrumentationLibrarySpans[j])
})
}
sort.Slice(t.Batches, func(i, j int) bool {
return compareBatches(t.Batches[i], t.Batches[j])
})
}
func compareBatches(a *v1.ResourceSpans, b *v1.ResourceSpans) bool {
if len(a.InstrumentationLibrarySpans) > 0 && len(b.InstrumentationLibrarySpans) > 0 {
return compareIls(a.InstrumentationLibrarySpans[0], b.InstrumentationLibrarySpans[0])
}
return false
}
func compareIls(a *v1.InstrumentationLibrarySpans, b *v1.InstrumentationLibrarySpans) bool {
if len(a.Spans) > 0 && len(b.Spans) > 0 {
return compareSpans(a.Spans[0], b.Spans[0])
}
return false
}
func compareSpans(a *v1.Span, b *v1.Span) bool {
// Sort by start time, then id
if a.StartTimeUnixNano == b.StartTimeUnixNano {
return bytes.Compare(a.SpanId, b.SpanId) == -1
}
return a.StartTimeUnixNano < b.StartTimeUnixNano
}
// SortTraceBytes sorts a *tempopb.TraceBytes
func SortTraceBytes(t *tempopb.TraceBytes) {
sort.Slice(t.Traces, func(i, j int) bool {
traceI := t.Traces[i]
traceJ := t.Traces[j]
return bytes.Compare(traceI, traceJ) == -1
})
}