MackerelでのECSのタスクのメトリクスの2018年版

id:kakku22 兄やんから「Mackerel Meetupで発表することになったぜ」と連絡をもらったのですが、そのハナシの流れで、 「コンテナのメトリクスを取るイケてるやり方をブログにしてちょ」といわれてしまったので PoCレベルで恐縮ですがエントリにまとめます。

前回までのおさらい

ECSホストにMackerelエージェントいれて、そのホストで動いているメトリクスを収集するというカンジです。

kakakakakku.hatenablog.com

とりあえずはまあ動くとはいえ、なんとも微妙な点としては以下の通り

  • シェル芸が必要
  • ダッシュボード作りこみが必要
  • ECSホストでMackerelのagentインスコする必要がある(Fargateの場合どーすんの)

今回のやり方

  • サイドカーコンテナでメトリクス収集するエージェントを動かしておく
  • プラグインがエージェントにアクセスしてまとめてカスタムメトリクスとして投稿する

図にするとこんなカンジ

f:id:okzk:20180128212812p:plain

エージェントについて

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_URIs3://YOUR-BUCKET/path/to/memcache-metrics.confを指定して動かします。
タスクロールでs3:GetObjectできるように許可しておいてください。

この時ネットワークモードがbridgeだったらホスト側のポートを0にしてダイナミックポートで動くようにしておきます。
(ネットワークモードがawsvpcやhostだったら、そのまま2018を指定しておきます)

f:id:okzk:20180128213422p:plain

イメージには標準プラグインを同梱していますが、さらに追加したい場合はmkrでインストールできるようにしているので MKR_INSTALL_PACKAGE環境変数でインストールしたいプラグインを指定してください(スペース区切りで複数可)。

プラグインについて

ソースはこっち。PoCなんでドキュメントも(ry

github.com

こんなカンジで、クラスタ名/サービス名/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の環境変数で以下のように指定。

f:id:okzk:20180128214719p:plain

最後にサービス設定で最大1台をキープするように実行します。

f:id:okzk:20180128214743p:plain

そーすると、ホストメトリクスとしてイーカンジにメトリクス収集できます。

f:id:okzk:20180128215238p:plain

やったね。

まとめ

S3にconfぶっこんどいて、ポチポチタスク設定すれば、比較的カンタンにイーカンジにメトリクス収集できるようになりました。
awsvpcにも対応しているのでFargateも怖くないよ。


追記(2018-02-05)

ホストのカスタムメトリクスではなく、サービスメトリクスにしてしまうのがいい気もしてきた。
……っと思ったけど、グラフ定義とか#ワイルドカードの扱いとかアレコレ考えると、サービスメトリクスだとやりにくいか。。。
やっぱり、ホストのカスタムメトリクスの方が都合がいいかも(ぉ

追記(2018-02-05 20時ごろ)

Mackerelの公式でコンテナサポートするそうです。そんなわけで本エントリの内容はPoCのママ、Deprecatedになりそうっすね。(´;ω;`)ブワッ