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() }