-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtrace.go
71 lines (57 loc) · 1.06 KB
/
trace.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
package trace_ctx
import (
"sync"
"github.com/google/uuid"
)
type (
TraceID string
Trace struct {
ID TraceID
spans []*Span
mtx *sync.Mutex
}
)
func NewTraceWithID(id TraceID) *Trace {
if len(id) == 0 {
panic("id is empty")
}
return &Trace{
ID: id,
spans: []*Span{},
mtx: &sync.Mutex{},
}
}
func NewTrace() *Trace {
return &Trace{
ID: genTraceID(),
spans: []*Span{},
mtx: &sync.Mutex{},
}
}
func (t *Trace) StartSpan(operation string, parent *Span) *Span {
t.mtx.Lock()
defer t.mtx.Unlock()
parentID := new(SpanID)
if parent != nil {
parentID = &parent.id
}
span := NewSpan(t.ID, operation, parentID)
t.spans = append(t.spans, span)
return span
}
func (t *Trace) WithSpan(operation string, parent *Span, f func()) *Span {
t.mtx.Lock()
defer t.mtx.Unlock()
parentID := new(SpanID)
if parent != nil {
parentID = &parent.id
}
span := NewSpan(t.ID, operation, parentID)
f()
span.End()
t.spans = append(t.spans, span)
return span
}
func genTraceID() TraceID {
return TraceID(replace(uuid.NewString()))
}