feat(agent): Print plugins source information (#16270)

This commit is contained in:
Neelay Upadhyaya 2025-01-22 21:05:15 +05:30 committed by GitHub
parent 1d4f08954e
commit 0ec17e4229
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
37 changed files with 332 additions and 120 deletions

View File

@ -224,22 +224,23 @@ func runApp(args []string, outputBuffer io.Writer, pprof Server, c TelegrafConfi
filters := processFilterFlags(cCtx) filters := processFilterFlags(cCtx)
g := GlobalFlags{ g := GlobalFlags{
config: cCtx.StringSlice("config"), config: cCtx.StringSlice("config"),
configDir: cCtx.StringSlice("config-directory"), configDir: cCtx.StringSlice("config-directory"),
testWait: cCtx.Int("test-wait"), testWait: cCtx.Int("test-wait"),
configURLRetryAttempts: cCtx.Int("config-url-retry-attempts"), configURLRetryAttempts: cCtx.Int("config-url-retry-attempts"),
configURLWatchInterval: cCtx.Duration("config-url-watch-interval"), configURLWatchInterval: cCtx.Duration("config-url-watch-interval"),
watchConfig: cCtx.String("watch-config"), watchConfig: cCtx.String("watch-config"),
watchInterval: cCtx.Duration("watch-interval"), watchInterval: cCtx.Duration("watch-interval"),
pidFile: cCtx.String("pidfile"), pidFile: cCtx.String("pidfile"),
plugindDir: cCtx.String("plugin-directory"), plugindDir: cCtx.String("plugin-directory"),
password: cCtx.String("password"), password: cCtx.String("password"),
oldEnvBehavior: cCtx.Bool("old-env-behavior"), oldEnvBehavior: cCtx.Bool("old-env-behavior"),
test: cCtx.Bool("test"), printPluginConfigSource: cCtx.Bool("print-plugin-config-source"),
debug: cCtx.Bool("debug"), test: cCtx.Bool("test"),
once: cCtx.Bool("once"), debug: cCtx.Bool("debug"),
quiet: cCtx.Bool("quiet"), once: cCtx.Bool("once"),
unprotected: cCtx.Bool("unprotected"), quiet: cCtx.Bool("quiet"),
unprotected: cCtx.Bool("unprotected"),
} }
w := WindowFlags{ w := WindowFlags{
@ -308,6 +309,10 @@ func runApp(args []string, outputBuffer io.Writer, pprof Server, c TelegrafConfi
Name: "old-env-behavior", Name: "old-env-behavior",
Usage: "switch back to pre v1.27 environment replacement behavior", Usage: "switch back to pre v1.27 environment replacement behavior",
}, },
&cli.BoolFlag{
Name: "print-plugin-config-source",
Usage: "print the source for a given plugin",
},
&cli.BoolFlag{ &cli.BoolFlag{
Name: "once", Name: "once",
Usage: "run one gather and exit", Usage: "run one gather and exit",

View File

@ -34,22 +34,23 @@ import (
var stop chan struct{} var stop chan struct{}
type GlobalFlags struct { type GlobalFlags struct {
config []string config []string
configDir []string configDir []string
testWait int testWait int
configURLRetryAttempts int configURLRetryAttempts int
configURLWatchInterval time.Duration configURLWatchInterval time.Duration
watchConfig string watchConfig string
watchInterval time.Duration watchInterval time.Duration
pidFile string pidFile string
plugindDir string plugindDir string
password string password string
oldEnvBehavior bool oldEnvBehavior bool
test bool printPluginConfigSource bool
debug bool test bool
once bool debug bool
quiet bool once bool
unprotected bool quiet bool
unprotected bool
} }
type WindowFlags struct { type WindowFlags struct {
@ -105,6 +106,8 @@ func (t *Telegraf) Init(pprofErr <-chan error, f Filters, g GlobalFlags, w Windo
// Set environment replacement behavior // Set environment replacement behavior
config.OldEnvVarReplacement = g.oldEnvBehavior config.OldEnvVarReplacement = g.oldEnvBehavior
config.PrintPluginConfigSource = g.printPluginConfigSource
} }
func (t *Telegraf) ListSecretStores() ([]string, error) { func (t *Telegraf) ListSecretStores() ([]string, error) {
@ -389,14 +392,14 @@ func (t *Telegraf) runAgent(ctx context.Context, reloadConfig bool) error {
len(outputs.Outputs), len(outputs.Outputs),
len(secretstores.SecretStores), len(secretstores.SecretStores),
) )
log.Printf("I! Loaded inputs: %s", strings.Join(c.InputNames(), " ")) log.Printf("I! Loaded inputs: %s\n%s", strings.Join(c.InputNames(), " "), c.InputNamesWithSources())
log.Printf("I! Loaded aggregators: %s", strings.Join(c.AggregatorNames(), " ")) log.Printf("I! Loaded aggregators: %s\n%s", strings.Join(c.AggregatorNames(), " "), c.AggregatorNamesWithSources())
log.Printf("I! Loaded processors: %s", strings.Join(c.ProcessorNames(), " ")) log.Printf("I! Loaded processors: %s\n%s", strings.Join(c.ProcessorNames(), " "), c.ProcessorNamesWithSources())
log.Printf("I! Loaded secretstores: %s", strings.Join(c.SecretstoreNames(), " ")) log.Printf("I! Loaded secretstores: %s\n%s", strings.Join(c.SecretstoreNames(), " "), c.SecretstoreNamesWithSources())
if !t.once && (t.test || t.testWait != 0) { if !t.once && (t.test || t.testWait != 0) {
log.Print("W! " + color.RedString("Outputs are not used in testing mode!")) log.Print("W! " + color.RedString("Outputs are not used in testing mode!"))
} else { } else {
log.Printf("I! Loaded outputs: %s", strings.Join(c.OutputNames(), " ")) log.Printf("I! Loaded outputs: %s\n%s", strings.Join(c.OutputNames(), " "), c.OutputNamesWithSources())
} }
log.Printf("I! Tags enabled: %s", c.ListTags()) log.Printf("I! Tags enabled: %s", c.ListTags())

View File

@ -53,6 +53,9 @@ var (
// environment variable replacement behavior // environment variable replacement behavior
OldEnvVarReplacement = false OldEnvVarReplacement = false
// PrintPluginConfigSource is a switch to enable printing of plugin sources
PrintPluginConfigSource = false
// Password specified via command-line // Password specified via command-line
Password Secret Password Secret
@ -60,6 +63,8 @@ var (
telegrafVersion *semver.Version = semver.New("0.0.0-unknown") telegrafVersion *semver.Version = semver.New("0.0.0-unknown")
) )
const EmptySourcePath string = ""
// Config specifies the URL/user/password for the database that telegraf // Config specifies the URL/user/password for the database that telegraf
// will be logging to, as well as all the plugins that the user has // will be logging to, as well as all the plugins that the user has
// specified // specified
@ -74,7 +79,8 @@ type Config struct {
OutputFilters []string OutputFilters []string
SecretStoreFilters []string SecretStoreFilters []string
SecretStores map[string]telegraf.SecretStore SecretStores map[string]telegraf.SecretStore
secretStoreSource map[string][]string
Agent *AgentConfig Agent *AgentConfig
Inputs []*models.RunningInput Inputs []*models.RunningInput
@ -132,6 +138,7 @@ func NewConfig() *Config {
Processors: make([]*models.RunningProcessor, 0), Processors: make([]*models.RunningProcessor, 0),
AggProcessors: make([]*models.RunningProcessor, 0), AggProcessors: make([]*models.RunningProcessor, 0),
SecretStores: make(map[string]telegraf.SecretStore), SecretStores: make(map[string]telegraf.SecretStore),
secretStoreSource: make(map[string][]string),
fileProcessors: make([]*OrderedPlugin, 0), fileProcessors: make([]*OrderedPlugin, 0),
fileAggProcessors: make([]*OrderedPlugin, 0), fileAggProcessors: make([]*OrderedPlugin, 0),
InputFilters: make([]string, 0), InputFilters: make([]string, 0),
@ -303,6 +310,18 @@ func (c *Config) InputNames() []string {
return PluginNameCounts(name) return PluginNameCounts(name)
} }
// InputNamesWithSources returns a table representation of input names and their sources.
func (c *Config) InputNamesWithSources() string {
plugins := make(pluginNames, 0, len(c.Inputs))
for _, input := range c.Inputs {
plugins = append(plugins, pluginPrinter{
name: input.Config.Name,
source: input.Config.Source,
})
}
return getPluginSourcesTable(plugins)
}
// AggregatorNames returns a list of strings of the configured aggregators. // AggregatorNames returns a list of strings of the configured aggregators.
func (c *Config) AggregatorNames() []string { func (c *Config) AggregatorNames() []string {
name := make([]string, 0, len(c.Aggregators)) name := make([]string, 0, len(c.Aggregators))
@ -312,6 +331,18 @@ func (c *Config) AggregatorNames() []string {
return PluginNameCounts(name) return PluginNameCounts(name)
} }
// AggregatorNamesWithSources returns a table representation of aggregator names and their sources.
func (c *Config) AggregatorNamesWithSources() string {
plugins := make(pluginNames, 0, len(c.Aggregators))
for _, aggregator := range c.Aggregators {
plugins = append(plugins, pluginPrinter{
name: aggregator.Config.Name,
source: aggregator.Config.Source,
})
}
return getPluginSourcesTable(plugins)
}
// ProcessorNames returns a list of strings of the configured processors. // ProcessorNames returns a list of strings of the configured processors.
func (c *Config) ProcessorNames() []string { func (c *Config) ProcessorNames() []string {
name := make([]string, 0, len(c.Processors)) name := make([]string, 0, len(c.Processors))
@ -321,6 +352,18 @@ func (c *Config) ProcessorNames() []string {
return PluginNameCounts(name) return PluginNameCounts(name)
} }
// ProcessorNamesWithSources returns a table representation of processor names and their sources.
func (c *Config) ProcessorNamesWithSources() string {
plugins := make(pluginNames, 0, len(c.Processors))
for _, processor := range c.Processors {
plugins = append(plugins, pluginPrinter{
name: processor.Config.Name,
source: processor.Config.Source,
})
}
return getPluginSourcesTable(plugins)
}
// OutputNames returns a list of strings of the configured outputs. // OutputNames returns a list of strings of the configured outputs.
func (c *Config) OutputNames() []string { func (c *Config) OutputNames() []string {
name := make([]string, 0, len(c.Outputs)) name := make([]string, 0, len(c.Outputs))
@ -330,6 +373,18 @@ func (c *Config) OutputNames() []string {
return PluginNameCounts(name) return PluginNameCounts(name)
} }
// OutputNamesWithSources returns a table representation of output names and their sources.
func (c *Config) OutputNamesWithSources() string {
plugins := make(pluginNames, 0, len(c.Outputs))
for _, output := range c.Outputs {
plugins = append(plugins, pluginPrinter{
name: output.Config.Name,
source: output.Config.Source,
})
}
return getPluginSourcesTable(plugins)
}
// SecretstoreNames returns a list of strings of the configured secret-stores. // SecretstoreNames returns a list of strings of the configured secret-stores.
func (c *Config) SecretstoreNames() []string { func (c *Config) SecretstoreNames() []string {
names := make([]string, 0, len(c.SecretStores)) names := make([]string, 0, len(c.SecretStores))
@ -339,6 +394,21 @@ func (c *Config) SecretstoreNames() []string {
return PluginNameCounts(names) return PluginNameCounts(names)
} }
// SecretstoreNamesWithSources returns a table representation of secret store names and their sources.
func (c *Config) SecretstoreNamesWithSources() string {
plugins := make(pluginNames, 0, len(c.SecretStores))
for name, sources := range c.secretStoreSource {
for _, source := range sources {
plugins = append(plugins, pluginPrinter{
name: name,
source: source,
})
}
}
return getPluginSourcesTable(plugins)
}
// PluginNameCounts returns a string of plugin names and their counts.
// PluginNameCounts returns a list of sorted plugin names and their count // PluginNameCounts returns a list of sorted plugin names and their count
func PluginNameCounts(plugins []string) []string { func PluginNameCounts(plugins []string) []string {
names := make(map[string]int) names := make(map[string]int)
@ -475,7 +545,7 @@ func (c *Config) LoadConfig(path string) error {
return fmt.Errorf("loading config file %s failed: %w", path, err) return fmt.Errorf("loading config file %s failed: %w", path, err)
} }
if err = c.LoadConfigData(data); err != nil { if err = c.LoadConfigData(data, path); err != nil {
return fmt.Errorf("loading config file %s failed: %w", path, err) return fmt.Errorf("loading config file %s failed: %w", path, err)
} }
@ -511,8 +581,20 @@ func (c *Config) LoadAll(configFiles ...string) error {
return c.LinkSecrets() return c.LinkSecrets()
} }
type cfgDataOptions struct {
sourcePath string
}
type cfgDataOption func(*cfgDataOptions)
func WithSourcePath(path string) cfgDataOption {
return func(o *cfgDataOptions) {
o.sourcePath = path
}
}
// LoadConfigData loads TOML-formatted config data // LoadConfigData loads TOML-formatted config data
func (c *Config) LoadConfigData(data []byte) error { func (c *Config) LoadConfigData(data []byte, path string) error {
tbl, err := parseConfig(data) tbl, err := parseConfig(data)
if err != nil { if err != nil {
return fmt.Errorf("error parsing data: %w", err) return fmt.Errorf("error parsing data: %w", err)
@ -603,12 +685,12 @@ func (c *Config) LoadConfigData(data []byte) error {
switch pluginSubTable := pluginVal.(type) { switch pluginSubTable := pluginVal.(type) {
// legacy [outputs.influxdb] support // legacy [outputs.influxdb] support
case *ast.Table: case *ast.Table:
if err = c.addOutput(pluginName, pluginSubTable); err != nil { if err = c.addOutput(pluginName, path, pluginSubTable); err != nil {
return fmt.Errorf("error parsing %s, %w", pluginName, err) return fmt.Errorf("error parsing %s, %w", pluginName, err)
} }
case []*ast.Table: case []*ast.Table:
for _, t := range pluginSubTable { for _, t := range pluginSubTable {
if err = c.addOutput(pluginName, t); err != nil { if err = c.addOutput(pluginName, path, t); err != nil {
return fmt.Errorf("error parsing %s array, %w", pluginName, err) return fmt.Errorf("error parsing %s array, %w", pluginName, err)
} }
} }
@ -628,12 +710,12 @@ func (c *Config) LoadConfigData(data []byte) error {
switch pluginSubTable := pluginVal.(type) { switch pluginSubTable := pluginVal.(type) {
// legacy [inputs.cpu] support // legacy [inputs.cpu] support
case *ast.Table: case *ast.Table:
if err = c.addInput(pluginName, pluginSubTable); err != nil { if err = c.addInput(pluginName, path, pluginSubTable); err != nil {
return fmt.Errorf("error parsing %s, %w", pluginName, err) return fmt.Errorf("error parsing %s, %w", pluginName, err)
} }
case []*ast.Table: case []*ast.Table:
for _, t := range pluginSubTable { for _, t := range pluginSubTable {
if err = c.addInput(pluginName, t); err != nil { if err = c.addInput(pluginName, path, t); err != nil {
return fmt.Errorf("error parsing %s, %w", pluginName, err) return fmt.Errorf("error parsing %s, %w", pluginName, err)
} }
} }
@ -653,7 +735,7 @@ func (c *Config) LoadConfigData(data []byte) error {
switch pluginSubTable := pluginVal.(type) { switch pluginSubTable := pluginVal.(type) {
case []*ast.Table: case []*ast.Table:
for _, t := range pluginSubTable { for _, t := range pluginSubTable {
if err = c.addProcessor(pluginName, t); err != nil { if err = c.addProcessor(pluginName, path, t); err != nil {
return fmt.Errorf("error parsing %s, %w", pluginName, err) return fmt.Errorf("error parsing %s, %w", pluginName, err)
} }
} }
@ -677,7 +759,7 @@ func (c *Config) LoadConfigData(data []byte) error {
switch pluginSubTable := pluginVal.(type) { switch pluginSubTable := pluginVal.(type) {
case []*ast.Table: case []*ast.Table:
for _, t := range pluginSubTable { for _, t := range pluginSubTable {
if err = c.addAggregator(pluginName, t); err != nil { if err = c.addAggregator(pluginName, path, t); err != nil {
return fmt.Errorf("error parsing %s, %w", pluginName, err) return fmt.Errorf("error parsing %s, %w", pluginName, err)
} }
} }
@ -697,7 +779,7 @@ func (c *Config) LoadConfigData(data []byte) error {
switch pluginSubTable := pluginVal.(type) { switch pluginSubTable := pluginVal.(type) {
case []*ast.Table: case []*ast.Table:
for _, t := range pluginSubTable { for _, t := range pluginSubTable {
if err = c.addSecretStore(pluginName, t); err != nil { if err = c.addSecretStore(pluginName, path, t); err != nil {
return fmt.Errorf("error parsing %s, %w", pluginName, err) return fmt.Errorf("error parsing %s, %w", pluginName, err)
} }
} }
@ -714,7 +796,7 @@ func (c *Config) LoadConfigData(data []byte) error {
// Assume it's an input for legacy config file support if no other // Assume it's an input for legacy config file support if no other
// identifiers are present // identifiers are present
default: default:
if err = c.addInput(name, subTable); err != nil { if err = c.addInput(name, path, subTable); err != nil {
return fmt.Errorf("error parsing %s, %w", name, err) return fmt.Errorf("error parsing %s, %w", name, err)
} }
} }
@ -856,7 +938,7 @@ func parseConfig(contents []byte) (*ast.Table, error) {
return toml.Parse(outputBytes) return toml.Parse(outputBytes)
} }
func (c *Config) addAggregator(name string, table *ast.Table) error { func (c *Config) addAggregator(name, source string, table *ast.Table) error {
creator, ok := aggregators.Aggregators[name] creator, ok := aggregators.Aggregators[name]
if !ok { if !ok {
// Handle removed, deprecated plugins // Handle removed, deprecated plugins
@ -868,7 +950,7 @@ func (c *Config) addAggregator(name string, table *ast.Table) error {
} }
aggregator := creator() aggregator := creator()
conf, err := c.buildAggregator(name, table) conf, err := c.buildAggregator(name, source, table)
if err != nil { if err != nil {
return err return err
} }
@ -885,7 +967,7 @@ func (c *Config) addAggregator(name string, table *ast.Table) error {
return nil return nil
} }
func (c *Config) addSecretStore(name string, table *ast.Table) error { func (c *Config) addSecretStore(name, source string, table *ast.Table) error {
if len(c.SecretStoreFilters) > 0 && !sliceContains(name, c.SecretStoreFilters) { if len(c.SecretStoreFilters) > 0 && !sliceContains(name, c.SecretStoreFilters) {
return nil return nil
} }
@ -928,6 +1010,10 @@ func (c *Config) addSecretStore(name string, table *ast.Table) error {
return fmt.Errorf("duplicate ID %q for secretstore %q", storeID, name) return fmt.Errorf("duplicate ID %q for secretstore %q", storeID, name)
} }
c.SecretStores[storeID] = store c.SecretStores[storeID] = store
if _, found := c.secretStoreSource[name]; !found {
c.secretStoreSource[name] = make([]string, 0)
}
c.secretStoreSource[name] = append(c.secretStoreSource[name], source)
return nil return nil
} }
@ -1057,7 +1143,7 @@ func (c *Config) addSerializer(parentname string, table *ast.Table) (*models.Run
return running, err return running, err
} }
func (c *Config) addProcessor(name string, table *ast.Table) error { func (c *Config) addProcessor(name, source string, table *ast.Table) error {
creator, ok := processors.Processors[name] creator, ok := processors.Processors[name]
if !ok { if !ok {
// Handle removed, deprecated plugins // Handle removed, deprecated plugins
@ -1080,7 +1166,7 @@ func (c *Config) addProcessor(name string, table *ast.Table) error {
defer c.resetMissingTomlFieldTracker() defer c.resetMissingTomlFieldTracker()
// Set up the processor running before the aggregators // Set up the processor running before the aggregators
processorBeforeConfig, err := c.buildProcessor("processors", name, table) processorBeforeConfig, err := c.buildProcessor("processors", name, source, table)
if err != nil { if err != nil {
return err return err
} }
@ -1092,7 +1178,7 @@ func (c *Config) addProcessor(name string, table *ast.Table) error {
c.fileProcessors = append(c.fileProcessors, &OrderedPlugin{table.Line, rf}) c.fileProcessors = append(c.fileProcessors, &OrderedPlugin{table.Line, rf})
// Setup another (new) processor instance running after the aggregator // Setup another (new) processor instance running after the aggregator
processorAfterConfig, err := c.buildProcessor("aggprocessors", name, table) processorAfterConfig, err := c.buildProcessor("aggprocessors", name, source, table)
if err != nil { if err != nil {
return err return err
} }
@ -1180,7 +1266,7 @@ func (c *Config) setupProcessor(name string, creator processors.StreamingCreator
return streamingProcessor, optionTestCount, err return streamingProcessor, optionTestCount, err
} }
func (c *Config) addOutput(name string, table *ast.Table) error { func (c *Config) addOutput(name, source string, table *ast.Table) error {
if len(c.OutputFilters) > 0 && !sliceContains(name, c.OutputFilters) { if len(c.OutputFilters) > 0 && !sliceContains(name, c.OutputFilters) {
return nil return nil
} }
@ -1228,7 +1314,7 @@ func (c *Config) addOutput(name string, table *ast.Table) error {
}) })
} }
outputConfig, err := c.buildOutput(name, table) outputConfig, err := c.buildOutput(name, source, table)
if err != nil { if err != nil {
return err return err
} }
@ -1263,7 +1349,7 @@ func (c *Config) addOutput(name string, table *ast.Table) error {
return nil return nil
} }
func (c *Config) addInput(name string, table *ast.Table) error { func (c *Config) addInput(name, source string, table *ast.Table) error {
if len(c.InputFilters) > 0 && !sliceContains(name, c.InputFilters) { if len(c.InputFilters) > 0 && !sliceContains(name, c.InputFilters) {
return nil return nil
} }
@ -1312,7 +1398,7 @@ func (c *Config) addInput(name string, table *ast.Table) error {
}) })
} }
pluginConfig, err := c.buildInput(name, table) pluginConfig, err := c.buildInput(name, source, table)
if err != nil { if err != nil {
return err return err
} }
@ -1351,9 +1437,10 @@ func (c *Config) addInput(name string, table *ast.Table) error {
// buildAggregator parses Aggregator specific items from the ast.Table, // buildAggregator parses Aggregator specific items from the ast.Table,
// builds the filter and returns a // builds the filter and returns a
// models.AggregatorConfig to be inserted into models.RunningAggregator // models.AggregatorConfig to be inserted into models.RunningAggregator
func (c *Config) buildAggregator(name string, tbl *ast.Table) (*models.AggregatorConfig, error) { func (c *Config) buildAggregator(name, source string, tbl *ast.Table) (*models.AggregatorConfig, error) {
conf := &models.AggregatorConfig{ conf := &models.AggregatorConfig{
Name: name, Name: name,
Source: source,
Delay: time.Millisecond * 100, Delay: time.Millisecond * 100,
Period: time.Second * 30, Period: time.Second * 30,
Grace: time.Second * 0, Grace: time.Second * 0,
@ -1403,8 +1490,11 @@ func (c *Config) buildAggregator(name string, tbl *ast.Table) (*models.Aggregato
// buildProcessor parses Processor specific items from the ast.Table, // buildProcessor parses Processor specific items from the ast.Table,
// builds the filter and returns a // builds the filter and returns a
// models.ProcessorConfig to be inserted into models.RunningProcessor // models.ProcessorConfig to be inserted into models.RunningProcessor
func (c *Config) buildProcessor(category, name string, tbl *ast.Table) (*models.ProcessorConfig, error) { func (c *Config) buildProcessor(category, name, source string, tbl *ast.Table) (*models.ProcessorConfig, error) {
conf := &models.ProcessorConfig{Name: name} conf := &models.ProcessorConfig{
Name: name,
Source: source,
}
conf.Order = c.getFieldInt64(tbl, "order") conf.Order = c.getFieldInt64(tbl, "order")
conf.Alias = c.getFieldString(tbl, "alias") conf.Alias = c.getFieldString(tbl, "alias")
@ -1509,9 +1599,10 @@ func (c *Config) buildFilter(plugin string, tbl *ast.Table) (models.Filter, erro
// buildInput parses input specific items from the ast.Table, // buildInput parses input specific items from the ast.Table,
// builds the filter and returns a // builds the filter and returns a
// models.InputConfig to be inserted into models.RunningInput // models.InputConfig to be inserted into models.RunningInput
func (c *Config) buildInput(name string, tbl *ast.Table) (*models.InputConfig, error) { func (c *Config) buildInput(name, source string, tbl *ast.Table) (*models.InputConfig, error) {
cp := &models.InputConfig{ cp := &models.InputConfig{
Name: name, Name: name,
Source: source,
AlwaysIncludeLocalTags: c.Agent.AlwaysIncludeLocalTags, AlwaysIncludeLocalTags: c.Agent.AlwaysIncludeLocalTags,
AlwaysIncludeGlobalTags: c.Agent.AlwaysIncludeGlobalTags, AlwaysIncludeGlobalTags: c.Agent.AlwaysIncludeGlobalTags,
} }
@ -1556,13 +1647,14 @@ func (c *Config) buildInput(name string, tbl *ast.Table) (*models.InputConfig, e
// builds the filter and returns a // builds the filter and returns a
// models.OutputConfig to be inserted into models.RunningInput // models.OutputConfig to be inserted into models.RunningInput
// Note: error exists in the return for future calls that might require error // Note: error exists in the return for future calls that might require error
func (c *Config) buildOutput(name string, tbl *ast.Table) (*models.OutputConfig, error) { func (c *Config) buildOutput(name, source string, tbl *ast.Table) (*models.OutputConfig, error) {
filter, err := c.buildFilter("outputs."+name, tbl) filter, err := c.buildFilter("outputs."+name, tbl)
if err != nil { if err != nil {
return nil, err return nil, err
} }
oc := &models.OutputConfig{ oc := &models.OutputConfig{
Name: name, Name: name,
Source: source,
Filter: filter, Filter: filter,
BufferStrategy: c.Agent.BufferStrategy, BufferStrategy: c.Agent.BufferStrategy,
BufferDirectory: c.Agent.BufferDirectory, BufferDirectory: c.Agent.BufferDirectory,

View File

@ -70,7 +70,8 @@ func TestConfig_LoadSingleInputWithEnvVars(t *testing.T) {
c := config.NewConfig() c := config.NewConfig()
t.Setenv("MY_TEST_SERVER", "192.168.1.1") t.Setenv("MY_TEST_SERVER", "192.168.1.1")
t.Setenv("TEST_INTERVAL", "10s") t.Setenv("TEST_INTERVAL", "10s")
require.NoError(t, c.LoadConfig("./testdata/single_plugin_env_vars.toml")) confFile := filepath.Join("testdata", "single_plugin_env_vars.toml")
require.NoError(t, c.LoadConfig(confFile))
input := inputs.Inputs["memcached"]().(*MockupInputPlugin) input := inputs.Inputs["memcached"]().(*MockupInputPlugin)
input.Servers = []string{"192.168.1.1"} input.Servers = []string{"192.168.1.1"}
@ -98,6 +99,7 @@ func TestConfig_LoadSingleInputWithEnvVars(t *testing.T) {
require.NoError(t, filter.Compile()) require.NoError(t, filter.Compile())
inputConfig := &models.InputConfig{ inputConfig := &models.InputConfig{
Name: "memcached", Name: "memcached",
Source: confFile,
Filter: filter, Filter: filter,
Interval: 10 * time.Second, Interval: 10 * time.Second,
} }
@ -113,7 +115,8 @@ func TestConfig_LoadSingleInputWithEnvVars(t *testing.T) {
func TestConfig_LoadSingleInput(t *testing.T) { func TestConfig_LoadSingleInput(t *testing.T) {
c := config.NewConfig() c := config.NewConfig()
require.NoError(t, c.LoadConfig("./testdata/single_plugin.toml")) confFile := filepath.Join("testdata", "single_plugin.toml")
require.NoError(t, c.LoadConfig(confFile))
input := inputs.Inputs["memcached"]().(*MockupInputPlugin) input := inputs.Inputs["memcached"]().(*MockupInputPlugin)
input.Servers = []string{"localhost"} input.Servers = []string{"localhost"}
@ -139,6 +142,7 @@ func TestConfig_LoadSingleInput(t *testing.T) {
require.NoError(t, filter.Compile()) require.NoError(t, filter.Compile())
inputConfig := &models.InputConfig{ inputConfig := &models.InputConfig{
Name: "memcached", Name: "memcached",
Source: confFile,
Filter: filter, Filter: filter,
Interval: 5 * time.Second, Interval: 5 * time.Second,
} }
@ -154,7 +158,8 @@ func TestConfig_LoadSingleInput(t *testing.T) {
func TestConfig_LoadSingleInput_WithSeparators(t *testing.T) { func TestConfig_LoadSingleInput_WithSeparators(t *testing.T) {
c := config.NewConfig() c := config.NewConfig()
require.NoError(t, c.LoadConfig("./testdata/single_plugin_with_separators.toml")) confFile := filepath.Join("testdata", "single_plugin_with_separators.toml")
require.NoError(t, c.LoadConfig(confFile))
input := inputs.Inputs["memcached"]().(*MockupInputPlugin) input := inputs.Inputs["memcached"]().(*MockupInputPlugin)
input.Servers = []string{"localhost"} input.Servers = []string{"localhost"}
@ -182,6 +187,7 @@ func TestConfig_LoadSingleInput_WithSeparators(t *testing.T) {
require.NoError(t, filter.Compile()) require.NoError(t, filter.Compile())
inputConfig := &models.InputConfig{ inputConfig := &models.InputConfig{
Name: "memcached", Name: "memcached",
Source: confFile,
Filter: filter, Filter: filter,
Interval: 5 * time.Second, Interval: 5 * time.Second,
} }
@ -208,7 +214,8 @@ func TestConfig_LoadDirectory(t *testing.T) {
c := config.NewConfig() c := config.NewConfig()
files, err := config.WalkDirectory("./testdata/subconfig") files, err := config.WalkDirectory("./testdata/subconfig")
files = append([]string{"./testdata/single_plugin.toml"}, files...) confFile := filepath.Join("testdata", "single_plugin.toml")
files = append([]string{confFile}, files...)
require.NoError(t, err) require.NoError(t, err)
require.NoError(t, c.LoadAll(files...)) require.NoError(t, c.LoadAll(files...))
@ -240,6 +247,7 @@ func TestConfig_LoadDirectory(t *testing.T) {
require.NoError(t, filterMockup.Compile()) require.NoError(t, filterMockup.Compile())
expectedConfigs[0] = &models.InputConfig{ expectedConfigs[0] = &models.InputConfig{
Name: "memcached", Name: "memcached",
Source: confFile,
Filter: filterMockup, Filter: filterMockup,
Interval: 5 * time.Second, Interval: 5 * time.Second,
} }
@ -256,6 +264,7 @@ func TestConfig_LoadDirectory(t *testing.T) {
expectedPlugins[1].Command = "/usr/bin/myothercollector --foo=bar" expectedPlugins[1].Command = "/usr/bin/myothercollector --foo=bar"
expectedConfigs[1] = &models.InputConfig{ expectedConfigs[1] = &models.InputConfig{
Name: "exec", Name: "exec",
Source: filepath.Join("testdata", "subconfig", "exec.conf"), // This is the source of the input
MeasurementSuffix: "_myothercollector", MeasurementSuffix: "_myothercollector",
} }
expectedConfigs[1].Tags = make(map[string]string) expectedConfigs[1].Tags = make(map[string]string)
@ -284,6 +293,7 @@ func TestConfig_LoadDirectory(t *testing.T) {
require.NoError(t, filterMemcached.Compile()) require.NoError(t, filterMemcached.Compile())
expectedConfigs[2] = &models.InputConfig{ expectedConfigs[2] = &models.InputConfig{
Name: "memcached", Name: "memcached",
Source: filepath.Join("testdata", "subconfig", "memcached.conf"), // This is the source of the input
Filter: filterMemcached, Filter: filterMemcached,
Interval: 5 * time.Second, Interval: 5 * time.Second,
} }
@ -291,7 +301,10 @@ func TestConfig_LoadDirectory(t *testing.T) {
expectedPlugins[3] = inputs.Inputs["procstat"]().(*MockupInputPlugin) expectedPlugins[3] = inputs.Inputs["procstat"]().(*MockupInputPlugin)
expectedPlugins[3].PidFile = "/var/run/grafana-server.pid" expectedPlugins[3].PidFile = "/var/run/grafana-server.pid"
expectedConfigs[3] = &models.InputConfig{Name: "procstat"} expectedConfigs[3] = &models.InputConfig{
Name: "procstat",
Source: filepath.Join("testdata", "subconfig", "procstat.conf"), // This is the source of the input
}
expectedConfigs[3].Tags = make(map[string]string) expectedConfigs[3].Tags = make(map[string]string)
// Check the generated plugins // Check the generated plugins

82
config/plugin_printer.go Normal file
View File

@ -0,0 +1,82 @@
package config
import (
"bytes"
"fmt"
"sort"
"strings"
"github.com/jedib0t/go-pretty/v6/table"
)
var headers = []string{"Name", "Source(s)"}
type pluginPrinter struct {
name string
source string
}
type pluginNames []pluginPrinter
func getPluginSourcesTable(pluginNames []pluginPrinter) string {
if !PrintPluginConfigSource {
return ""
}
data := make([][]any, 0, len(pluginNames))
rows := make(map[string][]string)
for _, plugin := range pluginNames {
if _, ok := rows[plugin.name]; !ok {
rows[plugin.name] = make([]string, 0)
}
rows[plugin.name] = append(rows[plugin.name], plugin.source)
}
for name, sources := range rows {
var nameCountStr string
if len(sources) > 1 {
nameCountStr = fmt.Sprintf("%s (%dx)", name, len(sources))
} else {
nameCountStr = name
}
data = append(data, []any{nameCountStr, sources})
}
sort.Slice(data, func(i, j int) bool {
return len(data[i][1].([]string)) > len(data[j][1].([]string))
})
return getTableString(headers, data)
}
func getTableString(headers []string, data [][]any) string {
buff := new(bytes.Buffer)
t := table.NewWriter()
t.SetOutputMirror(buff)
t.AppendHeader(convertToRow(headers))
// Append rows
for _, row := range data {
processedRow := make([]interface{}, len(row))
for i, col := range row {
switch v := col.(type) {
case []string: // Convert slices to multi-line strings
processedRow[i] = strings.Join(v, "\n")
default:
processedRow[i] = v
}
}
t.AppendRow(processedRow)
}
t.Style().Options.SeparateRows = true
return t.Render()
}
// Helper function to convert headers to table.Row
func convertToRow(data []string) table.Row {
row := make(table.Row, len(data))
for i, val := range data {
row[i] = val
}
return row
}

View File

@ -151,7 +151,7 @@ func TestSecretConstant(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
c := NewConfig() c := NewConfig()
require.NoError(t, c.LoadConfigData(tt.cfg)) require.NoError(t, c.LoadConfigData(tt.cfg, EmptySourcePath))
require.Len(t, c.Inputs, 1) require.Len(t, c.Inputs, 1)
// Create a mockup secretstore // Create a mockup secretstore
@ -302,7 +302,7 @@ func TestSecretUnquote(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
c := NewConfig() c := NewConfig()
require.NoError(t, c.LoadConfigData(tt.cfg)) require.NoError(t, c.LoadConfigData(tt.cfg, EmptySourcePath))
require.Len(t, c.Inputs, 1) require.Len(t, c.Inputs, 1)
// Create a mockup secretstore // Create a mockup secretstore
@ -331,7 +331,7 @@ func TestSecretEnvironmentVariable(t *testing.T) {
t.Setenv("SOME_ENV_SECRET", "an env secret") t.Setenv("SOME_ENV_SECRET", "an env secret")
c := NewConfig() c := NewConfig()
err := c.LoadConfigData(cfg) err := c.LoadConfigData(cfg, EmptySourcePath)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, c.Inputs, 1) require.Len(t, c.Inputs, 1)
@ -364,7 +364,7 @@ func TestSecretCount(t *testing.T) {
`) `)
c := NewConfig() c := NewConfig()
require.NoError(t, c.LoadConfigData(cfg)) require.NoError(t, c.LoadConfigData(cfg, EmptySourcePath))
require.Len(t, c.Inputs, 3) require.Len(t, c.Inputs, 3)
require.Equal(t, int64(2), secretCount.Load()) require.Equal(t, int64(2), secretCount.Load())
@ -390,7 +390,7 @@ func TestSecretStoreStatic(t *testing.T) {
`) `)
c := NewConfig() c := NewConfig()
err := c.LoadConfigData(cfg) err := c.LoadConfigData(cfg, EmptySourcePath)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, c.Inputs, 4) require.Len(t, c.Inputs, 4)
@ -431,7 +431,7 @@ func TestSecretStoreInvalidKeys(t *testing.T) {
`) `)
c := NewConfig() c := NewConfig()
err := c.LoadConfigData(cfg) err := c.LoadConfigData(cfg, EmptySourcePath)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, c.Inputs, 4) require.Len(t, c.Inputs, 4)
@ -469,7 +469,7 @@ func TestSecretStoreDeclarationMissingID(t *testing.T) {
cfg := []byte(`[[secretstores.mockup]]`) cfg := []byte(`[[secretstores.mockup]]`)
c := NewConfig() c := NewConfig()
err := c.LoadConfigData(cfg) err := c.LoadConfigData(cfg, EmptySourcePath)
require.ErrorContains(t, err, `error parsing mockup, "mockup" secret-store without ID`) require.ErrorContains(t, err, `error parsing mockup, "mockup" secret-store without ID`)
} }
@ -485,7 +485,7 @@ func TestSecretStoreDeclarationInvalidID(t *testing.T) {
t.Run(id, func(t *testing.T) { t.Run(id, func(t *testing.T) {
cfg := []byte(fmt.Sprintf(tmpl, id)) cfg := []byte(fmt.Sprintf(tmpl, id))
c := NewConfig() c := NewConfig()
err := c.LoadConfigData(cfg) err := c.LoadConfigData(cfg, EmptySourcePath)
require.ErrorContains(t, err, `error parsing mockup, invalid secret-store ID`) require.ErrorContains(t, err, `error parsing mockup, invalid secret-store ID`)
}) })
} }
@ -503,7 +503,7 @@ func TestSecretStoreDeclarationValidID(t *testing.T) {
t.Run(id, func(t *testing.T) { t.Run(id, func(t *testing.T) {
cfg := []byte(fmt.Sprintf(tmpl, id)) cfg := []byte(fmt.Sprintf(tmpl, id))
c := NewConfig() c := NewConfig()
err := c.LoadConfigData(cfg) err := c.LoadConfigData(cfg, EmptySourcePath)
require.NoError(t, err) require.NoError(t, err)
}) })
} }
@ -555,7 +555,7 @@ func (tsuite *SecretImplTestSuite) TestSecretStoreInvalidReference() {
`) `)
c := NewConfig() c := NewConfig()
require.NoError(t, c.LoadConfigData(cfg)) require.NoError(t, c.LoadConfigData(cfg, EmptySourcePath))
require.Len(t, c.Inputs, 1) require.Len(t, c.Inputs, 1)
// Create a mockup secretstore // Create a mockup secretstore
@ -585,7 +585,7 @@ func (tsuite *SecretImplTestSuite) TestSecretStoreStaticChanging() {
`) `)
c := NewConfig() c := NewConfig()
err := c.LoadConfigData(cfg) err := c.LoadConfigData(cfg, EmptySourcePath)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, c.Inputs, 1) require.Len(t, c.Inputs, 1)
@ -627,7 +627,7 @@ func (tsuite *SecretImplTestSuite) TestSecretStoreDynamic() {
`) `)
c := NewConfig() c := NewConfig()
err := c.LoadConfigData(cfg) err := c.LoadConfigData(cfg, EmptySourcePath)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, c.Inputs, 1) require.Len(t, c.Inputs, 1)
@ -661,7 +661,7 @@ func (tsuite *SecretImplTestSuite) TestSecretSet() {
secret = "a secret" secret = "a secret"
`) `)
c := NewConfig() c := NewConfig()
require.NoError(t, c.LoadConfigData(cfg)) require.NoError(t, c.LoadConfigData(cfg, EmptySourcePath))
require.Len(t, c.Inputs, 1) require.Len(t, c.Inputs, 1)
require.NoError(t, c.LinkSecrets()) require.NoError(t, c.LinkSecrets())
@ -686,7 +686,7 @@ func (tsuite *SecretImplTestSuite) TestSecretSetResolve() {
secret = "@{mock:secret}" secret = "@{mock:secret}"
`) `)
c := NewConfig() c := NewConfig()
require.NoError(t, c.LoadConfigData(cfg)) require.NoError(t, c.LoadConfigData(cfg, EmptySourcePath))
require.Len(t, c.Inputs, 1) require.Len(t, c.Inputs, 1)
// Create a mockup secretstore // Create a mockup secretstore
@ -720,7 +720,7 @@ func (tsuite *SecretImplTestSuite) TestSecretSetResolveInvalid() {
secret = "@{mock:secret}" secret = "@{mock:secret}"
`) `)
c := NewConfig() c := NewConfig()
require.NoError(t, c.LoadConfigData(cfg)) require.NoError(t, c.LoadConfigData(cfg, EmptySourcePath))
require.Len(t, c.Inputs, 1) require.Len(t, c.Inputs, 1)
// Create a mockup secretstore // Create a mockup secretstore
@ -757,7 +757,7 @@ func (tsuite *SecretImplTestSuite) TestSecretInvalidWarn() {
secret = "server=a user=@{mock:secret-with-invalid-chars} pass=@{mock:secret_pass}" secret = "server=a user=@{mock:secret-with-invalid-chars} pass=@{mock:secret_pass}"
`) `)
c := NewConfig() c := NewConfig()
require.NoError(t, c.LoadConfigData(cfg)) require.NoError(t, c.LoadConfigData(cfg, EmptySourcePath))
require.Len(t, c.Inputs, 1) require.Len(t, c.Inputs, 1)
require.Contains(t, buf.String(), `W! Secret "@{mock:secret-with-invalid-chars}" contains invalid character(s)`) require.Contains(t, buf.String(), `W! Secret "@{mock:secret-with-invalid-chars}" contains invalid character(s)`)

View File

@ -23,7 +23,7 @@ func TestConfigDuration(t *testing.T) {
[[processors.reverse_dns.lookup]] [[processors.reverse_dns.lookup]]
field = "source_ip" field = "source_ip"
dest = "source_name" dest = "source_name"
`)) `), config.EmptySourcePath)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, c.Processors, 1) require.Len(t, c.Processors, 1)
p := c.Processors[0].Processor.(*reverse_dns.ReverseDNS) p := c.Processors[0].Processor.(*reverse_dns.ReverseDNS)
@ -121,7 +121,7 @@ func TestTOMLParsingStringDurations(t *testing.T) {
// Load the data // Load the data
c := config.NewConfig() c := config.NewConfig()
err := c.LoadConfigData(cfg) err := c.LoadConfigData(cfg, config.EmptySourcePath)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, c.Inputs, 1) require.Len(t, c.Inputs, 1)
plugin := c.Inputs[0].Input.(*MockupTypesPlugin) plugin := c.Inputs[0].Input.(*MockupTypesPlugin)
@ -151,7 +151,7 @@ func TestTOMLParsingIntegerDurations(t *testing.T) {
// Load the data // Load the data
c := config.NewConfig() c := config.NewConfig()
err := c.LoadConfigData(cfg) err := c.LoadConfigData(cfg, config.EmptySourcePath)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, c.Inputs, 1) require.Len(t, c.Inputs, 1)
plugin := c.Inputs[0].Input.(*MockupTypesPlugin) plugin := c.Inputs[0].Input.(*MockupTypesPlugin)
@ -179,7 +179,7 @@ func TestTOMLParsingFloatDurations(t *testing.T) {
// Load the data // Load the data
c := config.NewConfig() c := config.NewConfig()
err := c.LoadConfigData(cfg) err := c.LoadConfigData(cfg, config.EmptySourcePath)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, c.Inputs, 1) require.Len(t, c.Inputs, 1)
plugin := c.Inputs[0].Input.(*MockupTypesPlugin) plugin := c.Inputs[0].Input.(*MockupTypesPlugin)
@ -217,7 +217,7 @@ func TestTOMLParsingStringSizes(t *testing.T) {
// Load the data // Load the data
c := config.NewConfig() c := config.NewConfig()
err := c.LoadConfigData(cfg) err := c.LoadConfigData(cfg, config.EmptySourcePath)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, c.Inputs, 1) require.Len(t, c.Inputs, 1)
plugin := c.Inputs[0].Input.(*MockupTypesPlugin) plugin := c.Inputs[0].Input.(*MockupTypesPlugin)
@ -249,7 +249,7 @@ func TestTOMLParsingIntegerSizes(t *testing.T) {
// Load the data // Load the data
c := config.NewConfig() c := config.NewConfig()
err := c.LoadConfigData(cfg) err := c.LoadConfigData(cfg, config.EmptySourcePath)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, c.Inputs, 1) require.Len(t, c.Inputs, 1)
plugin := c.Inputs[0].Input.(*MockupTypesPlugin) plugin := c.Inputs[0].Input.(*MockupTypesPlugin)

View File

@ -236,6 +236,7 @@ following works:
- github.com/jcmturner/goidentity [Apache License 2.0](https://github.com/jcmturner/goidentity/blob/master/LICENSE) - github.com/jcmturner/goidentity [Apache License 2.0](https://github.com/jcmturner/goidentity/blob/master/LICENSE)
- github.com/jcmturner/gokrb5 [Apache License 2.0](https://github.com/jcmturner/gokrb5/blob/master/LICENSE) - github.com/jcmturner/gokrb5 [Apache License 2.0](https://github.com/jcmturner/gokrb5/blob/master/LICENSE)
- github.com/jcmturner/rpc [Apache License 2.0](https://github.com/jcmturner/rpc/blob/master/LICENSE) - github.com/jcmturner/rpc [Apache License 2.0](https://github.com/jcmturner/rpc/blob/master/LICENSE)
- github.com/jedib0t/go-pretty [MIT License](https://github.com/jedib0t/go-pretty/blob/main/LICENSE)
- github.com/jeremywohl/flatten [MIT License](https://github.com/jeremywohl/flatten/blob/master/LICENSE) - github.com/jeremywohl/flatten [MIT License](https://github.com/jeremywohl/flatten/blob/master/LICENSE)
- github.com/jhump/protoreflect [Apache License 2.0](https://github.com/jhump/protoreflect/blob/master/LICENSE) - github.com/jhump/protoreflect [Apache License 2.0](https://github.com/jhump/protoreflect/blob/master/LICENSE)
- github.com/jmespath/go-jmespath [Apache License 2.0](https://github.com/jmespath/go-jmespath/blob/master/LICENSE) - github.com/jmespath/go-jmespath [Apache License 2.0](https://github.com/jmespath/go-jmespath/blob/master/LICENSE)
@ -262,6 +263,7 @@ following works:
- github.com/mattn/go-colorable [MIT License](https://github.com/mattn/go-colorable/blob/master/LICENSE) - github.com/mattn/go-colorable [MIT License](https://github.com/mattn/go-colorable/blob/master/LICENSE)
- github.com/mattn/go-ieproxy [MIT License](https://github.com/mattn/go-ieproxy/blob/master/LICENSE) - github.com/mattn/go-ieproxy [MIT License](https://github.com/mattn/go-ieproxy/blob/master/LICENSE)
- github.com/mattn/go-isatty [MIT License](https://github.com/mattn/go-isatty/blob/master/LICENSE) - github.com/mattn/go-isatty [MIT License](https://github.com/mattn/go-isatty/blob/master/LICENSE)
- github.com/mattn/go-runewidth [MIT License](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
- github.com/mdlayher/apcupsd [MIT License](https://github.com/mdlayher/apcupsd/blob/master/LICENSE.md) - github.com/mdlayher/apcupsd [MIT License](https://github.com/mdlayher/apcupsd/blob/master/LICENSE.md)
- github.com/mdlayher/genetlink [MIT License](https://github.com/mdlayher/genetlink/blob/master/LICENSE.md) - github.com/mdlayher/genetlink [MIT License](https://github.com/mdlayher/genetlink/blob/master/LICENSE.md)
- github.com/mdlayher/netlink [MIT License](https://github.com/mdlayher/netlink/blob/master/LICENSE.md) - github.com/mdlayher/netlink [MIT License](https://github.com/mdlayher/netlink/blob/master/LICENSE.md)
@ -336,6 +338,7 @@ following works:
- github.com/remyoudompheng/bigfft [BSD 3-Clause "New" or "Revised" License](https://github.com/remyoudompheng/bigfft/blob/master/LICENSE) - github.com/remyoudompheng/bigfft [BSD 3-Clause "New" or "Revised" License](https://github.com/remyoudompheng/bigfft/blob/master/LICENSE)
- github.com/rfjakob/eme [MIT License](https://github.com/rfjakob/eme/blob/master/LICENSE) - github.com/rfjakob/eme [MIT License](https://github.com/rfjakob/eme/blob/master/LICENSE)
- github.com/riemann/riemann-go-client [MIT License](https://github.com/riemann/riemann-go-client/blob/master/LICENSE) - github.com/riemann/riemann-go-client [MIT License](https://github.com/riemann/riemann-go-client/blob/master/LICENSE)
- github.com/rivo/uniseg [MIT License](https://github.com/rivo/uniseg/blob/master/LICENSE.txt)
- github.com/robbiet480/go.nut [MIT License](https://github.com/robbiet480/go.nut/blob/master/LICENSE) - github.com/robbiet480/go.nut [MIT License](https://github.com/robbiet480/go.nut/blob/master/LICENSE)
- github.com/robinson/gos7 [BSD 3-Clause "New" or "Revised" License](https://github.com/robinson/gos7/blob/master/LICENSE) - github.com/robinson/gos7 [BSD 3-Clause "New" or "Revised" License](https://github.com/robinson/gos7/blob/master/LICENSE)
- github.com/russross/blackfriday [BSD 2-Clause "Simplified" License](https://github.com/russross/blackfriday/blob/master/LICENSE.txt) - github.com/russross/blackfriday [BSD 2-Clause "Simplified" License](https://github.com/russross/blackfriday/blob/master/LICENSE.txt)

3
go.mod
View File

@ -124,6 +124,7 @@ require (
github.com/jackc/pgio v1.0.0 github.com/jackc/pgio v1.0.0
github.com/jackc/pgtype v1.14.4 github.com/jackc/pgtype v1.14.4
github.com/jackc/pgx/v4 v4.18.3 github.com/jackc/pgx/v4 v4.18.3
github.com/jedib0t/go-pretty/v6 v6.6.5
github.com/jeremywohl/flatten/v2 v2.0.0-20211013061545-07e4a09fb8e4 github.com/jeremywohl/flatten/v2 v2.0.0-20211013061545-07e4a09fb8e4
github.com/jhump/protoreflect v1.16.0 github.com/jhump/protoreflect v1.16.0
github.com/jmespath/go-jmespath v0.4.0 github.com/jmespath/go-jmespath v0.4.0
@ -408,6 +409,7 @@ require (
github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-ieproxy v0.0.11 // indirect github.com/mattn/go-ieproxy v0.0.11 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
github.com/mdlayher/genetlink v1.2.0 // indirect github.com/mdlayher/genetlink v1.2.0 // indirect
github.com/mdlayher/netlink v1.7.2 // indirect github.com/mdlayher/netlink v1.7.2 // indirect
github.com/mdlayher/socket v0.5.1 // indirect github.com/mdlayher/socket v0.5.1 // indirect
@ -455,6 +457,7 @@ require (
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/rfjakob/eme v1.1.2 // indirect github.com/rfjakob/eme v1.1.2 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/robertkrimen/otto v0.0.0-20191219234010-c382bd3c16ff // indirect github.com/robertkrimen/otto v0.0.0-20191219234010-c382bd3c16ff // indirect
github.com/robfig/cron/v3 v3.0.1 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect

7
go.sum
View File

@ -1686,6 +1686,8 @@ github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh6
github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs=
github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY=
github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc=
github.com/jedib0t/go-pretty/v6 v6.6.5 h1:9PgMJOVBedpgYLI56jQRJYqngxYAAzfEUua+3NgSqAo=
github.com/jedib0t/go-pretty/v6 v6.6.5/go.mod h1:Uq/HrbhuFty5WSVNfjpQQe47x16RwVGXIveNGEyGtHs=
github.com/jeremija/gosubmit v0.2.7 h1:At0OhGCFGPXyjPYAsCchoBUhE099pcBXmsb4iZqROIc= github.com/jeremija/gosubmit v0.2.7 h1:At0OhGCFGPXyjPYAsCchoBUhE099pcBXmsb4iZqROIc=
github.com/jeremija/gosubmit v0.2.7/go.mod h1:Ui+HS073lCFREXBbdfrJzMB57OI/bdxTiLtrDHHhFPI= github.com/jeremija/gosubmit v0.2.7/go.mod h1:Ui+HS073lCFREXBbdfrJzMB57OI/bdxTiLtrDHHhFPI=
github.com/jeremywohl/flatten/v2 v2.0.0-20211013061545-07e4a09fb8e4 h1:eA9wi6ZzpIRobvXkn/S2Lyw1hr2pc71zxzOPl7Xjs4w= github.com/jeremywohl/flatten/v2 v2.0.0-20211013061545-07e4a09fb8e4 h1:eA9wi6ZzpIRobvXkn/S2Lyw1hr2pc71zxzOPl7Xjs4w=
@ -1845,6 +1847,8 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
@ -2173,6 +2177,9 @@ github.com/rfjakob/eme v1.1.2 h1:SxziR8msSOElPayZNFfQw4Tjx/Sbaeeh3eRvrHVMUs4=
github.com/rfjakob/eme v1.1.2/go.mod h1:cVvpasglm/G3ngEfcfT/Wt0GwhkuO32pf/poW6Nyk1k= github.com/rfjakob/eme v1.1.2/go.mod h1:cVvpasglm/G3ngEfcfT/Wt0GwhkuO32pf/poW6Nyk1k=
github.com/riemann/riemann-go-client v0.5.1-0.20211206220514-f58f10cdce16 h1:bGXoxRwUpPTCaQ86DRE+3wqE9vh3aH8W0HH5L/ygOFM= github.com/riemann/riemann-go-client v0.5.1-0.20211206220514-f58f10cdce16 h1:bGXoxRwUpPTCaQ86DRE+3wqE9vh3aH8W0HH5L/ygOFM=
github.com/riemann/riemann-go-client v0.5.1-0.20211206220514-f58f10cdce16/go.mod h1:4rS0vfmzOMwfFPhi6Zve4k/59TsBepqd6WESNULE0ho= github.com/riemann/riemann-go-client v0.5.1-0.20211206220514-f58f10cdce16/go.mod h1:4rS0vfmzOMwfFPhi6Zve4k/59TsBepqd6WESNULE0ho=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/robbiet480/go.nut v0.0.0-20220219091450-bd8f121e1fa1 h1:YmFqprZILGlF/X3tvMA4Rwn3ySxyE3hGUajBHkkaZbM= github.com/robbiet480/go.nut v0.0.0-20220219091450-bd8f121e1fa1 h1:YmFqprZILGlF/X3tvMA4Rwn3ySxyE3hGUajBHkkaZbM=
github.com/robbiet480/go.nut v0.0.0-20220219091450-bd8f121e1fa1/go.mod h1:pL1huxuIlWub46MsMVJg4p7OXkzbPp/APxh9IH0eJjQ= github.com/robbiet480/go.nut v0.0.0-20220219091450-bd8f121e1fa1/go.mod h1:pL1huxuIlWub46MsMVJg4p7OXkzbPp/APxh9IH0eJjQ=
github.com/robertkrimen/otto v0.0.0-20191219234010-c382bd3c16ff h1:+6NUiITWwE5q1KO6SAfUX918c+Tab0+tGAM/mtdlUyA= github.com/robertkrimen/otto v0.0.0-20191219234010-c382bd3c16ff h1:+6NUiITWwE5q1KO6SAfUX918c+Tab0+tGAM/mtdlUyA=

View File

@ -67,7 +67,7 @@ func TestCases(t *testing.T) {
require.NotEmpty(t, output) require.NotEmpty(t, output)
require.GreaterOrEqual(t, n, uint64(1)) require.GreaterOrEqual(t, n, uint64(1))
actual := config.NewConfig() actual := config.NewConfig()
require.NoError(t, actual.LoadConfigData(output)) require.NoError(t, actual.LoadConfigData(output, config.EmptySourcePath))
// Test the output // Test the output
require.Len(t, actual.Inputs, len(expected.Inputs)) require.Len(t, actual.Inputs, len(expected.Inputs))

View File

@ -24,7 +24,7 @@ func TestNoMigration(t *testing.T) {
expectedBuffer, err := os.ReadFile(fn) expectedBuffer, err := os.ReadFile(fn)
require.NoError(t, err) require.NoError(t, err)
expected := config.NewConfig() expected := config.NewConfig()
require.NoError(t, expected.LoadConfigData(expectedBuffer)) require.NoError(t, expected.LoadConfigData(expectedBuffer, config.EmptySourcePath))
require.NotNil(t, expected.Agent) require.NotNil(t, expected.Agent)
// Migrate // Migrate
@ -34,7 +34,7 @@ func TestNoMigration(t *testing.T) {
require.Zero(t, n) require.Zero(t, n)
actual := config.NewConfig() actual := config.NewConfig()
require.NoError(t, actual.LoadConfigData(output)) require.NoError(t, actual.LoadConfigData(output, config.EmptySourcePath))
require.NotNil(t, actual.Agent) require.NotNil(t, actual.Agent)
// Test the output // Test the output
@ -90,7 +90,7 @@ func TestCases(t *testing.T) {
require.NotEmpty(t, output) require.NotEmpty(t, output)
require.Positive(t, n, "expected migration application but none applied") require.Positive(t, n, "expected migration application but none applied")
actual := config.NewConfig() actual := config.NewConfig()
require.NoError(t, actual.LoadConfigData(output)) require.NoError(t, actual.LoadConfigData(output, config.EmptySourcePath))
require.NotNil(t, actual.Agent) require.NotNil(t, actual.Agent)
// Test the output // Test the output

View File

@ -45,7 +45,7 @@ func TestCases(t *testing.T) {
require.NotEmpty(t, output) require.NotEmpty(t, output)
require.GreaterOrEqual(t, n, uint64(1)) require.GreaterOrEqual(t, n, uint64(1))
actual := config.NewConfig() actual := config.NewConfig()
require.NoError(t, actual.LoadConfigData(output)) require.NoError(t, actual.LoadConfigData(output, config.EmptySourcePath))
// Test the output // Test the output
require.Len(t, actual.Inputs, len(expected.Inputs)) require.Len(t, actual.Inputs, len(expected.Inputs))

View File

@ -70,7 +70,7 @@ func TestCases(t *testing.T) {
require.NotEmpty(t, output) require.NotEmpty(t, output)
require.GreaterOrEqual(t, n, uint64(1)) require.GreaterOrEqual(t, n, uint64(1))
actual := config.NewConfig() actual := config.NewConfig()
require.NoError(t, actual.LoadConfigData(output)) require.NoError(t, actual.LoadConfigData(output, config.EmptySourcePath))
// Test the output // Test the output
require.Len(t, actual.Inputs, len(expected.Inputs)) require.Len(t, actual.Inputs, len(expected.Inputs))

View File

@ -57,7 +57,7 @@ func TestCases(t *testing.T) {
require.NotEmpty(t, output) require.NotEmpty(t, output)
require.GreaterOrEqual(t, n, uint64(1)) require.GreaterOrEqual(t, n, uint64(1))
actual := config.NewConfig() actual := config.NewConfig()
require.NoError(t, actual.LoadConfigData(output)) require.NoError(t, actual.LoadConfigData(output, config.EmptySourcePath))
// Test the output // Test the output
require.Len(t, actual.Inputs, len(expected.Inputs)) require.Len(t, actual.Inputs, len(expected.Inputs))

View File

@ -53,7 +53,7 @@ func TestCases(t *testing.T) {
require.NotEmpty(t, output) require.NotEmpty(t, output)
require.GreaterOrEqual(t, n, uint64(1)) require.GreaterOrEqual(t, n, uint64(1))
actual := config.NewConfig() actual := config.NewConfig()
require.NoError(t, actual.LoadConfigData(output)) require.NoError(t, actual.LoadConfigData(output, config.EmptySourcePath))
// Test the output // Test the output
require.Len(t, actual.Inputs, len(expected.Inputs)) require.Len(t, actual.Inputs, len(expected.Inputs))

View File

@ -45,7 +45,7 @@ func TestCases(t *testing.T) {
require.NotEmpty(t, output) require.NotEmpty(t, output)
require.GreaterOrEqual(t, n, uint64(1)) require.GreaterOrEqual(t, n, uint64(1))
actual := config.NewConfig() actual := config.NewConfig()
require.NoError(t, actual.LoadConfigData(output)) require.NoError(t, actual.LoadConfigData(output, config.EmptySourcePath))
// Test the output // Test the output
require.Len(t, actual.Inputs, len(expected.Inputs)) require.Len(t, actual.Inputs, len(expected.Inputs))

View File

@ -46,7 +46,7 @@ func TestCases(t *testing.T) {
require.NotEmpty(t, output) require.NotEmpty(t, output)
require.GreaterOrEqual(t, n, uint64(1)) require.GreaterOrEqual(t, n, uint64(1))
actual := config.NewConfig() actual := config.NewConfig()
require.NoError(t, actual.LoadConfigData(output)) require.NoError(t, actual.LoadConfigData(output, config.EmptySourcePath))
// Test the output // Test the output
require.Len(t, actual.Inputs, len(expected.Inputs)) require.Len(t, actual.Inputs, len(expected.Inputs))

View File

@ -145,7 +145,7 @@ func TestCases(t *testing.T) {
require.NotEmpty(t, output) require.NotEmpty(t, output)
require.GreaterOrEqual(t, n, uint64(1)) require.GreaterOrEqual(t, n, uint64(1))
actual := config.NewConfig() actual := config.NewConfig()
require.NoError(t, actual.LoadConfigData(output)) require.NoError(t, actual.LoadConfigData(output, config.EmptySourcePath))
// Test the output // Test the output
require.Len(t, actual.Inputs, len(expected.Inputs)) require.Len(t, actual.Inputs, len(expected.Inputs))

View File

@ -119,7 +119,7 @@ func TestCases(t *testing.T) {
require.NotEmpty(t, output) require.NotEmpty(t, output)
require.GreaterOrEqual(t, n, uint64(1)) require.GreaterOrEqual(t, n, uint64(1))
actual := config.NewConfig() actual := config.NewConfig()
require.NoError(t, actual.LoadConfigData(output)) require.NoError(t, actual.LoadConfigData(output, config.EmptySourcePath))
// Test the output // Test the output
require.Len(t, actual.Inputs, len(expected.Inputs)) require.Len(t, actual.Inputs, len(expected.Inputs))

View File

@ -57,7 +57,7 @@ func TestCases(t *testing.T) {
require.NotEmpty(t, output) require.NotEmpty(t, output)
require.GreaterOrEqual(t, n, uint64(1)) require.GreaterOrEqual(t, n, uint64(1))
actual := config.NewConfig() actual := config.NewConfig()
require.NoError(t, actual.LoadConfigData(output)) require.NoError(t, actual.LoadConfigData(output, config.EmptySourcePath))
// Test the output // Test the output
require.Len(t, actual.Inputs, len(expected.Inputs)) require.Len(t, actual.Inputs, len(expected.Inputs))

View File

@ -46,7 +46,7 @@ func TestCases(t *testing.T) {
require.NotEmpty(t, output) require.NotEmpty(t, output)
require.GreaterOrEqual(t, n, uint64(1)) require.GreaterOrEqual(t, n, uint64(1))
actual := config.NewConfig() actual := config.NewConfig()
require.NoError(t, actual.LoadConfigData(output)) require.NoError(t, actual.LoadConfigData(output, config.EmptySourcePath))
// Test the output // Test the output
require.Len(t, actual.Inputs, len(expected.Inputs)) require.Len(t, actual.Inputs, len(expected.Inputs))

View File

@ -46,7 +46,7 @@ func TestCases(t *testing.T) {
require.NotEmpty(t, output) require.NotEmpty(t, output)
require.GreaterOrEqual(t, n, uint64(1)) require.GreaterOrEqual(t, n, uint64(1))
actual := config.NewConfig() actual := config.NewConfig()
require.NoError(t, actual.LoadConfigData(output)) require.NoError(t, actual.LoadConfigData(output, config.EmptySourcePath))
// Test the output // Test the output
require.Len(t, actual.Inputs, len(expected.Inputs)) require.Len(t, actual.Inputs, len(expected.Inputs))

View File

@ -46,7 +46,7 @@ func TestCases(t *testing.T) {
require.NotEmpty(t, output) require.NotEmpty(t, output)
require.GreaterOrEqual(t, n, uint64(1)) require.GreaterOrEqual(t, n, uint64(1))
actual := config.NewConfig() actual := config.NewConfig()
require.NoError(t, actual.LoadConfigData(output)) require.NoError(t, actual.LoadConfigData(output, config.EmptySourcePath))
// Test the output // Test the output
require.Len(t, actual.Inputs, len(expected.Inputs)) require.Len(t, actual.Inputs, len(expected.Inputs))

View File

@ -57,7 +57,7 @@ func TestCases(t *testing.T) {
require.NotEmpty(t, output) require.NotEmpty(t, output)
require.GreaterOrEqual(t, n, uint64(1)) require.GreaterOrEqual(t, n, uint64(1))
actual := config.NewConfig() actual := config.NewConfig()
require.NoError(t, actual.LoadConfigData(output)) require.NoError(t, actual.LoadConfigData(output, config.EmptySourcePath))
// Test the output // Test the output
require.Len(t, actual.Outputs, len(expected.Outputs)) require.Len(t, actual.Outputs, len(expected.Outputs))

View File

@ -45,7 +45,7 @@ func TestCases(t *testing.T) {
require.NotEmpty(t, output) require.NotEmpty(t, output)
require.GreaterOrEqual(t, n, uint64(1)) require.GreaterOrEqual(t, n, uint64(1))
actual := config.NewConfig() actual := config.NewConfig()
require.NoError(t, actual.LoadConfigData(output)) require.NoError(t, actual.LoadConfigData(output, config.EmptySourcePath))
// Test the output // Test the output
require.Len(t, actual.Outputs, len(expected.Outputs)) require.Len(t, actual.Outputs, len(expected.Outputs))

View File

@ -70,6 +70,7 @@ func NewRunningAggregator(aggregator telegraf.Aggregator, config *AggregatorConf
// AggregatorConfig is the common config for all aggregators. // AggregatorConfig is the common config for all aggregators.
type AggregatorConfig struct { type AggregatorConfig struct {
Name string Name string
Source string
Alias string Alias string
ID string ID string
DropOriginal bool DropOriginal bool

View File

@ -83,6 +83,7 @@ func NewRunningInput(input telegraf.Input, config *InputConfig) *RunningInput {
// InputConfig is the common config for all inputs. // InputConfig is the common config for all inputs.
type InputConfig struct { type InputConfig struct {
Name string Name string
Source string
Alias string Alias string
ID string ID string
Interval time.Duration Interval time.Duration

View File

@ -24,6 +24,7 @@ const (
// OutputConfig containing name and filter // OutputConfig containing name and filter
type OutputConfig struct { type OutputConfig struct {
Name string Name string
Source string
Alias string Alias string
ID string ID string
StartupErrorBehavior string StartupErrorBehavior string

View File

@ -24,6 +24,7 @@ func (rp RunningProcessors) Less(i, j int) bool { return rp[i].Config.Order < rp
// ProcessorConfig containing a name and filter // ProcessorConfig containing a name and filter
type ProcessorConfig struct { type ProcessorConfig struct {
Name string Name string
Source string
Alias string Alias string
ID string ID string
Order int64 Order int64

View File

@ -417,7 +417,7 @@ func TestCases(t *testing.T) {
commands = [ "echo \"a,b\n1,2\n3,4\"" ] commands = [ "echo \"a,b\n1,2\n3,4\"" ]
data_format = "csv" data_format = "csv"
csv_header_row_count = 1 csv_header_row_count = 1
`))) `), config.EmptySourcePath))
require.Len(t, cfg.Inputs, 1) require.Len(t, cfg.Inputs, 1)
plugin := cfg.Inputs[0] plugin := cfg.Inputs[0]
require.NoError(t, plugin.Init()) require.NoError(t, plugin.Init())

View File

@ -32,7 +32,7 @@ func TestSettingConfigWorks(t *testing.T) {
signal = "SIGHUP" signal = "SIGHUP"
` `
conf := config.NewConfig() conf := config.NewConfig()
require.NoError(t, conf.LoadConfigData([]byte(cfg))) require.NoError(t, conf.LoadConfigData([]byte(cfg), config.EmptySourcePath))
require.Len(t, conf.Inputs, 1) require.Len(t, conf.Inputs, 1)
inp, ok := conf.Inputs[0].Input.(*Execd) inp, ok := conf.Inputs[0].Input.(*Execd)

View File

@ -361,7 +361,7 @@ use_unregistered_reads = true
` `
c := config.NewConfig() c := config.NewConfig()
err := c.LoadConfigData([]byte(toml)) err := c.LoadConfigData([]byte(toml), config.EmptySourcePath)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, c.Inputs, 1) require.Len(t, c.Inputs, 1)

View File

@ -426,7 +426,7 @@ additional_valid_status_codes = ["0xC0"]
` `
c := config.NewConfig() c := config.NewConfig()
err := c.LoadConfigData([]byte(toml)) err := c.LoadConfigData([]byte(toml), config.EmptySourcePath)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, c.Inputs, 1) require.Len(t, c.Inputs, 1)
@ -515,7 +515,7 @@ deadband_value = 100.0
` `
c := config.NewConfig() c := config.NewConfig()
err := c.LoadConfigData([]byte(toml)) err := c.LoadConfigData([]byte(toml), config.EmptySourcePath)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, c.Inputs, 1) require.Len(t, c.Inputs, 1)

View File

@ -489,9 +489,9 @@ func TestTOMLConfig(t *testing.T) {
c := config.NewConfig() c := config.NewConfig()
if tt.expectedError { if tt.expectedError {
require.Error(t, c.LoadConfigData(tt.configBytes)) require.Error(t, c.LoadConfigData(tt.configBytes, config.EmptySourcePath))
} else { } else {
require.NoError(t, c.LoadConfigData(tt.configBytes)) require.NoError(t, c.LoadConfigData(tt.configBytes, config.EmptySourcePath))
} }
}) })
} }

View File

@ -6,15 +6,15 @@ import (
"testing" "testing"
"time" "time"
"github.com/gosnmp/gosnmp"
"github.com/stretchr/testify/require"
"github.com/influxdata/telegraf" "github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/config" "github.com/influxdata/telegraf/config"
"github.com/influxdata/telegraf/internal/snmp" "github.com/influxdata/telegraf/internal/snmp"
"github.com/influxdata/telegraf/metric" "github.com/influxdata/telegraf/metric"
"github.com/influxdata/telegraf/plugins/processors" "github.com/influxdata/telegraf/plugins/processors"
"github.com/influxdata/telegraf/testutil" "github.com/influxdata/telegraf/testutil"
"github.com/gosnmp/gosnmp"
"github.com/stretchr/testify/require"
) )
type testSNMPConnection struct { type testSNMPConnection struct {
@ -60,7 +60,7 @@ func TestRegistry(t *testing.T) {
func TestSampleConfig(t *testing.T) { func TestSampleConfig(t *testing.T) {
cfg := config.NewConfig() cfg := config.NewConfig()
require.NoError(t, cfg.LoadConfigData(testutil.DefaultSampleConfig((&Lookup{}).SampleConfig()))) require.NoError(t, cfg.LoadConfigData(testutil.DefaultSampleConfig((&Lookup{}).SampleConfig()), config.EmptySourcePath))
} }
func TestInit(t *testing.T) { func TestInit(t *testing.T) {

View File

@ -2647,7 +2647,7 @@ def apply(metric):
// Build a Starlark plugin from the provided configuration. // Build a Starlark plugin from the provided configuration.
func buildPlugin(configContent string) (*Starlark, error) { func buildPlugin(configContent string) (*Starlark, error) {
c := config.NewConfig() c := config.NewConfig()
err := c.LoadConfigData([]byte(configContent)) err := c.LoadConfigData([]byte(configContent), config.EmptySourcePath)
if err != nil { if err != nil {
return nil, err return nil, err
} }