Skip to content

Commit 6f5fc92

Browse files
committed
mon: add vm based metrics
1 parent 45847c7 commit 6f5fc92

File tree

6 files changed

+192
-26
lines changed

6 files changed

+192
-26
lines changed

pkg/monitoring.go

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
package pkg
22

3-
import "github.com/pnsafonov/pind/pkg/monitoring"
3+
import (
4+
"github.com/pnsafonov/pind/pkg/monitoring/mon_state"
5+
)
46

57
func setMonitoringState(ctx *Context) error {
68
state := fillMonitoringState(ctx)
79
ctx.Monitoring.SetState(state)
810
return nil
911
}
1012

11-
func fillMonitoringState(ctx *Context) *monitoring.State {
12-
state := monitoring.NewState()
13+
func fillMonitoringState(ctx *Context) *mon_state.State {
14+
state := mon_state.NewState()
1315

1416
state.Pool.IdleLoad0 = ctx.pool.IdleLoad0
1517
state.Pool.IdleLoad1 = ctx.pool.IdleLoad1
@@ -22,7 +24,7 @@ func fillMonitoringState(ctx *Context) *monitoring.State {
2224
for i := 0; i < l0; i++ {
2325
node := ctx.pool.Nodes[i]
2426

25-
nodeMon := &monitoring.PoolNode{
27+
nodeMon := &mon_state.PoolNode{
2628
Index: i,
2729
LoadFree0: node.LoadFree0,
2830
LoadFree1: node.LoadFree1,
@@ -32,5 +34,22 @@ func fillMonitoringState(ctx *Context) *monitoring.State {
3234
state.Pool.Nodes = append(state.Pool.Nodes, nodeMon)
3335
}
3436

37+
for _, pinProc := range ctx.state.Procs {
38+
if pinProc.ProcInfo.VmName == "" {
39+
continue
40+
}
41+
42+
numa0 := pinProc.GetNuma0()
43+
proc := &mon_state.Proc{
44+
VmName: pinProc.ProcInfo.VmName,
45+
Time: state.Time,
46+
CPU: pinProc.ProcInfo.cpu0,
47+
Load: pinProc.ProcInfo.load,
48+
Numa0: numa0,
49+
}
50+
51+
state.Procs[pinProc.ProcInfo.VmName] = proc
52+
}
53+
3554
return state
3655
}

pkg/monitoring/collector/proc.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package collector
2+
3+
import (
4+
"fmt"
5+
"github.com/pnsafonov/pind/pkg/monitoring/mon_state"
6+
"github.com/prometheus/client_golang/prometheus"
7+
)
8+
9+
type Proc struct {
10+
VmName string
11+
Proc *mon_state.Proc
12+
13+
CPU *prometheus.Desc
14+
Load *prometheus.Desc
15+
Numa0 *prometheus.Desc
16+
}
17+
18+
func NewProc(proc *mon_state.Proc) (*Proc, error) {
19+
vmName := proc.VmName
20+
if vmName == "" {
21+
return nil, fmt.Errorf("vm name is required")
22+
}
23+
24+
ent := &Proc{
25+
VmName: vmName,
26+
Proc: proc,
27+
}
28+
29+
labels0 := prometheus.Labels{
30+
"vm_name": vmName,
31+
}
32+
33+
ent.CPU = prometheus.NewDesc("pind_vm_cpu",
34+
"vm cpu",
35+
nil, labels0,
36+
)
37+
ent.Load = prometheus.NewDesc("pind_vm_load",
38+
"is vm on load",
39+
nil, labels0,
40+
)
41+
ent.Numa0 = prometheus.NewDesc("pind_vm_numa",
42+
"assigned numa for vm, -1 for not assigned",
43+
nil, labels0,
44+
)
45+
46+
return ent, nil
47+
}
48+
49+
func (x *Proc) SetProc(proc *mon_state.Proc) {
50+
x.Proc = proc
51+
}
52+
53+
func (x *Proc) Describe(ch chan<- *prometheus.Desc) {
54+
ch <- x.CPU
55+
ch <- x.Load
56+
ch <- x.Numa0
57+
}
58+
59+
func (x *Proc) Collect(ch chan<- prometheus.Metric) {
60+
m0 := prometheus.MustNewConstMetric(x.CPU, prometheus.GaugeValue, x.Proc.CPU)
61+
m1 := prometheus.MustNewConstMetric(x.Load, prometheus.GaugeValue, x.Proc.GetLoad0())
62+
m2 := prometheus.MustNewConstMetric(x.Numa0, prometheus.GaugeValue, float64(x.Proc.Numa0))
63+
64+
t0 := x.Proc.Time
65+
mt0 := prometheus.NewMetricWithTimestamp(t0, m0)
66+
mt1 := prometheus.NewMetricWithTimestamp(t0, m1)
67+
mt2 := prometheus.NewMetricWithTimestamp(t0, m2)
68+
69+
ch <- mt0
70+
ch <- mt1
71+
ch <- mt2
72+
}

pkg/monitoring/collector.go renamed to pkg/monitoring/collector/static.go

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,40 @@
1-
package monitoring
1+
package collector
22

33
import (
4+
"github.com/pnsafonov/pind/pkg/monitoring/mon_state"
45
"github.com/prometheus/client_golang/prometheus"
56
"strconv"
67
)
78

8-
type StaticCollector struct {
9-
PoolCollector *PoolCollector
9+
// Static - статический Collector, регистрируется при старте
10+
// далее для него не делается unregister
11+
type Static struct {
12+
PoolCollector *Pool
1013

11-
State *State
14+
State *mon_state.State
1215
}
1316

14-
type PoolCollector struct {
17+
type Pool struct {
1518
IdleLoad0 *prometheus.Desc
1619
IdleLoad1 *prometheus.Desc
1720
LoadFree0 *prometheus.Desc
1821
LoadFree1 *prometheus.Desc
1922
LoadUsed0 *prometheus.Desc
2023
LoadUsed1 *prometheus.Desc
2124

22-
Nodes []*PoolNodeCollector
25+
Nodes []*PoolNode
2326
}
2427

25-
type PoolNodeCollector struct {
28+
type PoolNode struct {
2629
Index int
2730
LoadFree0 *prometheus.Desc
2831
LoadFree1 *prometheus.Desc
2932
LoadUsed0 *prometheus.Desc
3033
LoadUsed1 *prometheus.Desc
3134
}
3235

33-
func NewPoolCollector(nodesCount int) *PoolCollector {
34-
ent := &PoolCollector{}
36+
func NewPool(nodesCount int) *Pool {
37+
ent := &Pool{}
3538

3639
ent.IdleLoad0 = prometheus.NewDesc("pind_pool_idle_load0",
3740
"idle cores load, like 400, 600, 800 %",
@@ -59,7 +62,7 @@ func NewPoolCollector(nodesCount int) *PoolCollector {
5962
)
6063

6164
for i := 0; i < nodesCount; i++ {
62-
node := &PoolNodeCollector{
65+
node := &PoolNode{
6366
Index: i,
6467
}
6568

@@ -90,17 +93,17 @@ func NewPoolCollector(nodesCount int) *PoolCollector {
9093
return ent
9194
}
9295

93-
func NewStaticCollector(nodesCount int) *StaticCollector {
94-
pool := NewPoolCollector(nodesCount)
96+
func NewStatic(nodesCount int) *Static {
97+
pool := NewPool(nodesCount)
9598

96-
ent := &StaticCollector{
99+
ent := &Static{
97100
PoolCollector: pool,
98101
}
99102

100103
return ent
101104
}
102105

103-
func (x *StaticCollector) Describe(ch chan<- *prometheus.Desc) {
106+
func (x *Static) Describe(ch chan<- *prometheus.Desc) {
104107
ch <- x.PoolCollector.IdleLoad0
105108
ch <- x.PoolCollector.IdleLoad1
106109
ch <- x.PoolCollector.LoadFree0
@@ -117,7 +120,7 @@ func (x *StaticCollector) Describe(ch chan<- *prometheus.Desc) {
117120

118121
}
119122

120-
func (x *StaticCollector) Collect(ch chan<- prometheus.Metric) {
123+
func (x *Static) Collect(ch chan<- prometheus.Metric) {
121124
m0 := prometheus.MustNewConstMetric(x.PoolCollector.IdleLoad0, prometheus.GaugeValue, x.State.Pool.IdleLoad0)
122125
m1 := prometheus.MustNewConstMetric(x.PoolCollector.IdleLoad1, prometheus.GaugeValue, x.State.Pool.IdleLoad1)
123126
m2 := prometheus.MustNewConstMetric(x.PoolCollector.LoadFree0, prometheus.GaugeValue, x.State.Pool.LoadFree0)

pkg/monitoring/state.go renamed to pkg/monitoring/mon_state/state.go

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
package monitoring
1+
package mon_state
22

33
import "time"
44

55
type State struct {
66
Time time.Time
77
Pool *Pool
8+
//Procs []*Proc
9+
Procs map[string]*Proc
810
}
911

1012
type Pool struct {
@@ -26,12 +28,28 @@ type PoolNode struct {
2628
LoadUsed1 float64
2729
}
2830

31+
type Proc struct {
32+
VmName string
33+
Time time.Time
34+
CPU float64
35+
Load bool
36+
Numa0 int
37+
}
38+
2939
func NewState() *State {
3040
now := time.Now()
3141
pool := &Pool{}
3242

3343
return &State{
34-
Time: now,
35-
Pool: pool,
44+
Time: now,
45+
Pool: pool,
46+
Procs: make(map[string]*Proc),
47+
}
48+
}
49+
50+
func (x *Proc) GetLoad0() float64 {
51+
if x.Load {
52+
return 1
3653
}
54+
return 0
3755
}

pkg/monitoring/monitoring.go

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package monitoring
22

33
import (
4+
"fmt"
45
"github.com/pnsafonov/pind/pkg/config"
6+
"github.com/pnsafonov/pind/pkg/monitoring/collector"
7+
"github.com/pnsafonov/pind/pkg/monitoring/mon_state"
58
"github.com/prometheus/client_golang/prometheus"
69
"github.com/prometheus/client_golang/prometheus/promhttp"
710
log "github.com/sirupsen/logrus"
@@ -14,15 +17,17 @@ type Monitoring struct {
1417
server *http.Server
1518
gatherer prometheus.Gatherer
1619
registerer prometheus.Registerer
17-
staticCollector *StaticCollector
20+
staticCollector *collector.Static
21+
procCollectors map[string]*collector.Proc
1822
}
1923

2024
func NewMonitoring(config *config.Monitoring, numaNodesCount int) *Monitoring {
21-
collector := NewStaticCollector(numaNodesCount)
25+
static0 := collector.NewStatic(numaNodesCount)
2226

2327
ent := &Monitoring{
2428
config: config,
25-
staticCollector: collector,
29+
staticCollector: static0,
30+
procCollectors: make(map[string]*collector.Proc),
2631
}
2732
return ent
2833
}
@@ -71,6 +76,46 @@ func (x *Monitoring) GoServe() error {
7176
return nil
7277
}
7378

74-
func (x *Monitoring) SetState(state *State) {
79+
func (x *Monitoring) SetState(state *mon_state.State) {
7580
x.staticCollector.State = state
81+
82+
// для процесса регистрируем метрику
83+
for _, proc := range state.Procs {
84+
_ = x.setProc(proc)
85+
}
86+
87+
// процесс завершился, убираем метрику
88+
for vmName, procCollector := range x.procCollectors {
89+
_, ok := state.Procs[vmName]
90+
if !ok {
91+
_ = x.registerer.Unregister(procCollector)
92+
delete(x.procCollectors, vmName)
93+
}
94+
}
95+
}
96+
97+
func (x *Monitoring) setProc(proc *mon_state.Proc) error {
98+
if proc.VmName == "" {
99+
return fmt.Errorf("proc.VmName is empty")
100+
}
101+
102+
var err error
103+
procCollector, ok := x.procCollectors[proc.VmName]
104+
if !ok {
105+
procCollector, err = collector.NewProc(proc)
106+
if err != nil {
107+
return err
108+
}
109+
110+
err = x.registerer.Register(procCollector)
111+
if err != nil {
112+
log.Errorf("setProc, prometheus.Register err: %v", err)
113+
return err
114+
}
115+
116+
x.procCollectors[proc.VmName] = procCollector
117+
}
118+
119+
procCollector.SetProc(proc)
120+
return nil
76121
}

pkg/pin.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,15 @@ func getThreadsCount0(threads map[int]*PinThread, selection ThreadSelection) int
261261
return count
262262
}
263263

264+
// GetNuma0 - returns assigned numa index.
265+
// If no numa assigned returns -1.
266+
func (x *PinProc) GetNuma0() int {
267+
if x.Node == nil {
268+
return -1
269+
}
270+
return x.Node.Index
271+
}
272+
264273
func (x *PinProc) ContainsThread(selection ThreadSelection) bool {
265274
procInfo := x
266275
for _, threadInfo := range procInfo.Threads {

0 commit comments

Comments
 (0)