in cmd/amazon-cloudwatch-agent/amazon-cloudwatch-agent.go [222:357]
func runAgent(ctx context.Context,
inputFilters []string,
outputFilters []string,
) error {
envConfigPath, err := getEnvConfigPath(*fConfig, *fEnvConfig)
if err != nil {
return err
}
err = loadEnvironmentVariables(envConfigPath)
if err != nil && !*fSchemaTest {
log.Printf("W! Failed to load environment variables due to %s", err.Error())
}
// If no other options are specified, load the config file and run.
c := config.NewConfig()
c.OutputFilters = outputFilters
c.InputFilters = inputFilters
isOld, err := migrate.IsOldConfig(*fConfig)
if err != nil {
log.Printf("W! Failed to detect if config file is old format: %v", err)
}
if isOld {
migratedConfFile, err := migrate.MigrateFile(*fConfig)
if err != nil {
log.Printf("W! Failed to migrate old config format file %v: %v", *fConfig, err)
}
err = c.LoadConfig(migratedConfFile)
if err != nil {
return err
}
agentinfo.BuildStr += "_M"
} else {
err = c.LoadConfig(*fConfig)
if err != nil {
return err
}
}
if *fConfigDirectory != "" {
err = c.LoadDirectory(*fConfigDirectory)
if err != nil {
return err
}
}
if !*fTest && len(c.Outputs) == 0 {
return errors.New("Error: no outputs found, did you provide a valid config file?")
}
if len(c.Inputs) == 0 {
return errors.New("Error: no inputs found, did you provide a valid config file?")
}
if int64(c.Agent.Interval.Duration) <= 0 {
return fmt.Errorf("Agent interval must be positive, found %s",
c.Agent.Interval.Duration)
}
if int64(c.Agent.FlushInterval.Duration) <= 0 {
return fmt.Errorf("Agent flush_interval must be positive; found %s",
c.Agent.Interval.Duration)
}
if *fSchemaTest {
//up to this point, the given config file must be valid
fmt.Println(agentinfo.FullVersion())
fmt.Printf("The given config: %v is valid\n", *fConfig)
os.Exit(0)
}
ag, err := agent.NewAgent(c)
if err != nil {
return err
}
// Setup logging as configured.
logConfig := logger.LogConfig{
Debug: ag.Config.Agent.Debug || *fDebug,
Quiet: ag.Config.Agent.Quiet || *fQuiet,
LogTarget: ag.Config.Agent.LogTarget,
Logfile: ag.Config.Agent.Logfile,
RotationInterval: ag.Config.Agent.LogfileRotationInterval,
RotationMaxSize: ag.Config.Agent.LogfileRotationMaxSize,
RotationMaxArchives: ag.Config.Agent.LogfileRotationMaxArchives,
}
logger.SetupLogging(logConfig)
log.Printf("I! Starting AmazonCloudWatchAgent %s", agentinfo.Version())
// Need to set SDK log level before plugins get loaded.
// Some aws.Config objects get created early and live forever which means
// we cannot change the sdk log level without restarting the Agent.
// For example CloudWatch.Connect().
sdkLogLevel := os.Getenv(envconfig.AWS_SDK_LOG_LEVEL)
configaws.SetSDKLogLevel(sdkLogLevel)
if sdkLogLevel == "" {
log.Printf("I! AWS SDK log level not set")
} else {
log.Printf("I! AWS SDK log level, %s", sdkLogLevel)
}
if *fTest || *fTestWait != 0 {
testWaitDuration := time.Duration(*fTestWait) * time.Second
return ag.Test(ctx, testWaitDuration)
}
log.Printf("I! Loaded inputs: %s", strings.Join(c.InputNames(), " "))
log.Printf("I! Loaded aggregators: %s", strings.Join(c.AggregatorNames(), " "))
log.Printf("I! Loaded processors: %s", strings.Join(c.ProcessorNames(), " "))
log.Printf("I! Loaded outputs: %s", strings.Join(c.OutputNames(), " "))
log.Printf("I! Tags enabled: %s", c.ListTags())
agentinfo.InputPlugins = c.InputNames()
agentinfo.OutputPlugins = c.OutputNames()
if *fPidfile != "" {
f, err := os.OpenFile(*fPidfile, os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Printf("E! Unable to create pidfile: %s", err)
} else {
fmt.Fprintf(f, "%d\n", os.Getpid())
f.Close()
defer func() {
err := os.Remove(*fPidfile)
if err != nil {
log.Printf("E! Unable to remove pidfile: %s", err)
}
}()
}
}
logAgent := logs.NewLogAgent(c)
go logAgent.Run(ctx)
return ag.Run(ctx)
}