-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathdf.go
89 lines (80 loc) · 1.76 KB
/
df.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package main
import (
"errors"
"os/exec"
"strconv"
"strings"
)
type Df struct {
RawSpace []byte
RawInode []byte
}
func (self *Df) Prefix() string {
return "df"
}
const (
SPACE = "space"
INODE = "inode"
DF = "df"
)
func init() {
parser.Add(DF, "true", "Collect disk free space metrics")
}
var dfFlgaMapping = map[string]string{
SPACE: "-k",
INODE: "-i",
}
func CollectDf(t string, raw []byte, c *MetricsCollection) (e error) {
if len(raw) == 0 {
if flag, ok := dfFlgaMapping[t]; ok {
raw, e = ReadDf(flag)
} else {
return errors.New("no mapping for df key " + t + " defined")
}
}
lines := strings.Split(strings.TrimSpace(string(raw)), "\n")
for _, line := range lines[1:] {
if !strings.HasPrefix(line, "/") {
continue
}
chunks := strings.Fields(line)
if len(chunks) >= 6 {
tags := map[string]string{
"file_system": chunks[0],
"mounted_on": chunks[5],
}
if v, e := strconv.ParseInt(chunks[1], 10, 64); e == nil {
c.AddWithTags(t+".Total", v, tags)
}
if v, e := strconv.ParseInt(chunks[2], 10, 64); e == nil {
c.AddWithTags(t+".Used", v, tags)
}
if v, e := strconv.ParseInt(chunks[3], 10, 64); e == nil {
c.AddWithTags(t+".Available", v, tags)
}
if v, e := strconv.ParseInt(strings.Replace(chunks[4], "%", "", 1), 10, 64); e == nil {
c.AddWithTags(t+".Use", v, tags)
}
}
}
return
}
func (self *Df) Collect(c *MetricsCollection) (e error) {
e = CollectDf(SPACE, self.RawSpace, c)
if e != nil {
return
}
e = CollectDf(INODE, self.RawInode, c)
return
}
func ReadDf(flag string) (b []byte, e error) {
dbg.Print("reading df with", flag)
b, e = exec.Command("df", flag).Output()
if e != nil {
return
}
if len(b) == 0 {
e = errors.New("Reading df returned an empty string")
}
return
}