-
Notifications
You must be signed in to change notification settings - Fork 74
/
UrlTemplate.go
111 lines (94 loc) · 2.4 KB
/
UrlTemplate.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
107
108
109
110
111
package agent
import (
"sync"
"time"
v1 "github.com/pinpoint-apm/pinpoint-c-agent/collector-agent/pinpoint-grpc-idl/proto/v1"
)
const bucketVersion = 0
const histogramSize = 8
type uriStatHistogram struct {
Total int64
Max int64
TimestampHistogram [histogramSize]int32
}
func (ust *uriStatHistogram) Update(span *TSpan) {
elapseTime := span.GetElapsedTime()
ust.Total += int64(elapseTime)
if int64(elapseTime) > ust.Max {
ust.Max = int64(elapseTime)
}
ust.TimestampHistogram[span.FindHistogramLevel()] += 1
}
func (ust *uriStatHistogram) ToUriHistogram() *v1.PUriHistogram {
pbUriHistogram := &v1.PUriHistogram{
Total: ust.Total,
Max: ust.Max,
Histogram: ust.TimestampHistogram[:],
}
return pbUriHistogram
}
type statHistograms struct {
TotalHistogram uriStatHistogram
FailedHistogram uriStatHistogram
}
func (st *statHistograms) Update(span *TSpan) {
st.TotalHistogram.Update(span)
if span.IsFailed() {
st.FailedHistogram.Update(span)
}
}
type UrlTemplateReport struct {
uriMap map[string]*statHistograms
BucketVersion int32
mu sync.Mutex
}
func (utr *UrlTemplateReport) Interceptor(span *TSpan) bool {
if len(span.UT) > 0 {
// found uri templated
utr.updateUriSnapshot(span)
}
return true
}
func (utr *UrlTemplateReport) updateUriSnapshot(span *TSpan) {
utr.mu.Lock()
defer utr.mu.Unlock()
ut := span.UT
var st *statHistograms
var ok bool
if st, ok = utr.uriMap[ut]; !ok {
st = &statHistograms{}
utr.uriMap[ut] = st
}
st.Update(span)
}
func (utr *UrlTemplateReport) MoveUtReport() *v1.PStatMessage {
utr.mu.Lock()
defer utr.mu.Unlock()
agentUriStat := &v1.PAgentUriStat{
BucketVersion: int32(utr.BucketVersion),
}
for url, st := range utr.uriMap {
eachUriStat := &v1.PEachUriStat{
Uri: url,
TotalHistogram: st.TotalHistogram.ToUriHistogram(),
FailedHistogram: st.FailedHistogram.ToUriHistogram(),
Timestamp: time.Now().UnixMilli(),
}
agentUriStat.EachUriStat = append(agentUriStat.EachUriStat, eachUriStat)
}
//note: create a new one
utr.uriMap = make(map[string]*statHistograms)
pbStat := &v1.PStatMessage{
Field: &v1.PStatMessage_AgentUriStat{
AgentUriStat: agentUriStat,
},
}
return pbStat
}
func CreateUrlTemplateReport() *UrlTemplateReport {
ut := &UrlTemplateReport{
uriMap: make(map[string]*statHistograms),
BucketVersion: bucketVersion,
}
return ut
}