package collectors import ( "fmt" lp "github.com/influxdata/line-protocol" "io/ioutil" "log" "os/exec" "time" ) const CUSTOMCMDPATH = `/home/unrz139/Work/cc-metric-collector/collectors/custom` type CustomCmdCollector struct { MetricCollector handler *lp.MetricHandler parser *lp.Parser } func (m *CustomCmdCollector) Init() error { m.name = "CustomCmdCollector" m.setup() m.handler = lp.NewMetricHandler() m.parser = lp.NewParser(m.handler) m.parser.SetTimeFunc(DefaultTime) m.init = true return nil } var DefaultTime = func() time.Time { return time.Unix(42, 0) } func (m *CustomCmdCollector) Read(interval time.Duration, out *[]lp.MutableMetric) { files, err := ioutil.ReadDir(string(CUSTOMCMDPATH)) if err != nil { log.Print(err) return } for _, file := range files { // stat, err := os.Stat(file) // if err != nil { // log.Print(err) // continue // } // mode := stat.Mode() // if mode & 0o555 { path := fmt.Sprintf("%s/%s", string(CUSTOMCMDPATH), file.Name()) command := exec.Command(path, "") command.Wait() stdout, err := command.Output() if err != nil { log.Print(err) continue } metrics, err := m.parser.Parse(stdout) if err != nil { log.Print(err) continue } for _, m := range metrics { y, err := lp.New(m.Name(), Tags2Map(m), Fields2Map(m), m.Time()) if err == nil { *out = append(*out, y) } // switch m.Name() { // case "node": // for k, v := range m.FieldList() { // m.node[k] = float64(v) // } // case "socket": // tlist := m.TagList() // if id, found := tlist["socket"]; found { // for k, v := range m.FieldList() { // m.socket[id][k] = float64(v) // } // } // case "cpu": // tlist := m.TagList() // if id, found := tlist["cpu"]; found { // for k, v := range m.FieldList() { // m.cpu[id][k] = float64(v) // } // } // case "network": // tlist := m.TagList() // if id, found := tlist["device"]; found { // for k, v := range m.FieldList() { // m.network[id][k] = float64(v) // } // } // case "accelerator": // tlist := m.TagList() // if id, found := tlist["device"]; found { // for k, v := range m.FieldList() { // m.accelerator[id][k] = float64(v) // } // } // } } // } if file is executable check } } func (m *CustomCmdCollector) Close() { m.init = false return }