前回の記事で、リバースプロキシ構成の Mastodon インスタンスを全てコンテナで構築した。
今回は、この Mastodon インスタンスの監視(メトリックの取得)を Mackerel を使ってやってみる。Mastodon インスタンスの監視に Mackerel を使ってみている、という人もいると思うのだけど、ここで書いている内容は Mackerel の無料プランである Free プランでも利用できるので、ぜひ試してみてほしい。
念のため断っておくと、ぼくは一応 Mackerel のセールスエンジニア、つまり「中の人」であるが、技術的には中立(?)的に書いているつもり。また、docker(コンテナ)についてはかなりの初心者なので、よくないところがあったら教えて ( ゚Д゚) ホスィ...
まずは下準備
1. Mackerel API キーの生成【Mackerel 画面での作業】
別にデフォルトの API キーを使ってもいいのだけど、コンテナで動作させる mackerel-agent 用の API キーを別途作成しておく。
API キーの生成は https://mackerel.io/my?tab=apikeys ここから行える。
2. mackerel 用のワーキングディレクトリを作成する【Mastodon インスタンス内での作業】
これも別に必須ではないけど、前回 までの作業の流れもあり、なんとなく。
$ ssh mstdn.a-know.me $ mkdir mackerel
Mastodon インスタンスのシステムメトリックを取得してみる
つづいて、各種 docker コンテナが稼働している Mastodon インスタンス自体のシステムメトリックを取得してみる。「システムメトリックってなんぞ?」という人は、手前味噌ではあるが↓の記事も見てもらえたらと。
3. mackerel-agent コンテナ用の docker-compose.yml を用意する【Mastodon インスタンス内での作業】
Mackerel でサーバの監視・メトリックの取得を行なう場合、mackerel-agent というエージェントソフトウェアをインストールするのが最もポピュラーかつ簡単な方法。今回のように docker コンテナだけで稼働しているサーバの場合、
- ホストインスタンスにエージェントを普通にインストールする
- エージェントもコンテナとして起動させる
という、2つの方法がある。そう、mackerel-agent は docker コンテナイメージも配布されてるのだ。
今回の Mastodon インスタンスも、ここまで全てコンテナで頑張れてこれてるので、エージェントもコンテナで起動させてみる。
そして、ここまでの作業ですっかり「docker-compose、楽じゃん」という気持ちになってしまったので、mackerel-agent も docker-compose.yml を作成して docker-compose up
することにする。(もしかしたら良くない方法なのかもしれない。)
docker コンテナの監視については Mackerel の公式ヘルプにも記載があるので、それを参考に記述してみた。 <api_key>
には、1. で生成した API キーを指定する。
4. mackerel-agent コンテナを起動してみる【Mastodon インスタンス内での作業】
yml ができたら、起動してみる。
$ docker-compose up -d Creating network "mackerel_default" with the default driver Pulling proxy (mackerel/mackerel-agent:latest)... latest: Pulling from mackerel/mackerel-agent 93857f76ae30: Pull complete 6e4002097358: Pull complete 2eb7ed68dd9e: Pull complete 59e0ab41298d: Pull complete 85d2a4df1061: Pull complete Digest: sha256:c29228037a1600726daff1248fdaf37c376a2275b9ba636f83b622fb3c8c5da0 Status: Downloaded newer image for mackerel/mackerel-agent:latest Creating mackerel-agent-container a-know@mstdn:~/mackerel$ docker-compose ps Name Command State Ports ------------------------------------------------------ mackerel-agent-container /startup.sh Up
これだけで、あとは少しだけ待てば、そのホストのシステムメトリックが Mackerel 上で確認できるようになる。Mackerel のホスト一覧に hostname
で指定した名前で登録されているはずだ。
「コンテナとして起動してるけどホストの情報は取れる」ということに少し驚いたけど、Mackerel の生みの親(?)、 id:stanaka さんの↓のスライドの4ページ目にもあるように、むしろホスト全体については見える、んだな。んー、まだまだコンテナ技術そのものについての自分の理解の浅さを感じるなぁ。
(2014年と少し古い資料なので注意)
5. Mackerel サービス・ロールを作成する【Mackerel 画面】
これも別に必須の作業ではないのだけど。
まずは https://mackerel.io/my/services#create ここから、「サービス」を作成する。今回ぼくは「mastodon」というサービスを作成した。
さらにそのサービス内で「ロール」も作成する。普通は「db」や「web」などと付けるのだけど、今回のホストはリバースプロキシや mastodon の本体など、全部入りなので、安直ではあるけど「all」としてみた。
これだけでは「サービス」「ロール」というハコが出来ただけに過ぎないので、これらにサーバを紐つける。紐付けの仕方はいくつかあるのだけど、対象ホストの設定画面から設定してみよう。
こんなかんじ。
同じサーバ上で稼働している Docker のメトリックを取得する
続いて、そのサーバ内で稼働している Docker 全体のメトリックを取得してみる。
6. 3. で作った yml の environment に enable_docker_plugin=true
を追加し、再度起動しなおす【Mastodon インスタンス内での作業】
- で作った yml の environment に
enable_docker_plugin=true
を追加し、再度起動しなおすと、そのホスト上で稼働しているコンテナ全てが「カスタムメトリック」として自動的に追加される。
こんなかんじで、各コンテナのリソース消費の統計情報が「カスタムメトリック」としてグラフになる(「システムメトリック」以外のホストメトリックを指して「カスタムメトリック」と呼ぶ)。
これで見られる各値は docker stats
により得られるもので、このドキュメントでも詳しく解説されている。mackerel のカスタムメトリックとして見えているものは、このページでいうところの CPU メトリクスとメモリメトリクス、そしてBlock I/O メトリクスになる。
他のコンテナのプロセスのメトリックを取得する【Mastodon インスタンス内での作業】
そしていよいよさいごの仕上げ。ここでは試しに、「mackerel-agent コンテナから、Mastodon 用に立ててある nginx コンテナの /nginx_status
( ngx_http_stub_status_module )の値を取得する」ことを試してみる。
7. ngx_http_stub_status_module の有効化
まずなによりも、Mastodon 用に立ててある nginx の ngx_http_stub_status_module を有効化する必要がある。前回までの作業で、Mastodon のプロジェクトルートに setting/nginx/conf.d/default.conf
として conf ファイルを作成しているので、これに以下の設定を追記する。
12345
というポートからその適当感はわかってもらえるかと思う。 deny
も allow
も指定してないけど、今回の構成だと前段にリバースプロキシの nginx が別にいるから大丈夫、、なはず。
8. 監視用のポートを公開する【Mastodon インスタンス内での作業】
上記 12345
ポートを外に公開できるよう、Mastodon 用の docker-compose.yml(Mastodon のプロジェクトルートにあるやつ)を編集する。
こんなかんじ?追記ができたら、コンテナを起動しなおすとー。
$ docker-compose ps Name Command State Ports ----------------------------------------------------------------------------------------------------------------------------- mastodon_app_1 irb Exit 0 mstdn-db docker-entrypoint.sh postgres Up 5432/tcp mstdn-redis docker-entrypoint.sh redis ... Up 6379/tcp mstdn-sidekick bundle exec sidekiq -q def ... Up 3000/tcp, 4000/tcp mstdn-streaming npm run start Up 3000/tcp, 0.0.0.0:4000->4000/tcp mstdn-web bundle exec rails s -p 300 ... Up 0.0.0.0:3000->3000/tcp, 4000/tcp mstdn-nginx nginx -g daemon off; Up 0.0.0.0:12345->12345/tcp, 443/tcp, 80/tcp, 0.0.0.0:9090->9090/tcp
0.0.0.0:12345->12345/tcp
とあるので、よさそう。
一応、ちゃんと動作しているかどうかを nginx コンテナ内で確認しておく。
$ docker-compose exec nginx /bin/sh # wget http://localhost:12345/nginx_status -O - Connecting to localhost:12345 (127.0.0.1:12345) Active connections: 1 server accepts handled requests 11 11 11 Reading: 0 Writing: 1 Waiting: 0
curl が無かったので wget でムリヤリ確認。大丈夫そう!
9. mackerel-agent 用の追加の conf を作る【Mastodon インスタンス内での作業】
「mackerel-agent コンテナから、Mastodon 用に立ててある nginx コンテナの /nginx_status
( ngx_http_stub_status_module )の値を取得する」には、mackerel-agent に別途プラグインを追加設定する必要がある。今回のケースだと、用いるプラグインは mackerel-plugin-nginx
(その他のプラグインも GitHub - mackerelio/mackerel-agent-plugins: Plugins for mackerel-agent ここで全てを確認できる)。
そのために、以下のような内容の conf ファイルを /etc/mackerel-agent/conf.d/mstdn-nginx.conf
に配置する。
$ cat /etc/mackerel-agent/conf.d/mstdn-nginx.conf [plugin.metrics.mstdn-nginx] command = "mackerel-plugin-nginx -scheme='http' -host=mstdn-nginx -port=12345"
host
オプションに指定している mstdn-nginx
については、次のステップで出てくる。
10. mackerel-agent への設定の追加【Mastodon インスタンス内での作業】
mackerel-agent のための docker-compose.yml を、以下のように追加編集する。
以下のように、いろいろ追加している。
environment
にinclude=/etc/mackerel-agent/conf.d/*.conf
を追加- で作成した conf ファイルを mackerel-agent が読み込めるようにするために追加。
external_links
でmstdn-nginx:mstdn-nginx
を追加- 別 docker-compose で起動しているコンテナのうち、
mstdn-nginx
を、このコンテナ内でmstdn-nginx
として識別できるように設定追加。 <対象コンテナ名>:<エイリアス名>
っていうイメージかな。- もし同じ docker-compose 内で扱っているコンテナとリンクしたいなら、
links
でよさそう。
- 別 docker-compose で起動しているコンテナのうち、
volumes
で/etc/mackerel-agent/conf.d:/etc/mackerel-agent/conf.d:ro
を追加- で作成した conf ファイルにコンテナからアクセスできるように。
networks
でback-mstdn
を追加- external_links で指定した
mstdn-nginx
コンテナはback-mstdn
に属しているので、このエージェントもその network に所属させる。
- external_links で指定した
...こんなかんじの理解なんだけど、大丈夫かな?(勘で触っている奴)
11. mackerel-agent のコンテナを再起動させる【Mastodon インスタンス内での作業】
再起動ってどうやればいいんだろ。w
$ docker-compose down Stopping mackerel-agent-container ... done Removing mackerel-agent-container ... done Removing network mackerel_default $ docker-compose up -d Creating mackerel-agent-container
mackerel-agent のコンテナ内で確認をしてみる。まずは nginx コンテナへの接続確認。接続先ホストは、10. でも書いているとおり、 mstdn-nginx
でアクセスできるはずだ。
$ docker-compose exec mackerel-agent /bin/sh # curl http://mstdn-nginx:12345/nginx_status Active connections: 1 server accepts handled requests 10 10 10 Reading: 0 Writing: 1 Waiting: 0
オッケオッケ!
続いてプラグインの動作確認。mackerel のプラグインは、コマンドラインで実行しても標準出力として結果を得られるので、設定ファイル内で command
に指定しているコマンド文字列をそのまま手動実行してやることで、その動作の確認が行えるのだ( メトリック名<tab>メトリック値<tab>エポック秒
の形式で出力されていれば ok)。
# mackerel-plugin-nginx -scheme='http' -host=mstdn-nginx -port=12345 nginx.connections.connections 1.000000 1494640050 nginx.requests.accepts 6.000000 1494640050 nginx.requests.handled 6.000000 1494640050 nginx.requests.requests 6.000000 1494640050 nginx.queue.reading 0.000000 1494640050 nginx.queue.writing 1.000000 1494640050 nginx.queue.waiting 0.000000 1494640050
うほっ、いい結果!
12. Mackerel の画面を確認してみる【Mackerel 画面での作業】
Mackerel の画面で対象ホストの詳細画面を開き、カスタムメトリック欄を確認してみるとー。
わーい、グラフ出てるよー!
おわり
てなかんじで、
- mackerel-agent のコンテナの起動
- それによる docker ホスト自体の監視(システムメトリックの取得)
- 同じサーバ上で稼働している Docker のメトリックを取得する
- 同じサーバ上で稼働している他コンテナのメトリックを取得する
といったことが行えた!わいわい!
ぼくは、Mackerel についてはあるていど詳しいという自負はあるのだけど、いかんせん Docker / コンテナ技術についてはまだふわふわしてる状態なので、これからもどんどん使ってみていくことで慣れていこうと思う!