-
Notifications
You must be signed in to change notification settings - Fork 1
/
span_map.go
59 lines (48 loc) · 1.24 KB
/
span_map.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
package sentry
// Based on the original: github.com/getsentry/sentry-go/otel
import (
"sync"
sdk "github.com/getsentry/sentry-go"
apiTrace "go.opentelemetry.io/otel/trace"
)
// Map of Sentry spans to OpenTelemetry spans.
// Singleton instance.
var sentrySpanMap spanMap
func init() {
sentrySpanMap = spanMap{}
sentrySpanMap.Clear()
}
// spanMap is a mapping between OpenTelemetry spans and Sentry spans.
// It helps Sentry span processor and propagator to keep track of
// unfinished Sentry spans and to establish parent-child links between
// spans.
type spanMap struct {
db map[apiTrace.SpanID]*sdk.Span
mu sync.RWMutex
}
func (sm *spanMap) Get(otelSpandID apiTrace.SpanID) (*sdk.Span, bool) {
sm.mu.RLock()
defer sm.mu.RUnlock()
sp, ok := sm.db[otelSpandID]
return sp, ok
}
func (sm *spanMap) Set(otelSpandID apiTrace.SpanID, sentrySpan *sdk.Span) {
sm.mu.Lock()
defer sm.mu.Unlock()
sm.db[otelSpandID] = sentrySpan
}
func (sm *spanMap) Delete(otelSpandID apiTrace.SpanID) {
sm.mu.Lock()
defer sm.mu.Unlock()
delete(sm.db, otelSpandID)
}
func (sm *spanMap) Clear() {
sm.mu.Lock()
defer sm.mu.Unlock()
sm.db = make(map[apiTrace.SpanID]*sdk.Span)
}
func (sm *spanMap) Len() int {
sm.mu.RLock()
defer sm.mu.RUnlock()
return len(sm.db)
}