読者です 読者をやめる 読者になる 読者になる

えいのうにっき

主に Web 系技術ネタ。背景画像 is powered by grass-graph.shitemil.works

docker コンテナ(docker-compose)で稼働している Mastodon を Mackerel で監視してみる

前回の記事で、リバースプロキシ構成の Mastodon インスタンスを全てコンテナで構築した。

今回は、この Mastodon インスタンスの監視(メトリックの取得)を Mackerel を使ってやってみる。Mastodon インスタンスの監視に Mackerel を使ってみている、という人もいると思うのだけど、ここで書いている内容は Mackerel の無料プランである Free プランでも利用できるので、ぜひ試してみてほしい。

念のため断っておくと、ぼくは一応 Mackerel のセールスエンジニア、つまり「中の人」であるが、技術的には中立(?)的に書いているつもり。また、docker(コンテナ)についてはかなりの初心者なので、よくないところがあったら教えて ( ゚Д゚) ホスィ…

まずは下準備

1. Mackerel API キーの生成【Mackerel 画面での作業】

別にデフォルトの API キーを使ってもいいのだけど、コンテナで動作させる mackerel-agent 用の API キーを別途作成しておく。

API キーの生成は https://mackerel.io/my?tab=apikeys ここから行える。

f:id:a-know:20170513190805p:plain

2. mackerel 用のワーキングディレクトリを作成する【Mastodon インスタンス内での作業】

これも別に必須ではないけど、前回 までの作業の流れもあり、なんとなく。

$ ssh mstdn.a-know.me
$ mkdir mackerel

Mastodon インスタンスのシステムメトリックを取得してみる

つづいて、各種 docker コンテナが稼働している Mastodon インスタンス自体のシステムメトリックを取得してみる。「システムメトリックってなんぞ?」という人は、手前味噌ではあるが↓の記事も見てもらえたらと。

blog.a-know.me

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 キーを指定する。

mackerel.io

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 で指定した名前で登録されているはずだ。

f:id:a-know:20170513191457p:plain

f:id:a-know:20170513191508p:plain

「コンテナとして起動してるけどホストの情報は取れる」ということに少し驚いたけど、Mackerel の生みの親(?)、 id:stanaka さんの↓のスライドの4ページ目にもあるように、むしろホスト全体については見える、んだな。んー、まだまだコンテナ技術そのものについての自分の理解の浅さを感じるなぁ。

speakerdeck.com

(2014年と少し古い資料なので注意)

5. Mackerel サービス・ロールを作成する【Mackerel 画面】

これも別に必須の作業ではないのだけど。

まずは https://mackerel.io/my/services#create ここから、「サービス」を作成する。今回ぼくは「mastodon」というサービスを作成した。

f:id:a-know:20170514063851p:plain

さらにそのサービス内で「ロール」も作成する。普通は「db」や「web」などと付けるのだけど、今回のホストはリバースプロキシや mastodon の本体など、全部入りなので、安直ではあるけど「all」としてみた。

f:id:a-know:20170514063901p:plain

これだけでは「サービス」「ロール」というハコが出来ただけに過ぎないので、これらにサーバを紐つける。紐付けの仕方はいくつかあるのだけど、対象ホストの設定画面から設定してみよう。

f:id:a-know:20170513191736p:plain

f:id:a-know:20170513191834p:plain

こんなかんじ。

同じサーバ上で稼働している Docker のメトリックを取得する

続いて、そのサーバ内で稼働している Docker 全体のメトリックを取得してみる。

6. 3. で作った yml の environment に enable_docker_plugin=true を追加し、再度起動しなおす【Mastodon インスタンス内での作業】

  1. で作った yml の environment に enable_docker_plugin=true を追加し、再度起動しなおすと、そのホスト上で稼働しているコンテナ全てが「カスタムメトリック」として自動的に追加される。

f:id:a-know:20170513191911p:plain

こんなかんじで、各コンテナのリソース消費の統計情報が「カスタムメトリック」としてグラフになる(「システムメトリック」以外のホストメトリックを指して「カスタムメトリック」と呼ぶ)。

これで見られる各値は 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 というポートからその適当感はわかってもらえるかと思う。 denyallow も指定してないけど、今回の構成だと前段にリバースプロキシの 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 を、以下のように追加編集する。

以下のように、いろいろ追加している。

  • environmentinclude=/etc/mackerel-agent/conf.d/*.conf を追加
      1. で作成した conf ファイルを mackerel-agent が読み込めるようにするために追加。
  • external_linksmstdn-nginx:mstdn-nginx を追加
    • 別 docker-compose で起動しているコンテナのうち、 mstdn-nginx を、このコンテナ内で mstdn-nginx として識別できるように設定追加。
    • <対象コンテナ名>:<エイリアス名> っていうイメージかな。
    • もし同じ docker-compose 内で扱っているコンテナとリンクしたいなら、 links でよさそう。
  • volumes/etc/mackerel-agent/conf.d:/etc/mackerel-agent/conf.d:ro を追加
      1. で作成した conf ファイルにコンテナからアクセスできるように。
  • networksback-mstdn を追加
    • external_links で指定した mstdn-nginx コンテナは back-mstdn に属しているので、このエージェントもその network に所属させる。

…こんなかんじの理解なんだけど、大丈夫かな?(勘で触っている奴)

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 の画面で対象ホストの詳細画面を開き、カスタムメトリック欄を確認してみるとー。

f:id:a-know:20170513192531p:plain

わーい、グラフ出てるよー!

おわり

てなかんじで、

  • mackerel-agent のコンテナの起動
  • それによる docker ホスト自体の監視(システムメトリックの取得)
  • 同じサーバ上で稼働している Docker のメトリックを取得する
  • 同じサーバ上で稼働している他コンテナのメトリックを取得する

といったことが行えた!わいわい!

ぼくは、Mackerel についてはあるていど詳しいという自負はあるのだけど、いかんせん Docker / コンテナ技術についてはまだふわふわしてる状態なので、これからもどんどん使ってみていくことで慣れていこうと思う!



follow us in feedly