-
-
Notifications
You must be signed in to change notification settings - Fork 273
/
metrics.go
117 lines (101 loc) Β· 2.55 KB
/
metrics.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
112
113
114
115
116
117
package terminal
import (
"time"
"github.com/tevino/abool"
"github.com/safing/portbase/api"
"github.com/safing/portbase/metrics"
)
var metricsRegistered = abool.New()
func registerMetrics() (err error) {
// Only register metrics once.
if !metricsRegistered.SetToIf(false, true) {
return nil
}
// Get scheduler config and calculat scaling.
schedulerConfig := getSchedulerConfig()
scaleSlotToSecondsFactor := float64(time.Second / schedulerConfig.SlotDuration)
// Register metrics from scheduler stats.
_, err = metrics.NewGauge(
"spn/scheduling/unit/slotpace/max",
nil,
metricFromInt(scheduler.GetMaxSlotPace, scaleSlotToSecondsFactor),
&metrics.Options{
Name: "SPN Scheduling Max Slot Pace (scaled to per second)",
Permission: api.PermitUser,
},
)
if err != nil {
return err
}
_, err = metrics.NewGauge(
"spn/scheduling/unit/slotpace/leveled/max",
nil,
metricFromInt(scheduler.GetMaxLeveledSlotPace, scaleSlotToSecondsFactor),
&metrics.Options{
Name: "SPN Scheduling Max Leveled Slot Pace (scaled to per second)",
Permission: api.PermitUser,
},
)
if err != nil {
return err
}
_, err = metrics.NewGauge(
"spn/scheduling/unit/slotpace/avg",
nil,
metricFromInt(scheduler.GetAvgSlotPace, scaleSlotToSecondsFactor),
&metrics.Options{
Name: "SPN Scheduling Avg Slot Pace (scaled to per second)",
Permission: api.PermitUser,
},
)
if err != nil {
return err
}
_, err = metrics.NewGauge(
"spn/scheduling/unit/life/avg/seconds",
nil,
metricFromNanoseconds(scheduler.GetAvgUnitLife),
&metrics.Options{
Name: "SPN Scheduling Avg Unit Life",
Permission: api.PermitUser,
},
)
if err != nil {
return err
}
_, err = metrics.NewGauge(
"spn/scheduling/unit/workslot/avg/seconds",
nil,
metricFromNanoseconds(scheduler.GetAvgWorkSlotDuration),
&metrics.Options{
Name: "SPN Scheduling Avg Work Slot Duration",
Permission: api.PermitUser,
},
)
if err != nil {
return err
}
_, err = metrics.NewGauge(
"spn/scheduling/unit/catchupslot/avg/seconds",
nil,
metricFromNanoseconds(scheduler.GetAvgCatchUpSlotDuration),
&metrics.Options{
Name: "SPN Scheduling Avg Catch-Up Slot Duration",
Permission: api.PermitUser,
},
)
if err != nil {
return err
}
return nil
}
func metricFromInt(fn func() int64, scaleFactor float64) func() float64 {
return func() float64 {
return float64(fn()) * scaleFactor
}
}
func metricFromNanoseconds(fn func() int64) func() float64 {
return func() float64 {
return float64(fn()) / float64(time.Second)
}
}