feat(agent): Add /etc/telegraf/telegraf.d to default config locations (#12608)

This commit is contained in:
Joshua Powers 2023-02-07 09:02:01 -07:00 committed by GitHub
parent 0ea50fa3b5
commit ae2eb096cd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 56 additions and 22 deletions

View File

@ -208,13 +208,8 @@ func (t *Telegraf) loadConfiguration() (*config.Config, error) {
c.SecretStoreFilters = t.secretstoreFilters c.SecretStoreFilters = t.secretstoreFilters
var configFiles []string var configFiles []string
// providing no "config" flag should load default config
if len(t.config) == 0 {
configFiles = append(configFiles, "")
} else {
configFiles = append(configFiles, t.config...)
}
configFiles = append(configFiles, t.config...)
for _, fConfigDirectory := range t.configDir { for _, fConfigDirectory := range t.configDir {
files, err := config.WalkDirectory(fConfigDirectory) files, err := config.WalkDirectory(fConfigDirectory)
if err != nil { if err != nil {
@ -223,6 +218,12 @@ func (t *Telegraf) loadConfiguration() (*config.Config, error) {
configFiles = append(configFiles, files...) configFiles = append(configFiles, files...)
} }
// providing no "config" or "config-directory" flag(s) should load default
// configuration files
if len(configFiles) == 0 {
configFiles = append(configFiles, "")
}
t.configFiles = configFiles t.configFiles = configFiles
if err := c.LoadAll(configFiles...); err != nil { if err := c.LoadAll(configFiles...); err != nil {
return c, err return c, err

View File

@ -362,32 +362,57 @@ func WalkDirectory(path string) ([]string, error) {
// Try to find a default config file at these locations (in order): // Try to find a default config file at these locations (in order):
// 1. $TELEGRAF_CONFIG_PATH // 1. $TELEGRAF_CONFIG_PATH
// 2. $HOME/.telegraf/telegraf.conf // 2. $HOME/.telegraf/telegraf.conf
// 3. /etc/telegraf/telegraf.conf // 3. /etc/telegraf/telegraf.conf and /etc/telegraf/telegraf.d/*.conf
func getDefaultConfigPath() (string, error) { func getDefaultConfigPath() ([]string, error) {
envfile := os.Getenv("TELEGRAF_CONFIG_PATH") envfile := os.Getenv("TELEGRAF_CONFIG_PATH")
homefile := os.ExpandEnv("${HOME}/.telegraf/telegraf.conf") homefile := os.ExpandEnv("${HOME}/.telegraf/telegraf.conf")
etcfile := "/etc/telegraf/telegraf.conf" etcfile := "/etc/telegraf/telegraf.conf"
etcfolder := "/etc/telegraf/telegraf.conf.d"
if runtime.GOOS == "windows" { if runtime.GOOS == "windows" {
programFiles := os.Getenv("ProgramFiles") programFiles := os.Getenv("ProgramFiles")
if programFiles == "" { // Should never happen if programFiles == "" { // Should never happen
programFiles = `C:\Program Files` programFiles = `C:\Program Files`
} }
etcfile = programFiles + `\Telegraf\telegraf.conf` etcfile = programFiles + `\Telegraf\telegraf.conf`
etcfolder = programFiles + `\Telegraf\telegraf.conf.d\`
} }
for _, path := range []string{envfile, homefile, etcfile} {
for _, path := range []string{envfile, homefile} {
if isURL(path) { if isURL(path) {
log.Printf("I! Using config url: %s", path) log.Printf("I! Using config url: %s", path)
return path, nil return []string{path}, nil
} }
if _, err := os.Stat(path); err == nil { if _, err := os.Stat(path); err == nil {
log.Printf("I! Using config file: %s", path) log.Printf("I! Using config file: %s", path)
return path, nil return []string{path}, nil
} }
} }
// At this point we need to check if the files under /etc/telegraf are
// populated and return them all.
confFiles := []string{}
if _, err := os.Stat(etcfile); err == nil {
log.Printf("I! Using config file: %s", etcfile)
confFiles = append(confFiles, etcfile)
}
if _, err := os.Stat(etcfolder); err == nil {
files, err := WalkDirectory(etcfolder)
if err != nil {
log.Printf("W! unable walk '%s': %s", etcfolder, err)
}
for _, file := range files {
log.Printf("I! Using config file: %s", file)
}
confFiles = append(confFiles, files...)
}
if len(confFiles) > 0 {
return confFiles, nil
}
// if we got here, we didn't find a file in a default location // if we got here, we didn't find a file in a default location
return "", fmt.Errorf("no config file specified, and could not find one"+ return nil, fmt.Errorf("no config file specified, and could not find one"+
" in $TELEGRAF_CONFIG_PATH, %s, or %s", homefile, etcfile) " in $TELEGRAF_CONFIG_PATH, %s, %s, or %s/*.conf", homefile, etcfile, etcfolder)
} }
// isURL checks if string is valid url // isURL checks if string is valid url
@ -396,22 +421,30 @@ func isURL(str string) bool {
return err == nil && u.Scheme != "" && u.Host != "" return err == nil && u.Scheme != "" && u.Host != ""
} }
// LoadConfig loads the given config file and applies it to c // LoadConfig loads the given config files and applies it to c
func (c *Config) LoadConfig(path string) error { func (c *Config) LoadConfig(path string) error {
var err error var err error
paths := []string{}
if path == "" { if path == "" {
if path, err = getDefaultConfigPath(); err != nil { if paths, err = getDefaultConfigPath(); err != nil {
return err return err
} }
} } else {
data, err := LoadConfigFile(path) paths = append(paths, path)
if err != nil {
return fmt.Errorf("error loading config file %s: %w", path, err)
} }
if err = c.LoadConfigData(data); err != nil { for _, path := range paths {
return fmt.Errorf("error loading config file %s: %w", path, err) data, err := LoadConfigFile(path)
if err != nil {
return fmt.Errorf("error loading config file %s: %w", path, err)
}
if err = c.LoadConfigData(data); err != nil {
return fmt.Errorf("error loading config file %s: %w", path, err)
}
} }
return nil return nil
} }

View File

@ -484,7 +484,7 @@ func TestConfig_getDefaultConfigPathFromEnvURL(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
configPath, err := getDefaultConfigPath() configPath, err := getDefaultConfigPath()
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, ts.URL, configPath) require.Equal(t, []string{ts.URL}, configPath)
err = c.LoadConfig("") err = c.LoadConfig("")
require.NoError(t, err) require.NoError(t, err)
} }