Monitoring nginx By New Relic Agent SDK: Qiita Advend Calendar 2014 12/02

この投稿はnginx Advent Calendar 2014の2日目の記事です。


皆さんnginxの監視にNewRelicを使用していますか? NewRelicではnginx.incが提供しているnginx web server Pluginが提供されています。 nginx Plus限定ですがupstreamやcacheの監視も行えるため、取り敢えずこのプラグインを入れておけば十分な監視を行えます。

しかし、せっかくNewRelicを使っているのでAPMとして監視をしたい! ということでNewRelic Agent SDKを使用してnginxをAPMに追加をしたいと思います。

What is NewRelic Agent SDK

NewRelic Agent SDKはNewRelic.incが提供しているAPMに登録するためのC言語で書かれたSDKです。 APM用に標準で提供されているAgentではJava、Ruby、.Net、PHP、Node.js、Pythonの言語でしか使うことができませんが、NewRelic Agent SDKを使うと他の言語や、アプリケーションを登録することができます。

Include NewRelic Agent SDK to nginx

すでにnginxのモジュールとして作成されている方がいらっしゃるので、そちらを使ってnginxに組み込みます。

1. Install NewRelic Agent SDK

まずはNewRelic Agent SDKをインストールして、パスの通ったディレクトリに配置します。

curl -L http://download.newrelic.com/agent_sdk/nr_agent_sdk-v0.16.0.0-beta.x86_64.tar.gz
tar xvz nr_agent_sdk-v0.16.0.0-beta.x86_64.tar.gz
sudo cp nr_agent_sdk-v0.16.0.0-beta.x86_64/include/*h /usr/local/include/
sudo cp nr_agent_sdk-v0.16.0.0-beta.x86_64/lib/*so /usr/local/lib/

2. Make nginx

準備が出来たらnginxとnginx NewRelic ModuleをダウンロードしてMakeします。

git clone https://github.com/yars/nginx_newrelic_module.git
curl -L http://nginx.org/download/nginx-1.6.2.tar.gz
tar xzv nginx-1.6.2.tar.gz
cd nginx-1.6.2
./configure \
  --add-module=../nginx_newrelic_module
make && make install

上記コードはnginx_newrelic_moduleの部分だけを抜粋しています。 他にもPCREなど必要なモジュールをconfigureに設定してください。

3. Configure nginx

nginxのmakeに成功したら、nginx.confに設定を追加します。

http {
    ...
    newrelic on;
    newrelic_license_key my-newrelic-key;
    newrelic_app_name my-app-name;

上記のようにnewrelicディレクティブでon/offを切り替え、newrelic_license_keyディレクティブにAPIトークンを、newrelic_app_nameディレクティブでAPMに表示するアプリケーション名を設定します。 また、APMで表示されるトランザクション名は基本的にURLになりますが、これを設定で変更することもできます。

location /some_location {
    newrelic_transaction_name some_other_name;
    ...
}

ここまで出来たらnginxを起動して、ページを表示すればNewRelicのAPMに新しいアプリケーションが登録することができます。


皆さん上手く動きましたでしょうか。 APMに登録できて何が嬉しいって、APMで使えるAvailability monitoringやAlertを使えるようになることです。

特にHerokuで静的サイトやリバースプロキシーを運用するときに、Availability monitoringが使えないとインスタンスの停止が発生してしまうため、APMは必須の機能になります。

あとはupstreamをNewRelicのexternal serviceとして登録できれば完璧なのですが、上手いフックタイミングが見当たらなくて改造するのは諦めました。 このあたり、nginxモジュールについて詳しい方がいたら教えてください。