MackerelでのECSのタスクのメトリクスの2018年版
id:kakku22 兄やんから「Mackerel Meetupで発表することになったぜ」と連絡をもらったのですが、そのハナシの流れで、 「コンテナのメトリクスを取るイケてるやり方をブログにしてちょ」といわれてしまったので PoCレベルで恐縮ですがエントリにまとめます。
前回までのおさらい
ECSホストにMackerelエージェントいれて、そのホストで動いているメトリクスを収集するというカンジです。
とりあえずはまあ動くとはいえ、なんとも微妙な点としては以下の通り
- シェル芸が必要
- ダッシュボード作りこみが必要
- ECSホストでMackerelのagentインスコする必要がある(Fargateの場合どーすんの)
今回のやり方
図にするとこんなカンジ
エージェントについて
PoCということでドキュメントもクソもない状況ですけど、ソースはこっち。 github.com
んでラップしたイメージも用意しました。
https://hub.docker.com/r/okzk/mackerel-metrics-collect-agent/
memcachedのメトリクス収集を例にすると、まずはこんなカンジのconfをS3に上げておきます。
[plugin.metrics.memcached] command = "mackerel-plugin-memcached -host memcached"
confはmackerel-agent.conf互換なので、違和感は少ないと思います。
次にagentのコンテナをmemcachedのサイドカーコンテナとして、memcachedにリンクさせて
環境変数CONF_S3_URI
にs3://YOUR-BUCKET/path/to/memcache-metrics.conf
を指定して動かします。
タスクロールでs3:GetObject
できるように許可しておいてください。
この時ネットワークモードがbridgeだったらホスト側のポートを0にしてダイナミックポートで動くようにしておきます。
(ネットワークモードがawsvpcやhostだったら、そのまま2018を指定しておきます)
イメージには標準プラグインを同梱していますが、さらに追加したい場合はmkrでインストールできるようにしているので
MKR_INSTALL_PACKAGE
環境変数でインストールしたいプラグインを指定してください(スペース区切りで複数可)。
プラグインについて
ソースはこっち。PoCなんでドキュメントも(ry
こんなカンジで、クラスタ名/サービス名/agentのコンテナ名/ネットワークモードを指定してプラグインの設定をして動かせば、イイカンジにタスクのメトリクスを収集してきます。
[plugin.metrics.memcached] command = "mackerel-plugin-ecs-task-metrics -cluster my-cluster -service dev-okzk -containerName mackerel-metrics-collect-agent -networkMode bridge"
プラグインを動かすホストについて
ここまででプラグインを動かすホストのカスタムメトリクスとしてECSタスクのメトリクスが収集されるようになったんですが、 通常のホストでプラグイン設定をすると、そのホストがふっとんだときに微妙なカンジになっちゃいます。
ということで、その「プラグインを動かすホスト」もECSで動かすことができるようイメージを用意しました。
https://hub.docker.com/r/okzk/mackerel-ecs-task-metrics-collector/
このイメージでは/var/lib/mackerel-agent/id
ファイルをS3に退避しておいて使いまわすようにしているので、仮想的に一つのホストとして
メトリクスを継続して収集できます。
使い方はapikeyとかも含めた完全なconfをS3にアップロードしておきます。
apikey = "mackerelのAPIキーだよ" cloud_platform = "none" display_name = "ECS Task Metrics" [filesystems] ignore = ".*" [plugin.metrics.memcached] command = "mackerel-plugin-ecs-task-metrics -cluster my-cluster -service dev-okzk -containerName mackerel-metrics-collect-agent -networkMode bridge"
IAMロールは以下のモノが必要です。
- conf等のアクセスのために
s3:GetObject
,s3:PutObject
- agentアクセスのために
ec2:DescribeInstances
,ecs:ListTasks
,ecs:DescribeContainerInstances
,ecs:DescribeTasks
次にtask definitionの環境変数で以下のように指定。
最後にサービス設定で最大1台をキープするように実行します。
そーすると、ホストメトリクスとしてイーカンジにメトリクス収集できます。
やったね。
まとめ
S3にconfぶっこんどいて、ポチポチタスク設定すれば、比較的カンタンにイーカンジにメトリクス収集できるようになりました。
awsvpcにも対応しているのでFargateも怖くないよ。
追記(2018-02-05)
ホストのカスタムメトリクスではなく、サービスメトリクスにしてしまうのがいい気もしてきた。
……っと思ったけど、グラフ定義とか#
のワイルドカードの扱いとかアレコレ考えると、サービスメトリクスだとやりにくいか。。。
やっぱり、ホストのカスタムメトリクスの方が都合がいいかも(ぉ
追記(2018-02-05 20時ごろ)
Mackerelの公式でコンテナサポートするそうです。そんなわけで本エントリの内容はPoCのママ、Deprecatedになりそうっすね。(´;ω;`)ブワッ