diff --git a/README.md b/README.md index 1ccd7f9a79383..7c89cec00ad25 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,8 @@ if you don't have it already. You also must build with golang version 1.4+ ### How to use it: * Run `telegraf -sample-config > telegraf.conf` to create an initial configuration +* Run `telegraf -sample-config -filter cpu:mem -outputfilter influxdb` +to create a config file with only CPU and memory plugins, and InfluxDB output defined * Edit the configuration to match your needs * Run `telegraf -config telegraf.conf -test` to output one full measurement sample to STDOUT * Run `telegraf -config telegraf.conf` to gather and send metrics to configured outputs. diff --git a/agent.go b/agent.go index a8ee44207f34a..b63aee48f0e5f 100644 --- a/agent.go +++ b/agent.go @@ -6,7 +6,6 @@ import ( "log" "os" "sort" - "strings" "sync" "time" @@ -113,7 +112,7 @@ func (a *Agent) Close() error { } // LoadOutputs loads the agent's outputs -func (a *Agent) LoadOutputs() ([]string, error) { +func (a *Agent) LoadOutputs(filters []string) ([]string, error) { var names []string for _, name := range a.Config.OutputsDeclared() { @@ -122,15 +121,17 @@ func (a *Agent) LoadOutputs() ([]string, error) { return nil, fmt.Errorf("Undefined but requested output: %s", name) } - output := creator() + if sliceContains(name, filters) || len(filters) == 0 { + output := creator() - err := a.Config.ApplyOutput(name, output) - if err != nil { - return nil, err - } + err := a.Config.ApplyOutput(name, output) + if err != nil { + return nil, err + } - a.outputs = append(a.outputs, &runningOutput{name, output}) - names = append(names, name) + a.outputs = append(a.outputs, &runningOutput{name, output}) + names = append(names, name) + } } sort.Strings(names) @@ -139,14 +140,8 @@ func (a *Agent) LoadOutputs() ([]string, error) { } // LoadPlugins loads the agent's plugins -func (a *Agent) LoadPlugins(pluginsFilter string) ([]string, error) { +func (a *Agent) LoadPlugins(filters []string) ([]string, error) { var names []string - var filters []string - - pluginsFilter = strings.TrimSpace(pluginsFilter) - if pluginsFilter != "" { - filters = strings.Split(":"+pluginsFilter+":", ":") - } for _, name := range a.Config.PluginsDeclared() { creator, ok := plugins.Plugins[name] @@ -154,22 +149,9 @@ func (a *Agent) LoadPlugins(pluginsFilter string) ([]string, error) { return nil, fmt.Errorf("Undefined but requested plugin: %s", name) } - isPluginEnabled := false - if len(filters) > 0 { - for _, runeValue := range filters { - if runeValue != "" && strings.ToLower(runeValue) == strings.ToLower(name) { - fmt.Printf("plugin [%s] is enabled (filter options)\n", name) - isPluginEnabled = true - break - } - } - } else { - // if no filter, we ALWAYS accept the plugin - isPluginEnabled = true - } - - if isPluginEnabled { + if sliceContains(name, filters) || len(filters) == 0 { plugin := creator() + config, err := a.Config.ApplyPlugin(name, plugin) if err != nil { return nil, err diff --git a/cmd/telegraf/telegraf.go b/cmd/telegraf/telegraf.go index f28a81bd44af5..7080f76715eed 100644 --- a/cmd/telegraf/telegraf.go +++ b/cmd/telegraf/telegraf.go @@ -21,8 +21,10 @@ var fVersion = flag.Bool("version", false, "display the version") var fSampleConfig = flag.Bool("sample-config", false, "print out full sample configuration") var fPidfile = flag.String("pidfile", "", "file to write our pid to") -var fPLuginsFilter = flag.String("filter", "", +var fPLuginFilters = flag.String("filter", "", "filter the plugins to enable, separator is :") +var fOutputFilters = flag.String("outputfilter", "", + "filter the outputs to enable, separator is :") var fUsage = flag.String("usage", "", "print usage for a plugin, ie, 'telegraf -usage mysql'") @@ -33,6 +35,18 @@ var Version string func main() { flag.Parse() + var pluginFilters []string + if *fPLuginFilters != "" { + pluginsFilter := strings.TrimSpace(*fPLuginFilters) + pluginFilters = strings.Split(":"+pluginsFilter+":", ":") + } + + var outputFilters []string + if *fOutputFilters != "" { + outputFilter := strings.TrimSpace(*fOutputFilters) + outputFilters = strings.Split(":"+outputFilter+":", ":") + } + if *fVersion { v := fmt.Sprintf("Telegraf - Version %s", Version) fmt.Println(v) @@ -40,7 +54,7 @@ func main() { } if *fSampleConfig { - telegraf.PrintSampleConfig() + telegraf.PrintSampleConfig(pluginFilters, outputFilters) return } @@ -76,7 +90,7 @@ func main() { ag.Debug = true } - outputs, err := ag.LoadOutputs() + outputs, err := ag.LoadOutputs(outputFilters) if err != nil { log.Fatal(err) } @@ -85,7 +99,7 @@ func main() { os.Exit(1) } - plugins, err := ag.LoadPlugins(*fPLuginsFilter) + plugins, err := ag.LoadPlugins(pluginFilters) if err != nil { log.Fatal(err) } diff --git a/config.go b/config.go index fae445e8cec1e..d9724e65f857b 100644 --- a/config.go +++ b/config.go @@ -384,15 +384,16 @@ var header2 = ` ############################################################################### ` -// PrintSampleConfig prints the sample config! -func PrintSampleConfig() { +// PrintSampleConfig prints the sample config +func PrintSampleConfig(pluginFilters []string, outputFilters []string) { fmt.Printf(header) // Print Outputs var onames []string - for oname := range outputs.Outputs { - onames = append(onames, oname) + if len(outputFilters) == 0 || sliceContains(oname, outputFilters) { + onames = append(onames, oname) + } } sort.Strings(onames) @@ -414,9 +415,10 @@ func PrintSampleConfig() { // Print Plugins var pnames []string - for pname := range plugins.Plugins { - pnames = append(pnames, pname) + if len(pluginFilters) == 0 || sliceContains(pname, pluginFilters) { + pnames = append(pnames, pname) + } } sort.Strings(pnames) @@ -435,6 +437,15 @@ func PrintSampleConfig() { } } +func sliceContains(name string, list []string) bool { + for _, b := range list { + if b == name { + return true + } + } + return false +} + // PrintPluginConfig prints the config usage of a single plugin. func PrintPluginConfig(name string) error { if creator, ok := plugins.Plugins[name]; ok {