@@ -19,30 +19,47 @@ type Translator struct {
19
19
mu sync.RWMutex
20
20
span2trace map [string ]spanEntry
21
21
ttl time.Duration
22
+ stop chan struct {}
22
23
}
23
24
24
25
func NewTranslator () * Translator {
25
- return & Translator {
26
+ t := & Translator {
26
27
span2trace : make (map [string ]spanEntry ),
27
28
ttl : 5 * time .Minute ,
29
+ stop : make (chan struct {}),
28
30
}
31
+ if t .ttl > 0 {
32
+ go t .clean ()
33
+ }
34
+ return t
29
35
}
30
36
31
- // Translate converts every OTLP span in the request to a Run slice.
32
- func (t * Translator ) Translate (req * collectortracepb.ExportTraceServiceRequest ) []* model.Run {
33
- total := 0
34
- // gc stale aliases first
35
- if t .ttl > 0 {
36
- cutoff := time .Now ().Add (- t .ttl )
37
- t .mu .Lock ()
38
- for k , v := range t .span2trace {
39
- if v .ts .Before (cutoff ) {
40
- delete (t .span2trace , k )
37
+ func (t * Translator ) clean () {
38
+ ticker := time .NewTicker (t .ttl / 2 )
39
+ defer ticker .Stop ()
40
+ for {
41
+ select {
42
+ case <- ticker .C :
43
+ cutoff := time .Now ().Add (- t .ttl )
44
+ t .mu .Lock ()
45
+ for k , v := range t .span2trace {
46
+ if v .ts .Before (cutoff ) {
47
+ delete (t .span2trace , k )
48
+ }
41
49
}
50
+ t .mu .Unlock ()
51
+ case <- t .stop :
52
+ return
42
53
}
43
- t .mu .Unlock ()
44
54
}
55
+ }
56
+
57
+ func (t * Translator ) Close () { close (t .stop ) }
45
58
59
+ // Translate converts every OTLP span in the request to a Run slice.
60
+ // Creating a new one spins up a new goroutine to clean up stale aliases.
61
+ func (t * Translator ) Translate (req * collectortracepb.ExportTraceServiceRequest ) []* model.Run {
62
+ total := 0
46
63
// count total spans
47
64
for _ , rs := range req .ResourceSpans {
48
65
for _ , ss := range rs .ScopeSpans {
0 commit comments