diff --git a/src/model/collect.go b/src/model/collect.go index 63ce75a836cd36c062ba268554443ea841e53dd5..6fdee5111f42744534bb5bd70794158b435c92d4 100644 --- a/src/model/collect.go +++ b/src/model/collect.go @@ -12,16 +12,18 @@ import ( type Collect struct { sync.RWMutex - Ports map[int]*PortCollect `json:"ports"` - Procs map[string]*ProcCollect `json:"procs"` - Logs map[string]*LogCollect `json:"logs"` + Ports map[int]*PortCollect `json:"ports"` + Procs map[string]*ProcCollect `json:"procs"` + Logs map[string]*LogCollect `json:"logs"` + Plugins map[string]*PluginCollect `json:"plugins"` } func NewCollect() *Collect { return &Collect{ - Ports: make(map[int]*PortCollect), - Procs: make(map[string]*ProcCollect), - Logs: make(map[string]*LogCollect), + Ports: make(map[int]*PortCollect), + Procs: make(map[string]*ProcCollect), + Logs: make(map[string]*LogCollect), + Plugins: make(map[string]*PluginCollect), } } @@ -45,6 +47,12 @@ func (c *Collect) Update(cc *Collect) { for k, v := range cc.Logs { c.Logs[k] = v } + + //更新plugin采集配置 + c.Plugins = make(map[string]*PluginCollect) + for k, v := range cc.Plugins { + c.Plugins[k] = v + } } func (c *Collect) GetPorts() map[int]*PortCollect { @@ -80,6 +88,17 @@ func (c *Collect) GetLogConfig() map[string]*LogCollect { return tmp } +func (c *Collect) GetPlugin() map[string]*PluginCollect { + c.RLock() + defer c.RUnlock() + + tmp := make(map[string]*PluginCollect) + for k, v := range c.Plugins { + tmp[k] = v + } + return tmp +} + type PortCollect struct { Id int64 `json:"id"` Nid int64 `json:"nid"` @@ -114,6 +133,21 @@ type ProcCollect struct { CollectMethod string `json:"collect_method"` } +type PluginCollect struct { + Id int64 `json:"id"` + Nid int64 `json:"nid"` + CollectType string `json:"collect_type"` + Name string `json:"name"` + Step int `json:"step"` + FilePath string `json:"file_path"` + Params string `json:"params"` + Comment string `json:"comment"` + Creator string `json:"creator"` + Created time.Time `xorm:"updated" json:"created"` + LastUpdator string `xorm:"last_updator" json:"last_updator"` + LastUpdated time.Time `xorm:"updated" json:"last_updated"` +} + type LogCollect struct { Id int64 `json:"id"` Nid int64 `json:"nid"` diff --git a/src/modules/collector/sys/config.go b/src/modules/collector/sys/config.go index ed2814b95f7b2a0863331fb4378628dd0fcf584d..143890abe80b3208349231449362b2cb18540cd2 100644 --- a/src/modules/collector/sys/config.go +++ b/src/modules/collector/sys/config.go @@ -8,6 +8,7 @@ type SysSection struct { IgnoreMetricsMap map[string]struct{} `yaml:"-"` NtpServers []string `yaml:"ntpServers"` Plugin string `yaml:"plugin"` + PluginRemote bool `yaml:"pluginRemote"` Interval int `yaml:"interval"` Timeout int `yaml:"timeout"` } diff --git a/src/modules/collector/sys/plugins/cron.go b/src/modules/collector/sys/plugins/cron.go index 152068e876a828a6be87e22fd9b22c321fde923e..fe8b4c140089a64b09adf44fc01dbd051abff0d8 100644 --- a/src/modules/collector/sys/plugins/cron.go +++ b/src/modules/collector/sys/plugins/cron.go @@ -2,8 +2,6 @@ package plugins import ( "time" - - "github.com/didi/nightingale/src/modules/collector/sys" ) func Detect() { @@ -19,7 +17,7 @@ func loopDetect() { } func detect() { - ps := ListPlugins(sys.Config.Plugin) + ps := ListPlugins() DelNoUsePlugins(ps) AddNewPlugins(ps) } diff --git a/src/modules/collector/sys/plugins/plugin.go b/src/modules/collector/sys/plugins/plugin.go index a9986fd8be05dee6d67f97914a7b0c592be0e2dd..35b69e8a091cb658d55f901e434d62e96de83192 100644 --- a/src/modules/collector/sys/plugins/plugin.go +++ b/src/modules/collector/sys/plugins/plugin.go @@ -2,6 +2,7 @@ package plugins type Plugin struct { FilePath string + Params string MTime int64 Cycle int } diff --git a/src/modules/collector/sys/plugins/reader.go b/src/modules/collector/sys/plugins/reader.go index 78eca0e565b6c9645f5c1a6147757a51ae6bbda0..f5f86ff6cf5a623e21012543e26af05f0ffcdcc4 100644 --- a/src/modules/collector/sys/plugins/reader.go +++ b/src/modules/collector/sys/plugins/reader.go @@ -2,16 +2,57 @@ package plugins import ( "io/ioutil" + "os" "path/filepath" "strconv" "strings" + "github.com/didi/nightingale/src/modules/collector/stra" + "github.com/didi/nightingale/src/modules/collector/sys" + "github.com/toolkits/pkg/file" "github.com/toolkits/pkg/logger" ) // key: 60_ntp.py -func ListPlugins(dir string) map[string]*Plugin { +func ListPlugins() map[string]*Plugin { + plugins := make(map[string]*Plugin) + if sys.Config.PluginRemote { + plugins = ListPluginsFromMonapi() + } else { + plugins = ListPluginsFromLocal() + } + return plugins +} + +func ListPluginsFromMonapi() map[string]*Plugin { + ret := make(map[string]*Plugin) + + plugins := stra.Collect.GetPlugin() + + for _, p := range plugins { + fpath := p.FilePath + fileInfo, err := os.Stat(fpath) + if err != nil { + logger.Warningf("plugin:%s get info err:%v", p.FilePath, err) + continue + } + + plugin := &Plugin{ + FilePath: fpath, + MTime: fileInfo.ModTime().Unix(), + Cycle: p.Step, + Params: p.Params, + } + + ret[fpath] = plugin + } + + return ret +} + +func ListPluginsFromLocal() map[string]*Plugin { + dir := sys.Config.Plugin ret := make(map[string]*Plugin) if dir == "" || !file.IsExist(dir) || file.IsFile(dir) { diff --git a/src/modules/collector/sys/plugins/scheduler.go b/src/modules/collector/sys/plugins/scheduler.go index f9f28887a20407cf82b2ff76366937d27268d03f..84777948d55fb12597f69387b971894c1596f978 100644 --- a/src/modules/collector/sys/plugins/scheduler.go +++ b/src/modules/collector/sys/plugins/scheduler.go @@ -5,6 +5,7 @@ import ( "encoding/json" "os/exec" "path/filepath" + "strings" "time" "github.com/toolkits/pkg/file" @@ -57,7 +58,8 @@ func PluginRun(plugin *Plugin) { } logger.Debug(fpath, " running") - cmd := exec.Command(fpath) + params := strings.Split(plugin.Params, " ") + cmd := exec.Command(fpath, params...) cmd.Dir = filepath.Dir(fpath) var stdout bytes.Buffer cmd.Stdout = &stdout