ssh_crawler/stat/disk_io.go
insanity 3ef6659f46 ing
2017-10-23 18:08:19 +09:00

63 lines
1.2 KiB
Go

package stat
import (
"bufio"
"fmt"
"io"
"strings"
)
type DiskIOStat struct {
device,
readCompleted,
readMerged,
sectorRead,
timeSpentReading,
writesCompleted,
writesMerged,
sectorsWritten,
timeSpentWriting,
ioInProg,
timeSpentIO,
weightedTimeSpentIO string
}
func (diskio DiskIOStat) Command() string {
return "cat /proc/diskstats"
}
func (diskio DiskIOStat) Parse(r io.Reader) (*[]DiskIOStat, error) {
var (
stats = []DiskIOStat{}
scanner = bufio.NewScanner(r)
)
for scanner.Scan() {
parts := strings.Fields(scanner.Text())
if len(parts) < 4 {
return nil, fmt.Errorf("invalid line in %s: %s", "/proc/diskstats", scanner.Text())
}
deviceName := parts[2]
if !strings.HasPrefix(deviceName, "sd") {
continue
}
stats = append(stats, DiskIOStat{
device: deviceName,
readCompleted: parts[3],
readMerged: parts[4],
sectorRead: parts[5],
timeSpentReading: parts[6],
writesCompleted: parts[7],
writesMerged: parts[8],
sectorsWritten: parts[9],
timeSpentWriting: parts[10],
ioInProg: parts[11],
timeSpentIO: parts[12],
weightedTimeSpentIO: parts[13],
})
}
return &stats, scanner.Err()
}