Skip to content

Commit a7fcc7a

Browse files
committed
added allocation metrics
1 parent 6275298 commit a7fcc7a

File tree

3 files changed

+165
-134
lines changed

3 files changed

+165
-134
lines changed

metrics.go

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
package main
2+
3+
import (
4+
"time"
5+
6+
"github.com/go-kit/kit/log"
7+
"github.com/go-kit/kit/log/level"
8+
9+
"github.com/OpenNebula/one/src/oca/go/src/goca"
10+
11+
"github.com/prometheus/client_golang/prometheus"
12+
"github.com/prometheus/client_golang/prometheus/promauto"
13+
)
14+
15+
var (
16+
clusterMetrics = make(map[string]*prometheus.GaugeVec)
17+
hostMetrics = make(map[string]*prometheus.GaugeVec)
18+
)
19+
20+
func initMetrics() {
21+
clusterMetrics["TotalMem"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
22+
Name: "one_cluster_totalmem",
23+
Help: "total memory available in cluster",
24+
},[]string{"cluster"})
25+
26+
clusterMetrics["UsedMem"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
27+
Name: "one_cluster_usedmem",
28+
Help: "real used memory in cluster",
29+
},[]string{"cluster"})
30+
31+
clusterMetrics["MemUsage"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
32+
Name: "one_cluster_memusage",
33+
Help: "total allocated memory in cluster",
34+
},[]string{"cluster"})
35+
36+
clusterMetrics["TotalCPU"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
37+
Name: "one_cluster_totalcpu",
38+
Help: "total cpu available in cluster",
39+
},[]string{"cluster"})
40+
41+
clusterMetrics["UsedCPU"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
42+
Name: "one_cluster_usedcpu",
43+
Help: "real used cpu in cluster",
44+
},[]string{"cluster"})
45+
46+
clusterMetrics["CPUUsage"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
47+
Name: "one_cluster_cpuusage",
48+
Help: "total allocated cpu in cluster",
49+
},[]string{"cluster"})
50+
51+
clusterMetrics["RunningVMs"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
52+
Name: "one_cluster_runningvms",
53+
Help: "running virtual machines in cluster",
54+
},[]string{"cluster"})
55+
56+
clusterMetrics["ActiveHosts"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
57+
Name: "one_cluster_activehosts",
58+
Help: "succesfully monitored hosts in cluster",
59+
},[]string{"cluster"})
60+
61+
hostMetrics["TotalMem"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
62+
Name: "one_host_totalmem",
63+
Help: "total memory available on host",
64+
},[]string{"cluster", "host"})
65+
66+
hostMetrics["UsedMem"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
67+
Name: "one_host_usedmem",
68+
Help: "real used memory on host",
69+
},[]string{"cluster", "host"})
70+
71+
hostMetrics["MemUsage"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
72+
Name: "one_host_memusage",
73+
Help: "total allocated memory on host",
74+
},[]string{"cluster", "host"})
75+
76+
hostMetrics["TotalCPU"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
77+
Name: "one_host_totalcpu",
78+
Help: "total cpu available on host",
79+
},[]string{"cluster", "host"})
80+
81+
hostMetrics["UsedCPU"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
82+
Name: "one_host_usedcpu",
83+
Help: "real used cpu on host",
84+
},[]string{"cluster", "host"})
85+
86+
hostMetrics["CPUUsage"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
87+
Name: "one_host_cpuusage",
88+
Help: "total allocated cpu on host",
89+
},[]string{"cluster", "host"})
90+
91+
hostMetrics["RunningVMs"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
92+
Name: "one_host_runningvms",
93+
Help: "running virtual machines on host",
94+
},[]string{"cluster", "host"})
95+
}
96+
97+
// recordMetrics from OpenNebula
98+
func recordMetrics(config config, logger log.Logger) {
99+
100+
level.Info(logger).Log("msg", "recording metrics from opennebula frontend", "interval", config.interval)
101+
102+
client := goca.NewDefaultClient(goca.NewConfig(config.user, config.password, config.endpoint))
103+
controller := goca.NewController(client)
104+
105+
for {
106+
107+
pool, err := controller.Hosts().Info()
108+
if err != nil {
109+
level.Error(logger).Log("msg", "error retrieving hosts info", "error", err)
110+
return
111+
}
112+
113+
type metrics struct {
114+
cluster, metric string
115+
}
116+
sum := make(map[metrics]int)
117+
118+
for _, host := range pool.Hosts {
119+
120+
level.Debug(logger).Log("msg", "host metrics",
121+
"host", host.Name,
122+
"TotalMem", host.Share.TotalMem,
123+
"UsedMem", host.Share.UsedMem,
124+
"TotalCPU", host.Share.TotalCPU,
125+
"UsedCPU", host.Share.UsedCPU,
126+
"RunningVMs", host.Share.RunningVMs)
127+
128+
// record host metrics
129+
hostMetrics["TotalMem"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.TotalMem))
130+
hostMetrics["UsedMem"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.UsedMem))
131+
hostMetrics["MemUsage"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.MemUsage))
132+
hostMetrics["TotalCPU"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.TotalCPU))
133+
hostMetrics["UsedCPU"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.UsedCPU))
134+
hostMetrics["CPUUsage"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.CPUUsage))
135+
hostMetrics["RunningVMs"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.RunningVMs))
136+
137+
// sum cluster metrics
138+
sum[metrics{host.Cluster, "TotalMem"}] = sum[metrics{host.Cluster, "TotalMem"}] + host.Share.TotalMem
139+
sum[metrics{host.Cluster, "UsedMem"}] = sum[metrics{host.Cluster, "UsedMem"}] + host.Share.UsedMem
140+
sum[metrics{host.Cluster, "MemUsage"}] = sum[metrics{host.Cluster, "MemUsage"}] + host.Share.MemUsage
141+
sum[metrics{host.Cluster, "TotalCPU"}] = sum[metrics{host.Cluster, "TotalCPU"}] + host.Share.TotalCPU
142+
sum[metrics{host.Cluster, "UsedCPU"}] = sum[metrics{host.Cluster, "UsedCPU"}] + host.Share.UsedCPU
143+
sum[metrics{host.Cluster, "CPUUsage"}] = sum[metrics{host.Cluster, "CPUUsage"}] + host.Share.CPUUsage
144+
sum[metrics{host.Cluster, "RunningVMs"}] = sum[metrics{host.Cluster, "RunningVMs"}] + host.Share.RunningVMs
145+
146+
if host.StateRaw == 2 {
147+
sum[metrics{host.Cluster, "ActiveHosts"}] = sum[metrics{host.Cluster, "ActiveHosts"}] + 1
148+
}
149+
}
150+
151+
for key, value := range sum {
152+
// record cluster metrics
153+
clusterMetrics[key.metric].With(prometheus.Labels{"cluster": key.cluster}).Set(float64(value))
154+
}
155+
156+
time.Sleep(time.Duration(config.interval) * time.Second)
157+
}
158+
}

one_exporter.go

Lines changed: 4 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,11 @@ import (
77
"path"
88
"strconv"
99
"strings"
10-
"time"
1110

1211
"github.com/go-kit/kit/log"
1312
"github.com/go-kit/kit/log/level"
14-
15-
"github.com/OpenNebula/one/src/oca/go/src/goca"
16-
17-
"github.com/prometheus/client_golang/prometheus"
18-
"github.com/prometheus/client_golang/prometheus/promauto"
1913
"github.com/prometheus/client_golang/prometheus/promhttp"
20-
2114
"github.com/spf13/viper"
22-
2315
"gopkg.in/alecthomas/kingpin.v2"
2416
)
2517

@@ -33,128 +25,6 @@ type config struct {
3325
path string
3426
}
3527

36-
var (
37-
clusterMetrics = make(map[string]*prometheus.GaugeVec)
38-
hostMetrics = make(map[string]*prometheus.GaugeVec)
39-
)
40-
41-
func initCollectors() {
42-
clusterMetrics["TotalMem"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
43-
Name: "one_cluster_totalmem",
44-
Help: "total memory available in cluster",
45-
},[]string{"cluster"})
46-
47-
clusterMetrics["UsedMem"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
48-
Name: "one_cluster_usedmem",
49-
Help: "real used memory in cluster",
50-
},[]string{"cluster"})
51-
52-
clusterMetrics["TotalCPU"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
53-
Name: "one_cluster_totalcpu",
54-
Help: "total cpu available in cluster",
55-
},[]string{"cluster"})
56-
57-
clusterMetrics["UsedCPU"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
58-
Name: "one_cluster_usedcpu",
59-
Help: "real used cpu in cluster",
60-
},[]string{"cluster"})
61-
62-
clusterMetrics["RunningVMs"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
63-
Name: "one_cluster_runningvms",
64-
Help: "running virtual machines in cluster",
65-
},[]string{"cluster"})
66-
67-
clusterMetrics["ActiveHosts"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
68-
Name: "one_cluster_activehosts",
69-
Help: "succesfully monitored hosts in cluster",
70-
},[]string{"cluster"})
71-
72-
hostMetrics["TotalMem"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
73-
Name: "one_host_totalmem",
74-
Help: "total memory available on host",
75-
},[]string{"cluster", "host"})
76-
77-
hostMetrics["UsedMem"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
78-
Name: "one_host_usedmem",
79-
Help: "real used memory on host",
80-
},[]string{"cluster", "host"})
81-
82-
hostMetrics["TotalCPU"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
83-
Name: "one_host_totalcpu",
84-
Help: "total cpu available on host",
85-
},[]string{"cluster", "host"})
86-
87-
hostMetrics["UsedCPU"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
88-
Name: "one_host_usedcpu",
89-
Help: "real used cpu on host",
90-
},[]string{"cluster", "host"})
91-
92-
hostMetrics["RunningVMs"] = promauto.NewGaugeVec(prometheus.GaugeOpts{
93-
Name: "one_host_runningvms",
94-
Help: "running virtual machines on host",
95-
},[]string{"cluster", "host"})
96-
97-
}
98-
99-
// recordMetrics from OpenNebula
100-
func recordMetrics(config config, logger log.Logger) {
101-
102-
level.Info(logger).Log("msg", "recording metrics from opennebula frontend", "interval", config.interval)
103-
104-
client := goca.NewDefaultClient(goca.NewConfig(config.user, config.password, config.endpoint))
105-
controller := goca.NewController(client)
106-
107-
for {
108-
109-
pool, err := controller.Hosts().Info()
110-
if err != nil {
111-
level.Error(logger).Log("msg", "error retrieving hosts info", "error", err)
112-
return
113-
}
114-
115-
type metrics struct {
116-
cluster, metric string
117-
}
118-
sum := make(map[metrics]int)
119-
120-
for _, host := range pool.Hosts {
121-
122-
level.Debug(logger).Log("msg", "host metrics",
123-
"host", host.Name,
124-
"TotalMem", host.Share.TotalMem,
125-
"UsedMem", host.Share.UsedMem,
126-
"TotalCPU", host.Share.TotalCPU,
127-
"UsedCPU", host.Share.UsedCPU,
128-
"RunningVMs", host.Share.RunningVMs)
129-
130-
// record host metrics
131-
hostMetrics["TotalMem"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.TotalMem))
132-
hostMetrics["UsedMem"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.UsedMem))
133-
hostMetrics["TotalCPU"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.TotalCPU))
134-
hostMetrics["UsedMem"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.UsedMem))
135-
hostMetrics["RunningVMs"].With(prometheus.Labels{"cluster": host.Cluster, "host": host.Name}).Set(float64(host.Share.RunningVMs))
136-
137-
// sum cluster metrics
138-
sum[metrics{host.Cluster, "TotalMem"}] = sum[metrics{host.Cluster, "TotalMem"}] + host.Share.TotalMem
139-
sum[metrics{host.Cluster, "UsedMem"}] = sum[metrics{host.Cluster, "UsedMem"}] + host.Share.UsedMem
140-
sum[metrics{host.Cluster, "TotalCPU"}] = sum[metrics{host.Cluster, "TotalCPU"}] + host.Share.TotalCPU
141-
sum[metrics{host.Cluster, "UsedCPU"}] = sum[metrics{host.Cluster, "UsedCPU"}] + host.Share.UsedCPU
142-
sum[metrics{host.Cluster, "RunningVMs"}] = sum[metrics{host.Cluster, "RunningVMs"}] + host.Share.RunningVMs
143-
144-
if host.StateRaw == 2 {
145-
sum[metrics{host.Cluster, "ActiveHosts"}] = sum[metrics{host.Cluster, "ActiveHosts"}] + 1
146-
}
147-
}
148-
149-
for key, value := range sum {
150-
// record cluster metrics
151-
clusterMetrics[key.metric].With(prometheus.Labels{"cluster": key.cluster}).Set(float64(value))
152-
}
153-
154-
time.Sleep(time.Duration(config.interval) * time.Second)
155-
}
156-
}
157-
15828
func newConfig(fileName string, logger log.Logger) (config, error) {
15929

16030
viper.SetDefault("endpoint", "") // "" will be set to "http://localhost:2633/RPC2" by goca
@@ -207,8 +77,10 @@ func main() {
20777
logger := log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr))
20878
logger = log.With(logger, "ts", log.DefaultTimestampUTC, "caller", log.DefaultCaller)
20979

210-
cfgFile := kingpin.Flag("config", "config file for one_exporter").Short('c').String()
80+
cfgFile := kingpin.Flag("config", "config file for one_exporter").Short('c').String()
21181
logLevel := kingpin.Flag("loglevel", "the log level to output. options are error, info or debug. defaults to info").Short('l').Default("info").String()
82+
83+
kingpin.Version(Version)
21284
kingpin.Parse()
21385

21486
logger = level.NewFilter(logger, allowedLevel(*logLevel))
@@ -222,8 +94,7 @@ func main() {
22294

22395
level.Debug(logger).Log("msg", "loaded config", "user", config.user, "endpoint", config.endpoint)
22496

225-
initCollectors()
226-
97+
initMetrics()
22798
go recordMetrics(config, logger)
22899

229100
level.Info(logger).Log("msg", "starting exporter", "host", config.host, "port", config.port, "path", config.path)
@@ -233,5 +104,4 @@ func main() {
233104
if err != nil {
234105
level.Error(logger).Log("error", err)
235106
}
236-
237107
}

version.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package main
2+
3+
var Version string = "v0.1.2"

0 commit comments

Comments
 (0)