forked from mackerelio/mackerel-agent
/
filesystem.go
52 lines (43 loc) · 1.39 KB
/
filesystem.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
// +build linux
package linux
import (
"regexp"
"github.com/mackerelio/mackerel-agent/logging"
"github.com/mackerelio/mackerel-agent/metrics"
"github.com/mackerelio/mackerel-agent/util"
)
// FilesystemGenerator XXX
type FilesystemGenerator struct {
IgnoreRegexp *regexp.Regexp
}
var logger = logging.GetLogger("metrics.filesystem")
var dfColumnSpecs = []util.DfColumnSpec{
util.DfColumnSpec{Name: "size", IsInt: true},
util.DfColumnSpec{Name: "used", IsInt: true},
}
// Generate XXX
func (g *FilesystemGenerator) Generate() (metrics.Values, error) {
filesystems, err := util.CollectDfValues(dfColumnSpecs)
if err != nil {
return nil, err
}
ret := make(map[string]float64)
for name, values := range filesystems {
// https://github.com/docker/docker/blob/v1.5.0/daemon/graphdriver/devmapper/deviceset.go#L981
if regexp.MustCompile(`^/dev/mapper/docker-`).FindStringSubmatch(name) != nil ||
(g.IgnoreRegexp != nil && g.IgnoreRegexp.MatchString(name)) {
continue
}
if matches := regexp.MustCompile(`^/dev/(.*)$`).FindStringSubmatch(name); matches != nil {
device := regexp.MustCompile(`[^A-Za-z0-9_-]`).ReplaceAllString(matches[1], "_")
for key, value := range values {
intValue, valueTypeOk := value.(int64)
if valueTypeOk {
// kilo bytes -> bytes
ret["filesystem."+device+"."+key] = float64(intValue) * 1024
}
}
}
}
return metrics.Values(ret), nil
}