ssh_crawler/stat/cpu.go

118 lines
2.5 KiB
Go
Raw Normal View History

2017-10-20 06:10:30 +00:00
package stat
import (
"bufio"
2017-10-23 09:08:19 +00:00
"io"
2017-10-20 06:10:30 +00:00
"strings"
2017-10-24 07:09:17 +00:00
"git.loafle.net/overflow/ssh_crawler/util"
2017-10-20 06:10:30 +00:00
)
type CPUStat struct {
2017-10-24 07:09:17 +00:00
Device,
User,
Nice,
System,
Idle,
Iowait,
Irq,
SoftIrq,
Steal, // (over 2.6.11)
Guest, // (over 2.6.24)
GuestNice, //(over 2.6.33)
Sum float64
2017-10-20 06:10:30 +00:00
}
func (cpu CPUStat) Command() string {
return "cat /proc/stat"
}
2017-10-24 07:09:17 +00:00
func (cpu CPUStat) Read(r io.Reader, keys []string) (*map[string]string, error) {
2017-10-20 06:10:30 +00:00
var (
2017-10-24 07:09:17 +00:00
stats = []CPUStat{}
2017-10-20 06:10:30 +00:00
scanner = bufio.NewScanner(r)
)
for scanner.Scan() {
line := scanner.Text()
parts := strings.Fields(line)
if !strings.HasPrefix(parts[0], "cpu") {
continue
}
2017-10-24 07:09:17 +00:00
var steal, guest, guestNice float64
2017-10-20 06:10:30 +00:00
if len(parts) > 8 {
2017-10-24 07:09:17 +00:00
steal = util.StringToFloat64(parts[8])
2017-10-20 06:10:30 +00:00
}
if len(parts) > 9 {
2017-10-24 07:09:17 +00:00
guest = util.StringToFloat64(parts[9])
2017-10-20 06:10:30 +00:00
}
if len(parts) > 10 {
2017-10-24 07:09:17 +00:00
guestNice = util.StringToFloat64(parts[10])
2017-10-20 06:10:30 +00:00
}
2017-10-24 07:09:17 +00:00
stats = append(stats, CPUStat{
Device: util.StringToFloat64(parts[0]),
User: util.StringToFloat64(parts[1]),
Nice: util.StringToFloat64(parts[2]),
System: util.StringToFloat64(parts[3]),
Idle: util.StringToFloat64(parts[4]),
Iowait: util.StringToFloat64(parts[5]),
Irq: util.StringToFloat64(parts[6]),
SoftIrq: util.StringToFloat64(parts[7]),
Steal: steal,
Guest: guest,
GuestNice: guestNice,
2017-10-20 06:10:30 +00:00
})
}
2017-10-24 09:23:56 +00:00
res, err := cpu.parse(keys, stats)
2017-10-24 07:09:17 +00:00
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 float64 = 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 / sum * 100
case "cpu.usage.nice":
value = d.Nice / sum * 100
case "cpu.usage.system":
value = d.System / sum * 100
case "cpu.usage.idle":
value = d.Idle / sum * 100
case "cpu.usage.iowait":
value = d.Iowait / sum * 100
case "cpu.usage.irq":
value = d.Irq / sum * 100
case "cpu.usage.softirq":
value = d.SoftIrq / sum * 100
case "cpu.usage.steal":
value = d.Steal / sum * 100
case "cpu.usage.guest":
value = d.Guest / sum * 100
case "cpu.usage.gnice":
value = d.GuestNice / sum * 100
default:
}
return util.Float64ToString(value)
2017-10-20 06:10:30 +00:00
}