diff options
author | Péter Szilágyi <peterke@gmail.com> | 2015-06-27 23:12:58 +0800 |
---|---|---|
committer | Jeffrey Wilcke <geffobscura@gmail.com> | 2015-06-30 06:51:02 +0800 |
commit | 2aeeb72fa5c4f90d0ab072a361a678c3cdee8e26 (patch) | |
tree | 8b3a9064a185a0b80f5eeea4a3fb40f5d5995585 /metrics/disk_linux.go | |
parent | 7c4ed8055cc036214279e3ebded74c58d6808d05 (diff) | |
download | go-tangerine-2aeeb72fa5c4f90d0ab072a361a678c3cdee8e26.tar.gz go-tangerine-2aeeb72fa5c4f90d0ab072a361a678c3cdee8e26.tar.zst go-tangerine-2aeeb72fa5c4f90d0ab072a361a678c3cdee8e26.zip |
cmd/geth, metrics: separate process metric collection, add disk
Diffstat (limited to 'metrics/disk_linux.go')
-rw-r--r-- | metrics/disk_linux.go | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/metrics/disk_linux.go b/metrics/disk_linux.go new file mode 100644 index 000000000..82b204534 --- /dev/null +++ b/metrics/disk_linux.go @@ -0,0 +1,55 @@ +// Contains the Linux implementation of process disk IO counter retrieval. + +package metrics + +import ( + "bufio" + "fmt" + "io" + "os" + "strconv" + "strings" +) + +// ReadDiskStats retrieves the disk IO stats belonging to the current process. +func ReadDiskStats(stats *DiskStats) error { + // Open the process disk IO counter file + inf, err := os.Open(fmt.Sprintf("/proc/%d/io", os.Getpid())) + if err != nil { + return err + } + in := bufio.NewReader(inf) + + // Iterate over the IO counter, and extract what we need + for { + // Read the next line and split to key and value + line, err := in.ReadString('\n') + if err != nil { + if err == io.EOF { + return nil + } + return err + } + key, value := "", int64(0) + if parts := strings.Split(line, ":"); len(parts) != 2 { + continue + } else { + key = strings.TrimSpace(parts[0]) + if value, err = strconv.ParseInt(strings.TrimSpace(parts[1]), 10, 64); err != nil { + return err + } + } + // Update the counter based on the key + switch key { + case "syscr": + stats.ReadCount = value + case "syscw": + stats.WriteCount = value + case "rchar": + stats.ReadBytes = value + case "wchar": + stats.WriteBytes = value + } + } + return nil +} |