aboutsummaryrefslogtreecommitdiff
path: root/collector/meminfo.go
diff options
context:
space:
mode:
authorSiavash Safi <siavash.safi@gmail.com>2015-05-12 13:05:28 +0430
committerSiavash Safi <siavash.safi@gmail.com>2015-07-14 13:58:44 +0430
commit4c5db2787e6eab7b65792a871d44543c4c40069e (patch)
treed3cde61e38ad4eb2cab8656e7dc9bb4e79ef2128 /collector/meminfo.go
parentad73b87d1ea95f37f51166c4fdc8e9e9f44e1104 (diff)
downloadprometheus_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.go98
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
3package collector
4
5import (
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
18const (
19 procMemInfo = "/proc/meminfo"
20 memInfoSubsystem = "memory"
21)
22
23type meminfoCollector struct {
24 metrics map[string]prometheus.Gauge
25}
26
27func init() {
28 Factories["meminfo"] = NewMeminfoCollector
29}
30
31// Takes a prometheus registry and returns a new Collector exposing
32// memory stats.
33func NewMeminfoCollector() (Collector, error) {
34 return &meminfoCollector{
35 metrics: map[string]prometheus.Gauge{},
36 }, nil
37}
38
39func (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
60func 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
70func 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}