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

@ -235,6 +235,7 @@ func runApp(args []string, outputBuffer io.Writer, pprof Server, c TelegrafConfi
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"),
printPluginConfigSource: cCtx.Bool("print-plugin-config-source"),
test: cCtx.Bool("test"), test: cCtx.Bool("test"),
debug: cCtx.Bool("debug"), debug: cCtx.Bool("debug"),
once: cCtx.Bool("once"), once: cCtx.Bool("once"),
@ -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

@ -45,6 +45,7 @@ type GlobalFlags struct {
plugindDir string plugindDir string
password string password string
oldEnvBehavior bool oldEnvBehavior bool
printPluginConfigSource bool
test bool test bool
debug bool debug bool
once bool once bool
@ -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
@ -75,6 +80,7 @@ type Config struct {
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
} }