diff options
Diffstat (limited to 'vendor/github.com/prometheus/procfs/bcache/get.go')
-rw-r--r-- | vendor/github.com/prometheus/procfs/bcache/get.go | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/vendor/github.com/prometheus/procfs/bcache/get.go b/vendor/github.com/prometheus/procfs/bcache/get.go index 67fcf8b..c4747ea 100644 --- a/vendor/github.com/prometheus/procfs/bcache/get.go +++ b/vendor/github.com/prometheus/procfs/bcache/get.go | |||
@@ -174,6 +174,17 @@ func dehumanize(hbytes []byte) (uint64, error) { | |||
174 | return res, nil | 174 | return res, nil |
175 | } | 175 | } |
176 | 176 | ||
177 | func dehumanizeSigned(str string) (int64, error) { | ||
178 | value, err := dehumanize([]byte(strings.TrimPrefix(str, "-"))) | ||
179 | if err != nil { | ||
180 | return 0, err | ||
181 | } | ||
182 | if strings.HasPrefix(str, "-") { | ||
183 | return int64(-value), nil | ||
184 | } | ||
185 | return int64(value), nil | ||
186 | } | ||
187 | |||
177 | type parser struct { | 188 | type parser struct { |
178 | uuidPath string | 189 | uuidPath string |
179 | subDir string | 190 | subDir string |
@@ -232,6 +243,72 @@ func parsePriorityStats(line string, ps *PriorityStats) error { | |||
232 | return nil | 243 | return nil |
233 | } | 244 | } |
234 | 245 | ||
246 | // ParseWritebackRateDebug parses lines from the writeback_rate_debug file. | ||
247 | func parseWritebackRateDebug(line string, wrd *WritebackRateDebugStats) error { | ||
248 | switch { | ||
249 | case strings.HasPrefix(line, "rate:"): | ||
250 | fields := strings.Fields(line) | ||
251 | rawValue := fields[len(fields)-1] | ||
252 | valueStr := strings.TrimSuffix(rawValue, "/sec") | ||
253 | value, err := dehumanize([]byte(valueStr)) | ||
254 | if err != nil { | ||
255 | return err | ||
256 | } | ||
257 | wrd.Rate = value | ||
258 | case strings.HasPrefix(line, "dirty:"): | ||
259 | fields := strings.Fields(line) | ||
260 | valueStr := fields[len(fields)-1] | ||
261 | value, err := dehumanize([]byte(valueStr)) | ||
262 | if err != nil { | ||
263 | return err | ||
264 | } | ||
265 | wrd.Dirty = value | ||
266 | case strings.HasPrefix(line, "target:"): | ||
267 | fields := strings.Fields(line) | ||
268 | valueStr := fields[len(fields)-1] | ||
269 | value, err := dehumanize([]byte(valueStr)) | ||
270 | if err != nil { | ||
271 | return err | ||
272 | } | ||
273 | wrd.Target = value | ||
274 | case strings.HasPrefix(line, "proportional:"): | ||
275 | fields := strings.Fields(line) | ||
276 | valueStr := fields[len(fields)-1] | ||
277 | value, err := dehumanizeSigned(valueStr) | ||
278 | if err != nil { | ||
279 | return err | ||
280 | } | ||
281 | wrd.Proportional = value | ||
282 | case strings.HasPrefix(line, "integral:"): | ||
283 | fields := strings.Fields(line) | ||
284 | valueStr := fields[len(fields)-1] | ||
285 | value, err := dehumanizeSigned(valueStr) | ||
286 | if err != nil { | ||
287 | return err | ||
288 | } | ||
289 | wrd.Integral = value | ||
290 | case strings.HasPrefix(line, "change:"): | ||
291 | fields := strings.Fields(line) | ||
292 | rawValue := fields[len(fields)-1] | ||
293 | valueStr := strings.TrimSuffix(rawValue, "/sec") | ||
294 | value, err := dehumanizeSigned(valueStr) | ||
295 | if err != nil { | ||
296 | return err | ||
297 | } | ||
298 | wrd.Change = value | ||
299 | case strings.HasPrefix(line, "next io:"): | ||
300 | fields := strings.Fields(line) | ||
301 | rawValue := fields[len(fields)-1] | ||
302 | valueStr := strings.TrimSuffix(rawValue, "ms") | ||
303 | value, err := strconv.ParseInt(valueStr, 10, 64) | ||
304 | if err != nil { | ||
305 | return err | ||
306 | } | ||
307 | wrd.NextIO = value | ||
308 | } | ||
309 | return nil | ||
310 | } | ||
311 | |||
235 | func (p *parser) getPriorityStats() PriorityStats { | 312 | func (p *parser) getPriorityStats() PriorityStats { |
236 | var res PriorityStats | 313 | var res PriorityStats |
237 | 314 | ||
@@ -263,6 +340,35 @@ func (p *parser) getPriorityStats() PriorityStats { | |||
263 | return res | 340 | return res |
264 | } | 341 | } |
265 | 342 | ||
343 | func (p *parser) getWritebackRateDebug() WritebackRateDebugStats { | ||
344 | var res WritebackRateDebugStats | ||
345 | |||
346 | if p.err != nil { | ||
347 | return res | ||
348 | } | ||
349 | path := path.Join(p.currentDir, "writeback_rate_debug") | ||
350 | file, err := os.Open(path) | ||
351 | if err != nil { | ||
352 | p.err = fmt.Errorf("failed to read: %s", path) | ||
353 | return res | ||
354 | } | ||
355 | defer file.Close() | ||
356 | |||
357 | scanner := bufio.NewScanner(file) | ||
358 | for scanner.Scan() { | ||
359 | err = parseWritebackRateDebug(scanner.Text(), &res) | ||
360 | if err != nil { | ||
361 | p.err = fmt.Errorf("failed to parse: %s (%s)", path, err) | ||
362 | return res | ||
363 | } | ||
364 | } | ||
365 | if err := scanner.Err(); err != nil { | ||
366 | p.err = fmt.Errorf("failed to parse: %s (%s)", path, err) | ||
367 | return res | ||
368 | } | ||
369 | return res | ||
370 | } | ||
371 | |||
266 | // GetStats collects from sysfs files data tied to one bcache ID. | 372 | // GetStats collects from sysfs files data tied to one bcache ID. |
267 | func GetStats(uuidPath string, priorityStats bool) (*Stats, error) { | 373 | func GetStats(uuidPath string, priorityStats bool) (*Stats, error) { |
268 | var bs Stats | 374 | var bs Stats |
@@ -339,6 +445,9 @@ func GetStats(uuidPath string, priorityStats bool) (*Stats, error) { | |||
339 | par.setSubDir(bds.Name) | 445 | par.setSubDir(bds.Name) |
340 | bds.DirtyData = par.readValue("dirty_data") | 446 | bds.DirtyData = par.readValue("dirty_data") |
341 | 447 | ||
448 | wrd := par.getWritebackRateDebug() | ||
449 | bds.WritebackRateDebug = wrd | ||
450 | |||
342 | // dir <uuidPath>/<bds.Name>/stats_five_minute | 451 | // dir <uuidPath>/<bds.Name>/stats_five_minute |
343 | par.setSubDir(bds.Name, "stats_five_minute") | 452 | par.setSubDir(bds.Name, "stats_five_minute") |
344 | bds.FiveMin.Bypassed = par.readValue("bypassed") | 453 | bds.FiveMin.Bypassed = par.readValue("bypassed") |