-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathmetrics.go
158 lines (125 loc) · 7.61 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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
package main
import (
"time"
"github.com/go-kit/kit/log"
"github.com/go-kit/kit/log/level"
"github.com/OpenNebula/one/src/oca/go/src/goca"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
)
var (
clusterMetrics = make(map[string]*prometheus.GaugeVec)
hostMetrics = make(map[string]*prometheus.GaugeVec)
)
func initMetrics() {
clusterMetrics["TotalMem"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "one_cluster_totalmem",
Help: "total memory available in cluster",
},[]string{"cluster"})
clusterMetrics["UsedMem"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "one_cluster_usedmem",
Help: "real used memory in cluster",
},[]string{"cluster"})
clusterMetrics["MemUsage"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "one_cluster_memusage",
Help: "total allocated memory in cluster",
},[]string{"cluster"})
clusterMetrics["TotalCPU"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "one_cluster_totalcpu",
Help: "total cpu available in cluster",
},[]string{"cluster"})
clusterMetrics["UsedCPU"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "one_cluster_usedcpu",
Help: "real used cpu in cluster",
},[]string{"cluster"})
clusterMetrics["CPUUsage"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "one_cluster_cpuusage",
Help: "total allocated cpu in cluster",
},[]string{"cluster"})
clusterMetrics["RunningVMs"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "one_cluster_runningvms",
Help: "running virtual machines in cluster",
},[]string{"cluster"})
clusterMetrics["ActiveHosts"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "one_cluster_activehosts",
Help: "succesfully monitored hosts in cluster",
},[]string{"cluster"})
hostMetrics["TotalMem"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "one_host_totalmem",
Help: "total memory available on host",
},[]string{"cluster", "host"})
hostMetrics["UsedMem"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "one_host_usedmem",
Help: "real used memory on host",
},[]string{"cluster", "host"})
hostMetrics["MemUsage"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "one_host_memusage",
Help: "total allocated memory on host",
},[]string{"cluster", "host"})
hostMetrics["TotalCPU"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "one_host_totalcpu",
Help: "total cpu available on host",
},[]string{"cluster", "host"})
hostMetrics["UsedCPU"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "one_host_usedcpu",
Help: "real used cpu on host",
},[]string{"cluster", "host"})
hostMetrics["CPUUsage"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "one_host_cpuusage",
Help: "total allocated cpu on host",
},[]string{"cluster", "host"})
hostMetrics["RunningVMs"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "one_host_runningvms",
Help: "running virtual machines on host",
},[]string{"cluster", "host"})
}
// recordMetrics from OpenNebula
func recordMetrics(config config, logger log.Logger) {
level.Info(logger).Log("msg", "recording metrics from opennebula frontend", "interval", config.interval)
client := goca.NewDefaultClient(goca.NewConfig(config.user, config.password, config.endpoint))
controller := goca.NewController(client)
for {
pool, err := controller.Hosts().Info()
if err != nil {
level.Error(logger).Log("msg", "error retrieving hosts info", "error", err)
return
}
type metrics struct {
cluster, metric string
}
sum := make(map[metrics]int)
for _, host := range pool.Hosts {
level.Debug(logger).Log("msg", "host metrics",
"host", host.Name,
"TotalMem", host.Share.TotalMem,
"UsedMem", host.Share.UsedMem,
"TotalCPU", host.Share.TotalCPU,
"UsedCPU", host.Share.UsedCPU,
"RunningVMs", host.Share.RunningVMs)
// record host metrics
hostMetrics["TotalMem"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.TotalMem))
hostMetrics["UsedMem"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.UsedMem))
hostMetrics["MemUsage"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.MemUsage))
hostMetrics["TotalCPU"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.TotalCPU))
hostMetrics["UsedCPU"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.UsedCPU))
hostMetrics["CPUUsage"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.CPUUsage))
hostMetrics["RunningVMs"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.RunningVMs))
// sum cluster metrics
sum[metrics{host.Cluster, "TotalMem"}] = sum[metrics{host.Cluster, "TotalMem"}] + host.Share.TotalMem
sum[metrics{host.Cluster, "UsedMem"}] = sum[metrics{host.Cluster, "UsedMem"}] + host.Share.UsedMem
sum[metrics{host.Cluster, "MemUsage"}] = sum[metrics{host.Cluster, "MemUsage"}] + host.Share.MemUsage
sum[metrics{host.Cluster, "TotalCPU"}] = sum[metrics{host.Cluster, "TotalCPU"}] + host.Share.TotalCPU
sum[metrics{host.Cluster, "UsedCPU"}] = sum[metrics{host.Cluster, "UsedCPU"}] + host.Share.UsedCPU
sum[metrics{host.Cluster, "CPUUsage"}] = sum[metrics{host.Cluster, "CPUUsage"}] + host.Share.CPUUsage
sum[metrics{host.Cluster, "RunningVMs"}] = sum[metrics{host.Cluster, "RunningVMs"}] + host.Share.RunningVMs
if host.StateRaw == 2 {
sum[metrics{host.Cluster, "ActiveHosts"}] = sum[metrics{host.Cluster, "ActiveHosts"}] + 1
}
}
for key, value := range sum {
// record cluster metrics
clusterMetrics[key.metric].With(prometheus.Labels{"cluster": key.cluster}).Set(float64(value))
}
time.Sleep(time.Duration(config.interval) * time.Second)
}
}