ssh_crawler/stat/cpu.go
insanity 806f406ee0 ing
2017-10-24 16:09:17 +09:00

118 lines
2.5 KiB
Go

package stat
import (
"bufio"
"io"
"strings"
"git.loafle.net/overflow/ssh_crawler/util"
)
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 float64
}
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 float64
if len(parts) > 8 {
steal = util.StringToFloat64(parts[8])
}
if len(parts) > 9 {
guest = util.StringToFloat64(parts[9])
}
if len(parts) > 10 {
guestNice = util.StringToFloat64(parts[10])
}
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,
})
}
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 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)
}