feature: support dlopen for prober plugin (#588)
This commit is contained in:
parent
b055bc73c5
commit
9c1c894e29
|
@ -0,0 +1,57 @@
|
||||||
|
package all
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"plugin"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
const pluginDir = "plugins"
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
plugins, err := listPlugins(pluginDir)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("list plugins: \n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, file := range plugins {
|
||||||
|
_, err := plugin.Open(file)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("plugin.Open %s err %s\n", file, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func listPlugins(dir string) ([]string, error) {
|
||||||
|
df, err := os.Open(dir)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed opening directory: %s", err)
|
||||||
|
}
|
||||||
|
defer df.Close()
|
||||||
|
|
||||||
|
list, err := df.Readdirnames(0) // 0 to read all files and folders
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("read dir names: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var plugins []string
|
||||||
|
for _, name := range list {
|
||||||
|
if !strings.HasSuffix(name, ".so") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
file := filepath.Join(dir, name)
|
||||||
|
if fi, err := os.Stat(file); err != nil {
|
||||||
|
continue
|
||||||
|
} else if fi.IsDir() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
plugins = append(plugins, file)
|
||||||
|
}
|
||||||
|
|
||||||
|
return plugins, nil
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
all: lib.so
|
||||||
|
|
||||||
|
lib.so: lib.go
|
||||||
|
go build -buildmode=plugin -o $@
|
|
@ -0,0 +1,5 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "github.com/didi/nightingale/src/modules/monapi/plugins/demo"
|
||||||
|
)
|
|
@ -19,6 +19,7 @@ import (
|
||||||
"github.com/didi/nightingale/src/modules/prober/http"
|
"github.com/didi/nightingale/src/modules/prober/http"
|
||||||
"github.com/didi/nightingale/src/modules/prober/manager"
|
"github.com/didi/nightingale/src/modules/prober/manager"
|
||||||
|
|
||||||
|
"github.com/didi/nightingale/src/modules/monapi/collector"
|
||||||
_ "github.com/didi/nightingale/src/modules/monapi/plugins/all"
|
_ "github.com/didi/nightingale/src/modules/monapi/plugins/all"
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
|
||||||
|
@ -78,6 +79,8 @@ func main() {
|
||||||
|
|
||||||
manager.NewManager(cfg, cache.CollectRule).Start(ctx)
|
manager.NewManager(cfg, cache.CollectRule).Start(ctx)
|
||||||
|
|
||||||
|
pluginInfo()
|
||||||
|
|
||||||
http.Start()
|
http.Start()
|
||||||
|
|
||||||
ending(cancel)
|
ending(cancel)
|
||||||
|
@ -132,3 +135,10 @@ func ending(cancel context.CancelFunc) {
|
||||||
http.Shutdown()
|
http.Shutdown()
|
||||||
fmt.Printf("%s stopped successfully\n", os.Args[0])
|
fmt.Printf("%s stopped successfully\n", os.Args[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func pluginInfo() {
|
||||||
|
fmt.Println("remote collector")
|
||||||
|
for k, v := range collector.GetRemoteCollectors() {
|
||||||
|
fmt.Printf(" %d %s\n", k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue