@@ -44,7 +44,9 @@ import (
44
44
// 12 I/Os currently in progress
45
45
// 13 time spent doing I/Os (ms)
46
46
// 14 weighted time spent doing I/Os (ms)
47
- func parseDiskStats (contents []byte , disks []* monitoredDisk , measuredAt time.Time ) error {
47
+ func parseDiskStats (
48
+ contents []byte , disks []* monitoredDisk , measuredAt time.Time ,
49
+ ) (countCollected int , err error ) {
48
50
for lineNum := 0 ; len (contents ) > 0 ; lineNum ++ {
49
51
lineBytes , rest := splitLine (contents )
50
52
line := unsafe .String (& lineBytes [0 ], len (lineBytes ))
@@ -54,13 +56,13 @@ func parseDiskStats(contents []byte, disks []*monitoredDisk, measuredAt time.Tim
54
56
55
57
var deviceID DeviceID
56
58
if devMajor , rest , err := mustParseUint (line , 32 , "deviceID.major" ); err != nil {
57
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
59
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
58
60
} else {
59
61
line = rest
60
62
deviceID .major = uint32 (devMajor )
61
63
}
62
64
if devMinor , rest , err := mustParseUint (line , 32 , "deviceID.minor" ); err != nil {
63
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
65
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
64
66
} else {
65
67
line = rest
66
68
deviceID .minor = uint32 (devMinor )
@@ -78,78 +80,79 @@ func parseDiskStats(contents []byte, disks []*monitoredDisk, measuredAt time.Tim
78
80
var err error
79
81
stats .DeviceName , line = splitFieldDelim (line )
80
82
if stats .ReadsCount , line , err = mustParseUint (line , 64 , "reads count" ); err != nil {
81
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
83
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
82
84
}
83
85
if stats .ReadsMerged , line , err = mustParseUint (line , 64 , "reads merged" ); err != nil {
84
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
86
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
85
87
}
86
88
if stats .ReadsSectors , line , err = mustParseUint (line , 64 , "reads sectors" ); err != nil {
87
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
89
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
88
90
}
89
91
if millis , rest , err := mustParseUint (line , 64 , "reads duration" ); err != nil {
90
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
92
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
91
93
} else {
92
94
line = rest
93
95
stats .ReadsDuration = time .Duration (millis ) * time .Millisecond
94
96
}
95
97
if stats .WritesCount , line , err = mustParseUint (line , 64 , "writes count" ); err != nil {
96
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
98
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
97
99
}
98
100
if stats .WritesMerged , line , err = mustParseUint (line , 64 , "writes merged" ); err != nil {
99
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
101
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
100
102
}
101
103
if stats .WritesSectors , line , err = mustParseUint (line , 64 , "writes sectors" ); err != nil {
102
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
104
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
103
105
}
104
106
if millis , rest , err := mustParseUint (line , 64 , "writes duration" ); err != nil {
105
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
107
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
106
108
} else {
107
109
line = rest
108
110
stats .WritesDuration = time .Duration (millis ) * time .Millisecond
109
111
}
110
112
if stats .InProgressCount , line , err = mustParseUint (line , 64 , "inprogress iops" ); err != nil {
111
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
113
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
112
114
}
113
115
if millis , rest , err := mustParseUint (line , 64 , "time doing IO" ); err != nil {
114
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
116
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
115
117
} else {
116
118
line = rest
117
119
stats .CumulativeDuration = time .Duration (millis ) * time .Millisecond
118
120
}
119
121
if millis , rest , err := mustParseUint (line , 64 , "weighted IO duration" ); err != nil {
120
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
122
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
121
123
} else {
122
124
line = rest
123
125
stats .WeightedIODuration = time .Duration (millis ) * time .Millisecond
124
126
}
125
127
126
128
// The below fields are optional.
127
129
if stats .DiscardsCount , _ , line , err = tryParseUint (line , 64 ); err != nil {
128
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
130
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
129
131
}
130
132
if stats .DiscardsMerged , _ , line , err = tryParseUint (line , 64 ); err != nil {
131
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
133
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
132
134
}
133
135
if stats .DiscardsSectors , _ , line , err = tryParseUint (line , 64 ); err != nil {
134
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
136
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
135
137
}
136
138
if millis , ok , rest , err := tryParseUint (line , 64 ); err != nil {
137
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
139
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
138
140
} else if ok {
139
141
line = rest
140
142
stats .DiscardsDuration = time .Duration (millis ) * time .Millisecond
141
143
}
142
144
if stats .FlushesCount , _ , line , err = tryParseUint (line , 64 ); err != nil {
143
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
145
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
144
146
}
145
147
if millis , ok , _ , err := tryParseUint (line , 64 ); err != nil {
146
- return errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
148
+ return 0 , errors .Wrapf (err , "/proc/diskstats:%d: %q" , lineNum , err )
147
149
} else if ok {
148
150
stats .FlushesDuration = time .Duration (millis ) * time .Millisecond
149
151
}
150
152
disks [diskIdx ].recordStats (measuredAt , stats )
153
+ countCollected ++
151
154
}
152
- return nil
155
+ return countCollected , nil
153
156
}
154
157
155
158
func splitLine (b []byte ) (line , rest []byte ) {
0 commit comments