aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/prometheus/procfs/bcache/get.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/prometheus/procfs/bcache/get.go')
-rw-r--r--vendor/github.com/prometheus/procfs/bcache/get.go109
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
177func 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
177type parser struct { 188type 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.
247func 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
235func (p *parser) getPriorityStats() PriorityStats { 312func (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
343func (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.
267func GetStats(uuidPath string, priorityStats bool) (*Stats, error) { 373func 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")