diff options
author | Siavash Safi <siavash.safi@gmail.com> | 2015-05-12 13:05:28 +0430 |
---|---|---|
committer | Siavash Safi <siavash.safi@gmail.com> | 2015-07-14 13:58:44 +0430 |
commit | 4c5db2787e6eab7b65792a871d44543c4c40069e (patch) | |
tree | d3cde61e38ad4eb2cab8656e7dc9bb4e79ef2128 /collector/meminfo.go | |
parent | ad73b87d1ea95f37f51166c4fdc8e9e9f44e1104 (diff) | |
download | prometheus_node_collector-4c5db2787e6eab7b65792a871d44543c4c40069e.tar.bz2 prometheus_node_collector-4c5db2787e6eab7b65792a871d44543c4c40069e.tar.xz prometheus_node_collector-4c5db2787e6eab7b65792a871d44543c4c40069e.zip |
Add meminfo collector for FreeBSD.
Diffstat (limited to 'collector/meminfo.go')
-rw-r--r-- | collector/meminfo.go | 98 |
1 files changed, 0 insertions, 98 deletions
diff --git a/collector/meminfo.go b/collector/meminfo.go deleted file mode 100644 index 6656ff4..0000000 --- a/collector/meminfo.go +++ /dev/null | |||
@@ -1,98 +0,0 @@ | |||
1 | // +build linux,!nomeminfo | ||
2 | |||
3 | package collector | ||
4 | |||
5 | import ( | ||
6 | "bufio" | ||
7 | "fmt" | ||
8 | "io" | ||
9 | "os" | ||
10 | "regexp" | ||
11 | "strconv" | ||
12 | "strings" | ||
13 | |||
14 | "github.com/prometheus/client_golang/prometheus" | ||
15 | "github.com/prometheus/log" | ||
16 | ) | ||
17 | |||
18 | const ( | ||
19 | procMemInfo = "/proc/meminfo" | ||
20 | memInfoSubsystem = "memory" | ||
21 | ) | ||
22 | |||
23 | type meminfoCollector struct { | ||
24 | metrics map[string]prometheus.Gauge | ||
25 | } | ||
26 | |||
27 | func init() { | ||
28 | Factories["meminfo"] = NewMeminfoCollector | ||
29 | } | ||
30 | |||
31 | // Takes a prometheus registry and returns a new Collector exposing | ||
32 | // memory stats. | ||
33 | func NewMeminfoCollector() (Collector, error) { | ||
34 | return &meminfoCollector{ | ||
35 | metrics: map[string]prometheus.Gauge{}, | ||
36 | }, nil | ||
37 | } | ||
38 | |||
39 | func (c *meminfoCollector) Update(ch chan<- prometheus.Metric) (err error) { | ||
40 | memInfo, err := getMemInfo() | ||
41 | if err != nil { | ||
42 | return fmt.Errorf("Couldn't get meminfo: %s", err) | ||
43 | } | ||
44 | log.Debugf("Set node_mem: %#v", memInfo) | ||
45 | for k, v := range memInfo { | ||
46 | if _, ok := c.metrics[k]; !ok { | ||
47 | c.metrics[k] = prometheus.NewGauge(prometheus.GaugeOpts{ | ||
48 | Namespace: Namespace, | ||
49 | Subsystem: memInfoSubsystem, | ||
50 | Name: k, | ||
51 | Help: k + " from /proc/meminfo.", | ||
52 | }) | ||
53 | } | ||
54 | c.metrics[k].Set(v) | ||
55 | c.metrics[k].Collect(ch) | ||
56 | } | ||
57 | return err | ||
58 | } | ||
59 | |||
60 | func getMemInfo() (map[string]float64, error) { | ||
61 | file, err := os.Open(procMemInfo) | ||
62 | if err != nil { | ||
63 | return nil, err | ||
64 | } | ||
65 | defer file.Close() | ||
66 | |||
67 | return parseMemInfo(file) | ||
68 | } | ||
69 | |||
70 | func parseMemInfo(r io.Reader) (map[string]float64, error) { | ||
71 | var ( | ||
72 | memInfo = map[string]float64{} | ||
73 | scanner = bufio.NewScanner(r) | ||
74 | re = regexp.MustCompile("\\((.*)\\)") | ||
75 | ) | ||
76 | |||
77 | for scanner.Scan() { | ||
78 | line := scanner.Text() | ||
79 | parts := strings.Fields(string(line)) | ||
80 | fv, err := strconv.ParseFloat(parts[1], 64) | ||
81 | if err != nil { | ||
82 | return nil, fmt.Errorf("Invalid value in meminfo: %s", err) | ||
83 | } | ||
84 | switch len(parts) { | ||
85 | case 2: // no unit | ||
86 | case 3: // has unit, we presume kB | ||
87 | fv *= 1024 | ||
88 | default: | ||
89 | return nil, fmt.Errorf("Invalid line in %s: %s", procMemInfo, line) | ||
90 | } | ||
91 | key := parts[0][:len(parts[0])-1] // remove trailing : from key | ||
92 | // Active(anon) -> Active_anon | ||
93 | key = re.ReplaceAllString(key, "_${1}") | ||
94 | memInfo[key] = fv | ||
95 | } | ||
96 | |||
97 | return memInfo, nil | ||
98 | } | ||