package stat import ( "bufio" "io" "strings" "git.loafle.net/overflow/ssh_crawler/util" "strconv" ) type CPUStat struct { Device, User, Nice, System, Idle, Iowait, Irq, SoftIrq, Steal, // (over 2.6.11) Guest, // (over 2.6.24) GuestNice, //(over 2.6.33) Sum int64 } func (cpu CPUStat) Command() string { return "cat /proc/stat" } func (cpu CPUStat) Read(r io.Reader, keys []string) (*map[string]string, error) { var ( stats = []CPUStat{} scanner = bufio.NewScanner(r) ) for scanner.Scan() { line := scanner.Text() parts := strings.Fields(line) if !strings.HasPrefix(parts[0], "cpu") { continue } var steal, guest, guestNice int64 if len(parts) > 8 { steal = util.StringToInt64(parts[8]) } if len(parts) > 9 { guest = util.StringToInt64(parts[9]) } if len(parts) > 10 { guestNice = util.StringToInt64(parts[10]) } stats = append(stats, CPUStat{ Device: util.StringToInt64(parts[0]), User: util.StringToInt64(parts[1]), Nice: util.StringToInt64(parts[2]), System: util.StringToInt64(parts[3]), Idle: util.StringToInt64(parts[4]), Iowait: util.StringToInt64(parts[5]), Irq: util.StringToInt64(parts[6]), SoftIrq: util.StringToInt64(parts[7]), Steal: steal, Guest: guest, GuestNice: guestNice, }) } res, err := cpu.parse(keys, stats) if err != nil { return nil, err } return &res, scanner.Err() } func (cpu CPUStat) parse(keys []string, data []CPUStat) (map[string]string, error) { resMap := make(map[string]string) for _, key := range keys { resMap[key] = cpu.calc(key, data[0]) } return resMap, nil } func (cpu CPUStat) calc(key string, d CPUStat) string { var value int64 = 0 sum := d.User + d.Nice + d.System + d.Idle + d.Iowait + d.Irq + d.SoftIrq + d.Steal + d.Guest + d.GuestNice switch key { case "cpu.usage.sum": value = sum case "cpu.usage.user": value = d.User case "cpu.usage.nice": value = d.Nice case "cpu.usage.system": value = d.System case "cpu.usage.idle": value = d.Idle case "cpu.usage.iowait": value = d.Iowait case "cpu.usage.irq": value = d.Irq case "cpu.usage.softirq": value = d.SoftIrq case "cpu.usage.steal": value = d.Steal case "cpu.usage.guest": value = d.Guest case "cpu.usage.gnice": value = d.GuestNice default: } return strconv.FormatInt(value, 10) }