cc-metric-collector/collectors/metricCollector.go

120 lines
2.6 KiB
Go
Raw Normal View History

2021-03-25 14:46:21 +01:00
package collectors
import (
"time"
"io/ioutil"
"strings"
"log"
"strconv"
)
type MetricGetter interface {
Name() string
Init()
Read(time.Duration)
Close()
GetNodeMetric() map[string]interface{}
GetSocketMetrics() map[int]map[string]interface{}
GetCpuMetrics() map[int]map[string]interface{}
}
type MetricCollector struct {
name string
node map[string]interface{}
sockets map[int]map[string]interface{}
cpus map[int]map[string]interface{}
}
func (c *MetricCollector) Name() string {
return c.name
}
func (c *MetricCollector) GetNodeMetric() map[string]interface{} {
return c.node
}
func (c *MetricCollector) GetSocketMetrics() map[int]map[string]interface{} {
return c.sockets
}
func (c *MetricCollector) GetCpuMetrics() map[int]map[string]interface{} {
return c.cpus
}
func (c *MetricCollector) setup() error {
slist := SocketList()
clist := CpuList()
c.node = make(map[string]interface{})
c.sockets = make(map[int]map[string]interface{}, len(slist))
for _, s := range slist {
c.sockets[s] = make(map[string]interface{})
}
c.cpus = make(map[int]map[string]interface{}, len(clist))
for _, s := range clist {
c.cpus[s] = make(map[string]interface{})
}
return nil
}
func intArrayContains(array []int, str int) (int, bool) {
for i, a := range array {
if a == str {
return i, true
}
}
return -1, false
}
func SocketList() []int {
buffer, err := ioutil.ReadFile("/proc/cpuinfo")
if err != nil {
log.Print(err)
return nil
}
ll := strings.Split(string(buffer), "\n")
var packs []int
for _, line := range ll {
if strings.HasPrefix(line, "physical id") {
lv := strings.Fields(line)
id, err := strconv.ParseInt(lv[3], 10, 32)
if err != nil {
log.Print(err)
return packs
}
_, found := intArrayContains(packs, int(id))
if !found {
packs = append(packs, int(id))
}
}
}
return packs
}
func CpuList() []int {
buffer, err := ioutil.ReadFile("/proc/cpuinfo")
if err != nil {
log.Print(err)
return nil
}
ll := strings.Split(string(buffer), "\n")
var cpulist []int
for _, line := range ll {
if strings.HasPrefix(line, "processor") {
lv := strings.Fields(line)
id, err := strconv.ParseInt(lv[2], 10, 32)
if err != nil {
log.Print(err)
return cpulist
}
_, found := intArrayContains(cpulist, int(id))
if !found {
cpulist = append(cpulist, int(id))
}
}
}
return cpulist
}