突然ですがMonitoring Agentが好きです。
Amazon CloudWatch Agent is now Open Source and included with Amazon Linux 2というわけで、ざっと見てみました。
なお自分の脳内にうっすら記憶があるのは以下のAgent。
- heartbeatsjp/happo-agent: Yet another Nagios nrpe
- mackerelio/mackerel-agent: mackerel-agent is an agent program to post your hosts' metrics to mackerel.io.
今回は https://github.com/aws/amazon-cloudwatch-agent v1.247345.36 を見ました。
概要
-
Golang製
-
Agentのコア部分は github.com/aws/telegraf
- github.com/influxdb/telegraf の fork
-
go.mod
でgithub.com/influxdata/telegraf を github.com/aws/telegraf に replaceしてるreplace github.com/influxdata/telegraf => github.com/aws/telegraf v0.10.2-0.20200902215110-5ec6811a19d9
ソースコードを読むにあたり 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.goのAgent.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
Input Plugin実行方法
基本的に本体組み込み。
exec
プラグインで外部コマンド実行が可能。
os/exec
の exec.Command()
するだけ。
データ送出タイミング
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
実装は github.com/aws/telegraf/agent/agent.goのflushLoop()あたり。
Configとしては FlushInverval FlushJitter MetricBufferLimit FlushBufferWhenFull あたりが影響する。
コードを見て確認できるのは凄くいいですね。安心。面白い。
というわけで、つづく、かもしれないし、つづかないかもしれない