はい、急遽参戦です。Mackerel Advent Calendar 2018の7日目です。

以前、AWS Elastic BeanstalkのMulti-container Docker環境をMackerelで監視するという記事を書きました。その際は、mackerel-agent.confを作成せずに環境変数で色々と設定していました。しかし、運用を続けるうちにやっぱり使いたいプラグインとか出てきて「mackerel-agent.conf作らにゃアカンでしょ」ということになって検証してた時にmackerel-agentが面白い動きをしていたので、紹介したいと思います。


ここで検証した内容はGitHubで大公開しているので参考にしてください。なお、API Keyらしきものが入っていますが、mackerelからは削除しているので安心してください。
ryosms/learn-mackerel-behavior - GitHub

1)mackerel-agent.confがない(空)の場合の挙動

起動したタイミングでmackerel-agent.confを作成します。
"apikey"と"plugin.metrics.docker"の設定項目を追加します。
"role"の設定項目は追加されません。(起動タイミングで一発mackerel-apiに投げたら終わりだからかな?

diffはこちら

2)mackerel-agent.confに起動オプション以外の設定を入れている場合の挙動

起動したタイミングでmackerel-agent.confの先頭に"apikey"を、末尾に"plugin.metrics.docker"の設定項目を追加します(よくできてんな。

diffはこちら

3)mackerel-agent.confに起動オプションと同じ設定を入れている場合の挙動

mackerel-agent.confの変更はありませんでした。
mackerel-agent.confに記載するapikeyは環境変数で渡すapikeyの所属するオーガニゼーションとは別のオーガニゼーションのものを使用したところ、mackerel-agent.confに記載された側のオーガニゼーションにホストが追加されました。
"role"はmackerel-agent.confの内容は無視して起動オプションの内容で作成されます。公式ヘルプのmackerel-agent仕様 -> 起動オプションに記載のある通りですね。
設定ファイルを同じ項目を指定した場合、起動オプションが優先されます。
※ roleの挙動とapikeyの挙動が違う気がするんですが、謎いけどまぁこんなことする人もそんなにいないだろうから影響は少ないと思われ

diffはありません。

番外編)mackerel-agent.confに空のapikeyフィールドがある時の挙動

起動したタイミングでmackerel-agent.confの先頭に"apikey"を、末尾に"plugin.metrics.docker"の設定項目を追加します。空のapikeyの設定は除去されないため、mackerel-agentが以下のエラーを吐いて終了します。
「apikeyの設定項目が2回(以上)定義されてるやんけ」というエラーですね。

failed to load config: failed to load the config file: Near line 2 (last key parsed 'apikey'): Key 'apikey' has already been defined.


diffはこちら

番外編2)mackerel-agent.confをreadonlyでマウントした時の挙動

「3)mackerel-agent.confに起動オプションと同じ設定を入れている場合の挙動」と同じです。
※ ただし、mackerel-agent.confの書き換えが発生するケース("apikey"や"plugin.metrics.docker"の設定項目が入っていない等)では以下のエラーを吐いて終了します。まぁ、普通に考えれば当然ですね。

open /etc/mackerel-agent/mackerel-agent.conf: read-only file system


diffはありません。

まとめ

基本的に、mackerel-agent.confがないか、"apikey"の項目が入ってなければ追加する(enable_docker_pluginがセットされていれば"plugin.metrics.docker"も)という挙動ですね。
confファイルと起動オプション(dockerコンテナに渡す環境変数)で別々に管理してたりするとちょいちょい動きが想定と違うというケースがあるので、横着せずにキッチリmackerel-agent.confは書いたほうがよさそうです。

現場からは以上です。

余談

dockerhubでmackerel/mackerel-container-agent-betaというものを見つけたので期待しています。