aboutsummaryrefslogtreecommitdiffstats
path: root/metrics/disk_linux.go
diff options
context:
space:
mode:
authorJeffrey Wilcke <geffobscura@gmail.com>2015-06-30 08:22:19 +0800
committerJeffrey Wilcke <geffobscura@gmail.com>2015-06-30 08:22:19 +0800
commit7625b07dd9a2a7b5c5a504c1276eea04596ac871 (patch)
treece2a757cd4e0591fc15815b2dfae528ae517d36e /metrics/disk_linux.go
parent72e2613a9fe3205fa5a67b72b832e03b2357ee88 (diff)
parent8f504063f465e0ca10c6bb53ee914d10a3d45c86 (diff)
downloaddexon-7625b07dd9a2a7b5c5a504c1276eea04596ac871.tar
dexon-7625b07dd9a2a7b5c5a504c1276eea04596ac871.tar.gz
dexon-7625b07dd9a2a7b5c5a504c1276eea04596ac871.tar.bz2
dexon-7625b07dd9a2a7b5c5a504c1276eea04596ac871.tar.lz
dexon-7625b07dd9a2a7b5c5a504c1276eea04596ac871.tar.xz
dexon-7625b07dd9a2a7b5c5a504c1276eea04596ac871.tar.zst
dexon-7625b07dd9a2a7b5c5a504c1276eea04596ac871.zip
Merge branch 'release/0.9.34'
Diffstat (limited to 'metrics/disk_linux.go')
-rw-r--r--metrics/disk_linux.go55
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
+}