[disk][linux] support new stats available with 4.18 and 5.5 kernels

https://www.kernel.org/doc/Documentation/ABI/testing/procfs-diskstats
pull/1269/head
Ville Skyttä 3 years ago
parent 03f9f55571
commit 12c4bb1f52

@ -30,20 +30,26 @@ type PartitionStat struct {
} }
type IOCountersStat struct { type IOCountersStat struct {
ReadCount uint64 `json:"readCount"` ReadCount uint64 `json:"readCount"`
MergedReadCount uint64 `json:"mergedReadCount"` MergedReadCount uint64 `json:"mergedReadCount"`
WriteCount uint64 `json:"writeCount"` WriteCount uint64 `json:"writeCount"`
MergedWriteCount uint64 `json:"mergedWriteCount"` MergedWriteCount uint64 `json:"mergedWriteCount"`
ReadBytes uint64 `json:"readBytes"` ReadBytes uint64 `json:"readBytes"`
WriteBytes uint64 `json:"writeBytes"` WriteBytes uint64 `json:"writeBytes"`
ReadTime uint64 `json:"readTime"` ReadTime uint64 `json:"readTime"`
WriteTime uint64 `json:"writeTime"` WriteTime uint64 `json:"writeTime"`
IopsInProgress uint64 `json:"iopsInProgress"` IopsInProgress uint64 `json:"iopsInProgress"`
IoTime uint64 `json:"ioTime"` IoTime uint64 `json:"ioTime"`
WeightedIO uint64 `json:"weightedIO"` WeightedIO uint64 `json:"weightedIO"`
Name string `json:"name"` DiscardCount uint64 `json:"discardCount"`
SerialNumber string `json:"serialNumber"` MergedDiscardCount uint64 `json:"mergedDiscardCount"`
Label string `json:"label"` SectorsDiscardedCount uint64 `json:"sectorsDiscardedCount"`
DiscardTime uint64 `json:"discardTime"`
FlushCount uint64 `json:"flushCount"`
FlushTime uint64 `json:"flushTime"`
Name string `json:"name"`
SerialNumber string `json:"serialNumber"`
Label string `json:"label"`
} }
func (d UsageStat) String() string { func (d UsageStat) String() string {

@ -417,18 +417,55 @@ func IOCountersWithContext(ctx context.Context, names ...string) (map[string]IOC
if err != nil { if err != nil {
return ret, err return ret, err
} }
var discardCount, mergedDiscardCount, sectorsDiscardedCount, discardTime, flushCount, flushTime uint64
if len(fields) >= 18 {
// kernel 4.18+
discardCount, err = strconv.ParseUint((fields[14]), 10, 64)
if err != nil {
return ret, err
}
mergedDiscardCount, err = strconv.ParseUint((fields[15]), 10, 64)
if err != nil {
return ret, err
}
sectorsDiscardedCount, err = strconv.ParseUint((fields[16]), 10, 64)
if err != nil {
return ret, err
}
discardTime, err = strconv.ParseUint((fields[17]), 10, 64)
if err != nil {
return ret, err
}
if len(fields) >= 20 {
// kernel 5.5+
flushCount, err = strconv.ParseUint((fields[18]), 10, 64)
if err != nil {
return ret, err
}
flushTime, err = strconv.ParseUint((fields[19]), 10, 64)
if err != nil {
return ret, err
}
}
}
d := IOCountersStat{ d := IOCountersStat{
ReadBytes: rbytes * sectorSize, ReadBytes: rbytes * sectorSize,
WriteBytes: wbytes * sectorSize, WriteBytes: wbytes * sectorSize,
ReadCount: reads, ReadCount: reads,
WriteCount: writes, WriteCount: writes,
MergedReadCount: mergedReads, MergedReadCount: mergedReads,
MergedWriteCount: mergedWrites, MergedWriteCount: mergedWrites,
ReadTime: rtime, ReadTime: rtime,
WriteTime: wtime, WriteTime: wtime,
IopsInProgress: iopsInProgress, IopsInProgress: iopsInProgress,
IoTime: iotime, IoTime: iotime,
WeightedIO: weightedIO, WeightedIO: weightedIO,
DiscardCount: discardCount,
MergedDiscardCount: mergedDiscardCount,
SectorsDiscardedCount: sectorsDiscardedCount,
DiscardTime: discardTime,
FlushCount: flushCount,
FlushTime: flushTime,
} }
if d == empty { if d == empty {
continue continue

@ -125,7 +125,7 @@ func TestDiskIOCountersStat_String(t *testing.T) {
WriteBytes: 400, WriteBytes: 400,
SerialNumber: "SERIAL", SerialNumber: "SERIAL",
} }
e := `{"readCount":100,"mergedReadCount":0,"writeCount":200,"mergedWriteCount":0,"readBytes":300,"writeBytes":400,"readTime":0,"writeTime":0,"iopsInProgress":0,"ioTime":0,"weightedIO":0,"name":"sd01","serialNumber":"SERIAL","label":""}` e := `{"readCount":100,"mergedReadCount":0,"writeCount":200,"mergedWriteCount":0,"readBytes":300,"writeBytes":400,"readTime":0,"writeTime":0,"iopsInProgress":0,"ioTime":0,"weightedIO":0,"discardCount":0,"mergedDiscardCount":0,"sectorsDiscardedCount":0,"discardTime":0,"flushCount":0,"flushTime":0,"name":"sd01","serialNumber":"SERIAL","label":""}`
if e != fmt.Sprintf("%v", v) { if e != fmt.Sprintf("%v", v) {
t.Errorf("DiskUsageStat string is invalid: %v", v) t.Errorf("DiskUsageStat string is invalid: %v", v)
} }

Loading…
Cancel
Save