Loading & namespacing external plugins
This commit is contained in:
parent
2eee1b84fb
commit
f4e48f9909
|
@ -16,6 +16,7 @@ import (
|
||||||
"github.com/influxdata/telegraf/agent"
|
"github.com/influxdata/telegraf/agent"
|
||||||
"github.com/influxdata/telegraf/internal/config"
|
"github.com/influxdata/telegraf/internal/config"
|
||||||
"github.com/influxdata/telegraf/logger"
|
"github.com/influxdata/telegraf/logger"
|
||||||
|
"github.com/influxdata/telegraf/registry"
|
||||||
"github.com/influxdata/telegraf/registry/inputs"
|
"github.com/influxdata/telegraf/registry/inputs"
|
||||||
"github.com/influxdata/telegraf/registry/outputs"
|
"github.com/influxdata/telegraf/registry/outputs"
|
||||||
|
|
||||||
|
@ -273,6 +274,15 @@ func loadExternalPlugins(rootDir string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// name will be the path to the plugin file beginning at the root
|
||||||
|
// directory, minus the extension.
|
||||||
|
// ie, if the plugin file is /opt/telegraf-plugins/group1/foo.so, name
|
||||||
|
// will be "group1/foo"
|
||||||
|
name := strings.TrimPrefix(strings.TrimPrefix(pth, rootDir), string(os.PathSeparator))
|
||||||
|
name = strings.TrimSuffix(name, filepath.Ext(pth))
|
||||||
|
registry.SetName("external" + string(os.PathSeparator) + name)
|
||||||
|
defer registry.SetName("")
|
||||||
|
|
||||||
// Load plugin.
|
// Load plugin.
|
||||||
_, err = plugin.Open(pth)
|
_, err = plugin.Open(pth)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -40,6 +40,14 @@ var (
|
||||||
|
|
||||||
// envVarRe is a regex to find environment variables in the config file
|
// envVarRe is a regex to find environment variables in the config file
|
||||||
envVarRe = regexp.MustCompile(`\$\w+`)
|
envVarRe = regexp.MustCompile(`\$\w+`)
|
||||||
|
|
||||||
|
// addQuoteRe is a regex for finding and adding quotes around / characters
|
||||||
|
// when they are used for distinguishing external plugins.
|
||||||
|
// ie, a ReplaceAll() with this pattern will be used to turn this:
|
||||||
|
// [[inputs.external/test/example]]
|
||||||
|
// to
|
||||||
|
// [[inputs."external/test/example"]]
|
||||||
|
addQuoteRe = regexp.MustCompile(`(\[?\[?inputs|outputs|processors|aggregators)\.(external\/[^.\]]+)`)
|
||||||
)
|
)
|
||||||
|
|
||||||
// Config specifies the URL/user/password for the database that telegraf
|
// Config specifies the URL/user/password for the database that telegraf
|
||||||
|
@ -701,6 +709,9 @@ func parseFile(fpath string) (*ast.Table, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// add quotes around external plugin paths.
|
||||||
|
contents = addQuoteRe.ReplaceAll(contents, []byte(`$1."$2"`))
|
||||||
|
|
||||||
return toml.Parse(contents)
|
return toml.Parse(contents)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,20 @@
|
||||||
package aggregators
|
package aggregators
|
||||||
|
|
||||||
import "github.com/influxdata/telegraf"
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/influxdata/telegraf"
|
||||||
|
"github.com/influxdata/telegraf/registry"
|
||||||
|
)
|
||||||
|
|
||||||
type Creator func() telegraf.Aggregator
|
type Creator func() telegraf.Aggregator
|
||||||
|
|
||||||
var Aggregators = map[string]Creator{}
|
var Aggregators = map[string]Creator{}
|
||||||
|
|
||||||
func Add(name string, creator Creator) {
|
func Add(name string, creator Creator) {
|
||||||
|
if override := registry.GetName(); override != "" {
|
||||||
|
name = override
|
||||||
|
}
|
||||||
|
log.Println("D! Loading plugin: [[aggregators." + name + "]]")
|
||||||
Aggregators[name] = creator
|
Aggregators[name] = creator
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
package registry
|
|
|
@ -1,11 +1,20 @@
|
||||||
package inputs
|
package inputs
|
||||||
|
|
||||||
import "github.com/influxdata/telegraf"
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/influxdata/telegraf"
|
||||||
|
"github.com/influxdata/telegraf/registry"
|
||||||
|
)
|
||||||
|
|
||||||
type Creator func() telegraf.Input
|
type Creator func() telegraf.Input
|
||||||
|
|
||||||
var Inputs = map[string]Creator{}
|
var Inputs = map[string]Creator{}
|
||||||
|
|
||||||
func Add(name string, creator Creator) {
|
func Add(name string, creator Creator) {
|
||||||
|
if override := registry.GetName(); override != "" {
|
||||||
|
name = override
|
||||||
|
}
|
||||||
|
log.Println("D! Loading plugin: [[inputs." + name + "]]")
|
||||||
Inputs[name] = creator
|
Inputs[name] = creator
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
package registry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
var nameOverride string
|
||||||
|
var mu sync.Mutex
|
||||||
|
|
||||||
|
func SetName(s string) {
|
||||||
|
mu.Lock()
|
||||||
|
nameOverride = s
|
||||||
|
mu.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetName() string {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
return nameOverride
|
||||||
|
}
|
|
@ -1,7 +1,10 @@
|
||||||
package outputs
|
package outputs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
"github.com/influxdata/telegraf"
|
"github.com/influxdata/telegraf"
|
||||||
|
"github.com/influxdata/telegraf/registry"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Creator func() telegraf.Output
|
type Creator func() telegraf.Output
|
||||||
|
@ -9,5 +12,9 @@ type Creator func() telegraf.Output
|
||||||
var Outputs = map[string]Creator{}
|
var Outputs = map[string]Creator{}
|
||||||
|
|
||||||
func Add(name string, creator Creator) {
|
func Add(name string, creator Creator) {
|
||||||
|
if override := registry.GetName(); override != "" {
|
||||||
|
name = override
|
||||||
|
}
|
||||||
|
log.Println("D! Loading plugin: [[outputs." + name + "]]")
|
||||||
Outputs[name] = creator
|
Outputs[name] = creator
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,20 @@
|
||||||
package processors
|
package processors
|
||||||
|
|
||||||
import "github.com/influxdata/telegraf"
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/influxdata/telegraf"
|
||||||
|
"github.com/influxdata/telegraf/registry"
|
||||||
|
)
|
||||||
|
|
||||||
type Creator func() telegraf.Processor
|
type Creator func() telegraf.Processor
|
||||||
|
|
||||||
var Processors = map[string]Creator{}
|
var Processors = map[string]Creator{}
|
||||||
|
|
||||||
func Add(name string, creator Creator) {
|
func Add(name string, creator Creator) {
|
||||||
|
if override := registry.GetName(); override != "" {
|
||||||
|
name = override
|
||||||
|
}
|
||||||
|
log.Println("D! Loading plugin: [[processors." + name + "]]")
|
||||||
Processors[name] = creator
|
Processors[name] = creator
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue