Goを使用してAWS Cloud Watchに独自のカスタムメトリックを挿入


INTRO


こんにちは!
cloudwatchに自分のカスタムメトリックを加えたいです.
Aws SDKを見ていると、Metricを送信する方法があります.
私が作成した簡単なデータはCloudWatchが作成したデータと同じであることに気づきました.
どうやって作ったのか説明します

CloudWatch Agent内部の簡単な理解


AWS CloudWatch Agentはgithubで公開されているので,その内部コードをしばらく分析した.
次に、エージェントがTelegraf機能を使用していることがわかります.
	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)

	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)
ここです。に進むと、Telegrafエージェントを実行するコードが表示されます.

Telegrafデータ収集方法


CloudWatchagentはTelegrafを利用してデータを収集しています.
では、Telegrafはどのようにデータを収集しているのでしょうか.
私もこの部分が気になってTelegrafの内部コードを開けました
Telegrafの場合、このオープンソースを使用して公制を収集することを決定することができます.
Go開発者にとって、これは使用可能なオープンソースライブラリです.
ここでお会いできて嬉しいです.
Telegrafでこのコードをどのように使用するかについては、ここです。を確認してください.

独自のカスタムMetricの作成


awssdkの場合、Cloudwatchにはmetricを直接生成して渡す関数が存在します.
メモリ情報を伝えるために利用できます.
作成する前に、NameSpaceについて理解する必要があります.
NameSpaceを複数の指標のスペースと見なしてください.
たとえば、instanceに関する指標がいくつかある場合は、Instance Name Spaceに配置したほうがいいです.

今から作りましょう
ライブラリをダウンロードします.
go get "github.com/tae2089/goAws"
上のライブラリはawsを使いやすいようにカスタマイズしたライブラリです:)
今はs 3とcloud watchについての部分がありますハハ
ライブラリが閉じている場合は、コードを入力します.
コードは簡単です.
package main

import (
	"github.com/tae2089/goAws/cloudwatch"
	"time"
)

func main() {

	instanceName := "<인스턴스이름>"
	instanceId := "<인스턴스 id>"

	c := cloudwatch.CloudwatchInfo{
		AwsRegion:       "<aws region>",
		AwsAccessKey:    "<AwsAccessKey>",
		AwsSecretKey:    "<AwsSecretKey>",
		AwsInstanceName: instanceName,
		AwsInstanceId:   instanceId,
		AwsProfileName:  "default",
		AwsNamespace:    "<Namespace name>",
	}

	err := c.SetConfigByKey()
	if err != nil {
		panic(err)
	}
	for {
		_, err := c.PutMetricData(cloudwatch.MemoryPercent)
		if err != nil {
			panic(err)
		}
		time.Sleep(1 * time.Second)
	}

}
CloudWatchInfoに必要な領域、アクセスキー、秘密鍵、名前空間を入力します.
アクセスキー、secretkeyを埋め込むユーザーの権限にはcloudwatchの権限が必要です.
このオプションを使用すると、次の結果が得られます.
最初の写真はnamespaceの内部に表示されます.

2枚目の写真は監視カメラを表示する写真です.

もし気になるところがあれば、伝言を残してください:)