えいのうにっき

a-knowの日記です

アプリケーションサーバーのモニタリング 〜 mackerel-plugin-unicorn を読み解く

この記事は、Mackerel アドベントカレンダー(全部CRE)の23日目の記事です。アドベントカレンダーも大詰めですが、だいぶしんどくなってきてます!! こんなときはそう、プラグイン読み解きシリーズ!今回は mackerel-plugin-unicorn です!

github.com

僕は、今でこそCREというお仕事に従事しておりますが、前職では Ruby(Rails)でのアプリケーション開発をおこなうのが主業務である、ソフトウェアエンジニアでした。そういうこともあり、unicornには大変お世話になりました。今こそ、その恩を返すとき!(?)

当記事が前提とするバージョン

この記事を書いている今の最新版である、mackerel-agent-plugins の v0.53.0 を前提としています。

Releases · mackerelio/mackerel-agent-plugins · GitHub

どんなプラグイン?

このプラグインは mackerel-plugin-unicorn という名前のとおり、Ruby製アプリケーションサーバー・unicornの稼働状況をモニタリングするためのプラグインです。

github.com

インストールと設定手順

mackerel-plugin-unicorn プラグインは、Mackerelがプラグイン集として提供しているパッケージ、 mackerel-agent-plugins に含まれています。以下のようなコマンドでインストールすることができます。

$ yum install mackerel-agent-plugins
$ apt-get install mackerel-agent-plugins

詳細は下記ヘルプページも参照してください。

mackerel.io

インストール先は /usr/bin/mackerel-plugin-unicorn です(他のプラグインも同じ場所にインストールされています)。この状態で、mackerel-plugin-unicorn を手動実行することも可能です。このプラグインに限らず、Mackerelのプラグインは要はコマンドですので、手動でも実行する事ができます。

設定ファイルである mackerel-agent.conf は、デフォルトでは /etc/mackerel-agent/mackerel-agent.conf にインストールされます。mackerel-plugin-unicorn を使う際の conf への追記内容などは、README.md に記載されていますので、ご確認ください。

mackerel-agent-plugins/README.md at master · mackerelio/mackerel-agent-plugins · GitHub

conf への追記ができたら、mackerel-agentを再起動することで設定完了です。

取得されるメトリック

このプラグインにより取得され、Mackerelにグラフ描画されるメトリックについて、以下に各グラフ定義ごとに説明します。 また表中の diff とは、プラグイン側で差分値計算をするかどうかについて示しており、 となっている項目はプラグインの処理として「前回の実行時の値と差分」を計算し出力しています(データソースがいわゆるカウンターメトリックで単調増加する値)。diff となっている値に関しては差分値ですが、それ以外の値はすべて、プラグイン実行時・その瞬間のときの値となります。

Memory

ラベル名 メトリック名 diff 説明
Workers custom.unicorn.memory.memory_workers - コマンド ps auxw | grep [u]nicorn | grep -v master | awk {m+=$6*1024} END{print m;} を実行した結果(psコマンドで得られる、unicorn の master プロセス以外のプロセスの RSS 列の合計値がベース)
Master custom.unicorn.memory.memory_master - コマンド ps auxw | grep [u]nicorn | grep master | awk {m=$6*1024} END{print m;} を実行した結果(psコマンドで得られる、unicorn の master プロセスの RSS 列の値がベース)
Worker Average custom.unicorn.memory.memory_workeravg - custom.unicorn.memory.memory_workers の値を unicorn worker プロセスの数で割った値

Workers

ラベル名 メトリック名 diff 説明
Idle Workers custom.unicorn.workers.idle_workers - プラグイン実行タイミングのCPUカウンタ(/proc/<pid>/stat から取得)と、その1秒後のCPUカウンタの差がゼロであった worker unicorn プロセスの数。
Busy Workers custom.unicorn.workers.busy_workers - unicorn worker プロセスの数と、custom.unicorn.workers.idle_workers の値との差。

以上、5種類のメトリックとなります。こうしてみるとさらっと書いてるように見えるかもしれませんが、プラグインでの実装を見ると awk を駆使していたりもして、だいぶ頑張っていることがわかります。苦労がにじみ出ている......。。

実装に興味を覚えた方は、ぜひちらっとでも見てみていただければと!→ mackerel-agent-plugins/mackerel-plugin-unicorn/lib at master · mackerelio/mackerel-agent-plugins · GitHub

利用可能なオプション

-pidfile

必須オプションです。unicorn の pid ファイルをフルパスで指定する必要があります。

-metric-key-prefix

このプラグインで取得されるメトリック、描画されるグラフのラベルなどに prefix を付与することができます。これを活用することにより、ひとつのホスト内で複数のunicornサーバーが稼働していたとしても、それぞれを個別にモニタリングすることが可能です。こんな↓かんじ。

[plugin.metrics.unicorn]
command = "mackerel-plugin-unicorn -pidfile=/var/www/app/shared/tmp/pids/unicorn.pid"

[plugin.metrics.unicorn_foobar]
command = "mackerel-plugin-unicorn -pidfile=/var/www/foobar/shared/tmp/pids/unicorn.pid -metric-key-prefix=foobar"

まとめ

unicornのモニタリングに使えるプラグイン、mackerel-plugin-unicorn を解説しました。僕も、ちょっと前まで趣味でも Rails + unicorn で趣味Webアプリを運用していて、そこでもこのプラグインをドッグフーディングしていたのですが、今はもう全部Goにリプレースしてしまっており、それもあってグラフのスクショとかも出せずでした。スクショの一枚でも残しておけばよかったなぁ(´・ω・`)。

上記の通り、メトリック種類は5つと多くはないですが、厳選されている印象も受けました。例えば、負荷試験実施期間中や本番ローンチ前とかに worker プロセスの調整をする際に活用する、とか、他にもあれこれ使ってもらえるのではないでしょうか!