cmd/start-amazon-cloudwatch-agent/start-amazon-cloudwatch-agent.go (85 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT
package main
import (
"errors"
"io"
"io/fs"
"log"
"os"
"os/exec"
"syscall"
"gopkg.in/natefinch/lumberjack.v2"
"github.com/aws/amazon-cloudwatch-agent/cfg/envconfig"
"github.com/aws/amazon-cloudwatch-agent/internal/constants"
"github.com/aws/amazon-cloudwatch-agent/tool/paths"
)
func translateConfig() error {
args := []string{"--output", paths.TomlConfigPath, "--mode", "auto"}
if envconfig.IsRunningInContainer() {
args = append(args, "--input-dir", paths.CONFIG_DIR_IN_CONTAINER)
} else {
args = append(args, "--input", paths.JsonConfigPath, "--input-dir", paths.ConfigDirPath, "--config", paths.CommonConfigPath)
}
cmd := exec.Command(paths.TranslatorBinaryPath, args...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stdout
err := cmd.Run()
if err != nil {
if exitErr, ok := err.(*exec.ExitError); ok {
status := exitErr.Sys().(syscall.WaitStatus)
switch {
case status.Exited():
log.Printf("I! Return exit error: exit code=%d\n", status.ExitStatus())
if status.ExitStatus() == constants.ExitCodeNoJSONFile {
log.Printf("I! No json config files found, please provide config, exit now\n")
os.Exit(0)
}
}
} else {
log.Printf("Return other error: %s\n", err)
}
}
return err
}
func main() {
var writer io.WriteCloser
if !envconfig.IsRunningInContainer() {
writer = &lumberjack.Logger{
Filename: paths.AgentLogFilePath,
MaxSize: 100, //MB
MaxBackups: 5, //backup files
MaxAge: 7, //days
Compress: true,
}
log.SetOutput(writer)
}
if err := translateConfig(); err != nil {
log.Fatalf("E! Cannot translate JSON, ERROR is %v \n", err)
}
log.Printf("I! Config has been translated into TOML %s \n", paths.TomlConfigPath)
printFileContents(paths.TomlConfigPath)
log.Printf("I! Config has been translated into YAML %s \n", paths.YamlConfigPath)
printFileContents(paths.YamlConfigPath)
if err := startAgent(writer); err != nil {
log.Printf("E! Error when starting Agent, Error is %v \n", err)
os.Exit(1)
}
}
func printFileContents(path string) {
file, err := os.Open(path)
if err != nil {
// YAML file may or may not exist and that is okay.
if !errors.Is(err, fs.ErrNotExist) {
log.Printf("E! Error when printing file(%s) contents, Error is %v \n", path, err)
}
return
}
defer func() {
if err = file.Close(); err != nil {
log.Printf("E! Error when closing file, Error is %v \n", err)
}
}()
b, err := io.ReadAll(file)
if err != nil {
log.Printf("E! Error when reading file(%s), Error is %v \n", path, err)
}
log.Printf("D! config %v", string(b))
}