forked from bosun-monitor/bosun
/
railgun_linux.go
74 lines (67 loc) · 1.45 KB
/
railgun_linux.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
package collectors
import (
"encoding/json"
"net/http"
"regexp"
"strings"
"time"
"bosun.org/metadata"
"bosun.org/opentsdb"
"bosun.org/util"
)
func init() {
collectors = append(collectors, &IntervalCollector{F: c_railgun, Enable: enableRailgun, Interval: time.Minute})
}
var (
rgListenRE = regexp.MustCompile(`^stats.listen\s+?=\s+?([0-9.:]+)`)
rgURL string
)
func parseRailURL() string {
var config string
var url string
util.ReadCommand(func(line string) error {
fields := strings.Fields(line)
if len(fields) == 0 || !strings.Contains(fields[0], "rg-listener") {
return nil
}
for i, s := range fields {
if s == "-config" && len(fields) > i {
config = fields[i+1]
}
}
return nil
}, "ps", "-e", "-o", "args")
if config == "" {
return config
}
readLine(config, func(s string) error {
if m := rgListenRE.FindStringSubmatch(s); len(m) > 0 {
url = "http://" + m[1]
}
return nil
})
return url
}
func enableRailgun() bool {
rgURL = parseRailURL()
return enableURL(rgURL)()
}
func c_railgun() (opentsdb.MultiDataPoint, error) {
var md opentsdb.MultiDataPoint
res, err := http.Get(rgURL)
if err != nil {
return nil, err
}
defer res.Body.Close()
var r map[string]interface{}
j := json.NewDecoder(res.Body)
if err := j.Decode(&r); err != nil {
return nil, err
}
for k, v := range r {
if _, ok := v.(float64); ok {
Add(&md, "railgun."+k, v, nil, metadata.Unknown, metadata.None, "")
}
}
return md, nil
}