/
statsview_reqrate_viewers.go
89 lines (71 loc) ยท 1.84 KB
/
statsview_reqrate_viewers.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
package server
import (
"encoding/json"
"net/http"
"time"
"github.com/go-echarts/go-echarts/v2/charts"
"github.com/go-echarts/go-echarts/v2/opts"
"github.com/smallnest/statsview/viewer"
)
const (
// RPCXRequestRateMetrics is the name of RequestRateViewer
RPCXRequestRateMetrics = "rpcx_request_rate"
)
// RequestRateViewer collects metrics of rpcx.
type RequestRateViewer struct {
lastTime time.Time
lastReq uint64
s *Server
smgr *viewer.StatsMgr
graph *charts.Line
}
// NewRequestRateViewer returns the RequestRateViewer instance
func NewRequestRateViewer(s *Server) viewer.Viewer {
graph := viewer.NewBasicView(RPCXRequestRateMetrics)
graph.SetGlobalOptions(
charts.WithTitleOpts(opts.Title{Title: "RPCX Request Rate"}),
charts.WithYAxisOpts(opts.YAxis{Show: true, Name: "reqs/sec"}),
)
graph.AddSeries("Rate", []opts.LineData{})
return &RequestRateViewer{s: s, graph: graph}
}
func (vr *RequestRateViewer) SetStatsMgr(smgr *viewer.StatsMgr) {
vr.smgr = smgr
}
func (vr *RequestRateViewer) Name() string {
return RPCXRequestRateMetrics
}
func (vr *RequestRateViewer) View() *charts.Line {
return vr.graph
}
func (vr *RequestRateViewer) Serve(w http.ResponseWriter, _ *http.Request) {
vr.smgr.Tick()
if vr.lastTime.IsZero() {
metrics := viewer.Metrics{
Values: []float64{
0.0,
},
Time: viewer.MemStats().T,
}
bs, _ := json.Marshal(metrics)
w.Write(bs)
vr.lastTime = time.Now()
vr.lastReq = vr.s.requestCount.Load()
return
}
now := time.Now()
d := now.Sub(vr.lastTime).Seconds()
currentReqCount := vr.s.requestCount.Load()
count := currentReqCount - vr.lastReq
rate := float64(count / uint64(d))
vr.lastTime = now
vr.lastReq = currentReqCount
metrics := viewer.Metrics{
Values: []float64{
float64(rate),
},
Time: viewer.MemStats().T,
}
bs, _ := json.Marshal(metrics)
w.Write(bs)
}