-
Notifications
You must be signed in to change notification settings - Fork 1
/
trace_fetcher.go
72 lines (60 loc) · 1.9 KB
/
trace_fetcher.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
package jaeger
import (
"github.com/gogo/protobuf/types"
"github.com/jaegertracing/jaeger/proto-gen/api_v3"
"github.com/mrasu/GravityR/infra/jaeger"
"github.com/mrasu/GravityR/lib"
"github.com/mrasu/GravityR/otel/omodel"
"github.com/rs/zerolog/log"
"time"
)
type TraceFetcher struct {
cli *jaeger.Client
}
func NewTraceFetcher(cli *jaeger.Client) *TraceFetcher {
return &TraceFetcher{cli: cli}
}
func (tf *TraceFetcher) FetchCompactedTraces(size int32, start, end time.Time, serviceName string, durationMin time.Duration) ([]*omodel.TraceTree, error) {
interval := 30 * time.Minute
var res []*omodel.TraceTree
times := lib.GenerateTimeRanges(start, end, interval)
for _, start := range times {
param := &api_v3.TraceQueryParameters{
ServiceName: serviceName,
StartTimeMin: &types.Timestamp{Seconds: start.Unix()},
StartTimeMax: &types.Timestamp{Seconds: start.Add(interval).Unix()},
NumTraces: size,
DurationMin: tf.toProtoDuration(durationMin),
}
log.Info().Msgf("Getting data for %s", start.Format(time.RFC3339))
trees, err := tf.findCompactedTraceTrees(param)
if err != nil {
return nil, err
}
res = append(res, trees...)
}
return res, nil
}
func (tf *TraceFetcher) toProtoDuration(duration time.Duration) *types.Duration {
secs := int64(duration.Truncate(time.Second).Seconds())
nanos := int32(duration.Nanoseconds() - int64(time.Duration(secs)*time.Second))
return &types.Duration{
Seconds: secs,
Nanos: nanos,
}
}
func (tf *TraceFetcher) findCompactedTraceTrees(param *api_v3.TraceQueryParameters) ([]*omodel.TraceTree, error) {
traces, err := tf.cli.FindTraces(param)
if err != nil {
return nil, err
}
var compactedTrees []*omodel.TraceTree
for _, trace := range traces {
trees := ToTraceTrees(trace.Spans)
for _, tree := range trees {
compacted := tree.Compact()
compactedTrees = append(compactedTrees, compacted)
}
}
return compactedTrees, nil
}