-
Notifications
You must be signed in to change notification settings - Fork 0
/
requestTracerService.go
106 lines (85 loc) · 2.41 KB
/
requestTracerService.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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package internal
import (
"reflect"
"sync"
"github.com/Bofry/trace"
"go.opentelemetry.io/otel/propagation"
)
type RequestTracerService struct {
TracerManager *TracerManager
Enabled bool
unhandledRequestTracer *trace.SeverityTracer
tracerProvider *trace.SeverityTracerProvider
textMapPropagator propagation.TextMapPropagator
tracers map[string]*trace.SeverityTracer
tracersInitializer sync.Once
}
func (s *RequestTracerService) Tracer(id string) *trace.SeverityTracer {
if s.tracers != nil {
if tr, ok := s.tracers[id]; ok {
return tr
}
}
return s.unhandledRequestTracer
}
func (s *RequestTracerService) TextMapPropagator() propagation.TextMapPropagator {
return s.TracerManager.TextMapPropagator
}
func (s *RequestTracerService) init(requestManager interface{}) {
if requestManager == nil {
return
}
if s.Enabled {
if s.tracerProvider != nil {
s.TracerManager.TracerProvider = s.tracerProvider
}
if s.textMapPropagator != nil {
s.TracerManager.TextMapPropagator = s.textMapPropagator
}
trace.SetSpanExtractor(defaultSpanExtractor)
s.makeTracerMap()
s.buildTracer(requestManager)
}
s.makeUnhandledRequestTracer()
}
func (s *RequestTracerService) makeTracerMap() {
s.tracersInitializer.Do(func() {
s.tracers = make(map[string]*trace.SeverityTracer)
})
}
func (s *RequestTracerService) buildTracer(requestManager interface{}) {
var (
rvManager reflect.Value = reflect.ValueOf(requestManager)
)
if rvManager.Kind() != reflect.Pointer || rvManager.IsNil() {
return
}
rvManager = reflect.Indirect(rvManager)
numOfHandles := rvManager.NumField()
for i := 0; i < numOfHandles; i++ {
rvRequest := rvManager.Field(i)
if rvRequest.Kind() != reflect.Pointer || rvRequest.IsNil() {
continue
}
rvRequest = reflect.Indirect(rvRequest)
if rvRequest.Kind() == reflect.Struct {
tracer := s.TracerManager.createManagedTracer(rvRequest.Type())
info := rvManager.Type().Field(i)
if _, ok := s.tracers[info.Name]; !ok {
s.registerTracer(info.Name, tracer)
}
}
}
}
func (s *RequestTracerService) registerTracer(id string, tracer *trace.SeverityTracer) {
container := s.tracers
if tracer != nil {
if _, ok := container[id]; ok {
FasthttpHostLogger.Fatalf("specified id '%s' already exists", id)
}
container[id] = tracer
}
}
func (s *RequestTracerService) makeUnhandledRequestTracer() {
s.unhandledRequestTracer = s.TracerManager.createTracer("")
}