118 lines
2.5 KiB
Go
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)
|
|
}
|