Amazon CloudWatch Agentのソースコードが公開されたのでナナメ読み

突然ですがMonitoring Agentが好きです。

Amazon CloudWatch Agent is now Open Source and included with Amazon Linux 2というわけで、ざっと見てみました。

なお自分の脳内にうっすら記憶があるのは以下のAgent。

今回は https://github.com/aws/amazon-cloudwatch-agent v1.247345.36 を見ました。

概要

ソースコードを読むにあたり main() を起点にすると確実です。 今回はMakefileを見ると起点がわかります。 というわけで github.com/aws/amazon-cloudwatch-agent/cmd/amazon-cloudwatch-agent/amazon-cloudwatch-agent.go を起点に読み進めていきます。

main()reloadLoop()runAgent() ときて、 github.com/aws/telegraf/agent/agent.goAgent.Run() が本丸です。

goroutine構成

Input -> Processor -> Aggregator -> Output はそれぞれchannelで繋いでいて、 それぞれプラグインごとにgoroutineを起動していることがわかります。

他のプラグインの処理遅延の影響は受けないものの、 プラグインの数や内容によってはJitterをいい感じに設定してプラグイン同時実行による実行負荷を散らす必要があるかもしれません。

Metric収集タイミング

日時に対してキッチリ毎分0秒に起動するかどうか?

これは設定によるっぽい。 Intervalが10sで RoundInterval が 10s なら :00 :10 :20 に実行。

	// RoundInterval rounds collection interval to 'interval'.
	//     ie, if Interval=10s then always collect on :00, :10, :20, etc.
	RoundInterval bool

https://github.com/aws/telegraf/blob/5ec6811a19d9a7bee51c27bf111fb877476a4c8d/config/config.go#L96-L98

Input Plugin実行方法

基本的に本体組み込み。

exec プラグインで外部コマンド実行が可能。 os/execexec.Command() するだけ。

https://github.com/aws/telegraf/blob/5ec6811a19d9a7bee51c27bf111fb877476a4c8d/plugins/inputs/exec/exec.go#L77

データ送出タイミング

Metrics are flushed to outputs when any of the following events happen:

  • flush_interval + rand(flush_jitter) has elapsed since start or the last flush interval
  • At least metric_batch_size count of metrics are waiting in the buffer
  • The telegraf process has received a SIGUSR1 signal

https://github.com/aws/telegraf/blob/5ec6811a19d9a7bee51c27bf111fb877476a4c8d/docs/OUTPUTS.md#flushing-metrics-to-outputs

実装は github.com/aws/telegraf/agent/agent.goのflushLoop()あたり。

Configとしては FlushInverval FlushJitter MetricBufferLimit FlushBufferWhenFull あたりが影響する。


コードを見て確認できるのは凄くいいですね。安心。面白い。

というわけで、つづく、かもしれないし、つづかないかもしれない


See also