diff --git a/collectors/infinibandMetric.go b/collectors/infinibandMetric.go new file mode 100644 index 0000000..1466581 --- /dev/null +++ b/collectors/infinibandMetric.go @@ -0,0 +1,64 @@ +package collectors + +import ( + "fmt" + "io/ioutil" + "log" + "os/exec" + "strings" + "strconv" + "time" +) + +const LIDFILE = `/sys/class/infiniband/mlx4_0/ports/1/lid` + +type InfinibandCollector struct { + MetricCollector +} + +func (m *InfinibandCollector) Init() { + m.name = "InfinibandCollector" + m.setup() +} + +func (m *InfinibandCollector) Read(interval time.Duration){ + buffer, err := ioutil.ReadFile(string(LIDFILE)) + + if err != nil { + log.Print(err) + return + } + + args := fmt.Sprintf("-r %s 1 0xf000", string(buffer)) + + command := exec.Command("/usr/sbin/perfquery", args) + command.Wait() + stdout, err := command.Output() + if err != nil { + log.Print(err) + return + } + + ll := strings.Split(string(stdout), "\n") + + for _, line := range ll { + if strings.HasPrefix(line, "PortRcvData") || strings.HasPrefix(line, "RcvData") { + lv := strings.Fields(line) + v, err := strconv.ParseFloat(lv[1], 64) + if err == nil { + m.node["ib_recv"] = float64(v) + } + } + if strings.HasPrefix(line, "PortXmitData") || strings.HasPrefix(line, "XmtData") { + lv := strings.Fields(line) + v, err := strconv.ParseFloat(lv[1], 64) + if err == nil { + m.node["ib_xmit"] = float64(v) + } + } + } +} + +func (m *InfinibandCollector) Close() { + return +} diff --git a/config.json b/config.json index a496060..2ef517a 100644 --- a/config.json +++ b/config.json @@ -11,7 +11,8 @@ "memstat", "likwid", "loadavg", - "netstat" + "netstat", + "ibstat" ] } diff --git a/metric-collector.go b/metric-collector.go index 2eecdb9..4c5ab1a 100644 --- a/metric-collector.go +++ b/metric-collector.go @@ -17,6 +17,7 @@ var Collectors = map[string]collectors.MetricGetter{ "loadavg": &collectors.LoadavgCollector{}, "memstat": &collectors.MemstatCollector{}, "netstat": &collectors.NetstatCollector{}, + "ibstat": &collectors.InfinibandCollector{}, } type GlobalConfig struct { Sink struct {