diff --git a/collectors/metricCollector.go b/collectors/metricCollector.go new file mode 100644 index 0000000..91df630 --- /dev/null +++ b/collectors/metricCollector.go @@ -0,0 +1,119 @@ +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 +}