This repository has been archived by the owner on Jan 10, 2023. It is now read-only.
/
spectator.go
99 lines (82 loc) · 2.66 KB
/
spectator.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
package main
import (
"sync"
"github.com/Netflix/spectator-go"
"go.opencensus.io/stats/view"
)
type opencensusDistributionData struct {
sync.Mutex
id *spectator.Id
distributionData view.DistributionData
}
func newOpencensusDistributionData(id *spectator.Id) *opencensusDistributionData {
return &opencensusDistributionData{
id: id,
}
}
func (d *opencensusDistributionData) MeterId() *spectator.Id { // nolint: golint
return d.id
}
func (d *opencensusDistributionData) update(data *view.DistributionData) {
d.Lock()
defer d.Unlock()
d.distributionData = *data
}
func (d *opencensusDistributionData) Measure() []spectator.Measurement {
d.Lock()
defer d.Unlock()
cnt := spectator.NewMeasurement(d.id.WithStat("count"), float64(d.distributionData.Count))
tTime := spectator.NewMeasurement(d.id.WithStat("totalAmount"), (d.distributionData.Sum()))
mx := spectator.NewMeasurement(d.id.WithStat("max"), (d.distributionData.Max))
mn := spectator.NewMeasurement(d.id.WithStat("min"), (d.distributionData.Min))
avg := spectator.NewMeasurement(d.id.WithStat("avg"), (d.distributionData.Mean))
d.distributionData = view.DistributionData{}
return []spectator.Measurement{cnt, tTime, avg, mx, mn}
}
type spectatorGoExporter struct {
registry *spectator.Registry
previousValues map[string]int64
}
func newSpectatorGoExporter(registry *spectator.Registry) *spectatorGoExporter {
return &spectatorGoExporter{
previousValues: make(map[string]int64),
registry: registry,
}
}
func (s *spectatorGoExporter) opencensusDistributionDataWithId(id *spectator.Id) *opencensusDistributionData { // nolint: golint
m := s.registry.NewMeter(id, func() spectator.Meter {
return newOpencensusDistributionData(id)
})
d, ok := m.(*opencensusDistributionData)
if ok {
return d
}
// throw in strict mode
return newOpencensusDistributionData(id)
}
func (s *spectatorGoExporter) ExportView(vd *view.Data) {
for _, row := range vd.Rows {
tags := make(map[string]string, len(row.Tags))
for idx := range row.Tags {
tags[row.Tags[idx].Key.Name()] = row.Tags[idx].Value
}
id := spectator.NewId(vd.View.Name, tags)
switch v := row.Data.(type) {
case *view.DistributionData:
s.opencensusDistributionDataWithId(id).update(v)
case *view.CountData:
key := id.String()
if prevValue, ok := s.previousValues[key]; ok {
s.registry.CounterWithId(id).Add(v.Value - prevValue)
s.previousValues[key] = v.Value
} else {
s.registry.CounterWithId(id).Add(v.Value)
s.previousValues[key] = v.Value
}
case *view.SumData:
s.registry.CounterWithId(id).AddFloat(v.Value)
case *view.LastValueData:
s.registry.GaugeWithId(id).Set(v.Value)
}
}
}