AWSでNewRelicを使ってみる(EC2、PHPアプリ、MySQL、Apache)

AWSでリソースの監視や計測といえばCloudWatchですが、他のサービスがどんな感じか使ってみたくて試しに[NewRelic](https://newrelic.com/)を使ってみたのでその時のメモ

最終的に以下を計測するようにしてみました。

+ サーバーリソース(CPU、メモリ、ロードアベレージなど）
+ PHPアプリ(レスポンスタイム、エラー率など)
+ RDS-MySQL(SQL数、コネクション数など)
+ Apache Httpd(server statusで確認できる内容)

# とりあえあえず試す（サーバーリソース）

[AWSユーザなら無料で使えるNew Relic導入方法](http://qiita.com/kou/items/fcb75108e6e882fd12bb)

上記を参考にAmazonLinuxに適応してみました。

+ NewRelicにアカウントを作成
+ ライセンスキーを確認
+ 監視対象のEC2にSSHログインし、以下を実行(LICENSE_KEYとなっている部分は自分のライセンスキーに変更)

```
$sudo rpm -Uvh http://download.newrelic.com/pub/newrelic/el5/i386/newrelic-repo-5-3.noarch.rpm
$sudo yum install newrelic-sysmond
$sudo nrsysmond-config --set license_key=LICENSE_KEY
$sudo /etc/init.d/newrelic-sysmond start
$sudo chkconfig newrelic-sysmond on
```

これだけで以下が計測できます。

+ CPU使用率
+ ロードアベレージ
+ メモリ使用率
+ Disk I/O
+ ネットワーク
+ プロセス

![Screen Shot 2015-07-29 at 10.20.49 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/5749eca5-330e-4329-f0e5-2d68165e1fb4.png "Screen Shot 2015-07-29 at 10.20.49 PM.png")

![Screen Shot 2015-07-29 at 10.21.04 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/37d720c4-aa12-253f-a6ce-d463af3c0b0b.png "Screen Shot 2015-07-29 at 10.21.04 PM.png")

プロセスを確認できるのが便利です。どのプロセスがCPU、メモリを利用しているか確認できます。以下の例ではrootユーザーで実行されているJavaのプロセスが多くのメモリを利用していることが分かります。

![Screen Shot 2015-07-29 at 10.22.46 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/c8fa1c24-df29-46f8-3f64-c70ad441c0f6.png "Screen Shot 2015-07-29 at 10.22.46 PM.png")

なお、SecurityGroupで厳密にOutBoundの許可を行う場合、以下に接続先ホスト名、ポートの記載がありました。

[NetWorks](https://docs.newrelic.com/docs/apm/new-relic-apm/getting-started/networks#agents)


# PHPアプリの計測をしてみる

初めにPHP-infoのみ表示して確認しますが、あとでWordPress構築して確認します。
なお、MySQLは事前にRDSで作成しておいて、エンドポイント、DBのユーザー名、DBパスワードをメモしておいてください。

以下のコマンドを順番に実行していき、必要なものをインストールします。なお、SQL実行の箇所はユーザー名はroot、パスワードはpassword、RDSのエンドポイントはwordpress.cfunxik4b0cn.ap-northeast-1.rds.amazonaws.com という場合の設定となるので適宜変更してください。

```
# install httpd
sudo yum install -y httpd
sudo chkconfig httpd on
sudo service httpd start

# install application dependencies
sudo yum install php php-mysql php-gd php-mbstring -y
sudo yum install mysql -y

#exec sql
mysql -u root -ppassword -h wordpress.cfunxik4b0cn.ap-northeast-1.rds.amazonaws.com <<EOF
CREATE USER'wordpress-user'@'%' IDENTIFIED BY 'wordpress';
CREATE DATABASE \`wordpress\`;
GRANT ALL PRIVILEGES ON \`wordpress\`.*TO"wordpress-user"@"%";
FLUSH PRIVILEGES;
EOF
```

準備ができたので次にPHPアプリの計測を行うためのエージェントの設定をしていきます。

[PHP agent installation: RedHat and CentOS](https://docs.newrelic.com/docs/agents/php-agent/installation/php-agent-installation-redhat-centos)

インストールします。

```
$sudo yum install newrelic-php5
```

実行します。

```
$sudo newrelic-install install
```

実行の途中でライセンスキーの入力を求められるので入力します。
これで完了です。

試しにphpinfoを表示してみます。

```
$sudo vi  /var/www/html/phpinfo.php
```

```lang:phpinfo.php
<?php phpinfo(); ?>
```

httpdの再起動

```
$sudo service httpd restart
```

ブラウザで確認するとインストールしたPHPのバージョンなど確認できました。(http://{Public IP}/phpinfo.php)

この状態でNewRelicのサイトを見るとPHPのアプリケーションが登録されているのが確認できます。

これだけだと面白く無いのでWordPressをインストールして情報を取得してみます。

```
$sudo yum install -y git
$cd /var/www/html/
$sudo git clone https://github.com/WordPress/WordPress.git
$sudo chown -R apache:apache WordPress
$sudo chmod -R 744 WordPress
$sudo service httpd restart
```

ブラウザでアクセスしてみます。(http://{Public IP}/WordPress)

WordPressの設定します。

+ データベース名->wordpress
+ ユーザー名->root
+ パスワード->password
+ データベースのホスト名->wordpress.cfunxik4b0cn.ap-northeast-1.rds.amazonaws.com

設定が完了しました。

NewRelicでは以下が確認できました。

+ レスポンスタイム
+ Apdex(New Relic独自指標)
+ スループット
+ エラー率

![Screen Shot 2015-07-29 at 10.46.43 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/dbbade89-c340-8d8d-6ada-b5e53f793140.png "Screen Shot 2015-07-29 at 10.46.43 PM.png")

![Screen Shot 2015-07-29 at 10.46.56 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/639bec28-7f74-0269-8e14-77edc5d76d0f.png "Screen Shot 2015-07-29 at 10.46.56 PM.png")


Apdex(New Relic独自指標)については以下に説明がありました。

[New Relicを使ってる人に見て欲しい指標。「Apdex」](http://qiita.com/g08m11/items/70d730593458ae0f1a55)

また、特定のリクエストを選択するとそのリクエストの中でどこに時間がかかっているかも確認できます。

![Screen Shot 2015-07-29 at 10.47.38 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/ad6eda70-324b-4675-5764-0fa275af4942.png "Screen Shot 2015-07-29 at 10.47.38 PM.png")

![Screen Shot 2015-07-29 at 10.47.57 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/cdeab8d9-77b0-0fa0-d9b7-8acbedd9eb2f.png "Screen Shot 2015-07-29 at 10.47.57 PM.png")

これを使えばボトルネックの検出にも役に立ちそうですね。

# MySQLの計測を行う

[New RelicでMySQLを詳細に監視する](http://qiita.com/kou/items/0370dde20b74f23709c1)

上記が参考になりました。

まず、MySQLに監視用のユーザーを作成します。本例では **newrelic** ユーザーとして作成しました。

```
$mysql -u root -ppassword -h wordpress.cfunxik4b0cn.ap-northeast-1.rds.amazonaws.com
mysql> CREATE USER newrelic@'%' IDENTIFIED BY 'newrelic';
mysql> GRANT PROCESS,REPLICATION CLIENT ON *.* TO newrelic@'%';
```

準備ができたので、インストールを行います。いくつかインストール方法があるようですが、New Relic Platform Installerというのを使ってやってみます。下記は参考。

[newrelic-platform/newrelic_mysql_java_plugin](https://github.com/newrelic-platform/newrelic_mysql_java_plugin)

[Getting Started with the Platform Installer](https://discuss.newrelic.com/t/getting-started-with-the-platform-installer/842)

以下のコマンドを実行してインストール。

```
$LICENSE_KEY=YOUR_KEY_HERE bash -c "$(curl -sSL https://download.newrelic.com/npi/release/install-npi-linux-redhat-x64.sh)"
```

上記により、/home/{user}/newrelic-npiフォルダが作成されます。

以下により、MySQLプラグインをインストールします。コマンド実行時に色々確認されます。

```
$cd ~/newrelic-npi/
$./npi install npi install com.newrelic.plugins.mysql.instance
```

途中でどのDBに接続するかなどの情報を聞かれますので以下のように設定します。（設定は適宜変更）

```
{
  "agents": [
    {
      "name"    : "WordPressDB",
      "host"    : "wordpress.cfunxik4b0cn.ap-northeast-1.rds.amazonaws.com",
      "metrics" : "status,newrelic",
      "user"    : "newrelic",
      "passwd"  : "newrelic"
    }
  ]
}
```

設定が正しければNewRelicのPluginページで詳細を確認できるようになります。

また、インストールのタイミングで`/etc/init.d/newrelic_plugin_com.newrelic.plugins.mysql.instance`ができているのでOS再起動の際にも自動で起動する設定になっているようです。

サービスの起動などは以下のコマンドで実行できます。

```
$sudo service newrelic_plugin_com.newrelic.plugins.mysql.instance start
Starting newrelic_plugin_com.newrelic.plugins.mysql.instance
```

NewRelicでは以下について確認できるようでした。

+ SQL数(readとwrite)
+ データベースコネクション数
+ ネットワークトラフィック

![Screen Shot 2015-07-29 at 10.28.14 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/eb692b2b-257c-3cee-bfd6-9c45b6ae19b1.png "Screen Shot 2015-07-29 at 10.28.14 PM.png")


![Screen Shot 2015-07-29 at 10.28.23 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/190b4a7b-5be9-b16c-d14e-7ef2353d9c90.png "Screen Shot 2015-07-29 at 10.28.23 PM.png")

# httpdの計測も行う

[MeetMe/newrelic-plugin-agent](https://github.com/MeetMe/newrelic-plugin-agent#installation-instructions)

httpdの計測もプラグインを使ってできるようです。ただし、MySQLプラグインとは別のやり方になるようです。。うーん、これ統一されないのかな。。。

pythonのpipを使うみたいで、2.6か2.7の必要があるので確認します。

```
$python -V
Python 2.7.9
```

インストール、設定を行います。

```
# install
$sudo  pip install newrelic-plugin-agent

# create folder(if it doesn't exsit)
$sudo mkdir /etc/newrelic
$sudo mkdir /var/log/newrelic
$sudo mkdir /var/run/newrelic

# copy config and init.d file
$sudo cp /opt/newrelic-plugin-agent/newrelic-plugin-agent.cfg /etc/newrelic/
$sudo cp /opt/newrelic-plugin-agent/newrelic-plugin-agent.rhel /etc/init.d/newrelic-plugin-agent
$sudo chmod 755 /etc/init.d/newrelic-plugin-agent
```

デーモン実行ユーザーをrootに変更します。
また、ライセンスキーを変更します。

```lang:/etc/newrelic/newrelic-plugin-agent.cfg
- license_key: REPLACE_WITH_REAL_KEY
+ license_key: YOUR_LICENCE_KEY

-  #apache_httpd:
-  #  name: hostname
-  #  scheme: http
-  #  host: localhost
-  #  verify_ssl_cert: true
-  #  port: 80
-  #  path: /server-status

+  apache_httpd:
+    name: WordPress
+    scheme: http
+    host: localhost
+  #  verify_ssl_cert: true
+    port: 80
+    path: /server-status
```

起動スクリプトも変えます。

```lang:/etc/newrelic/newrelic-plugin-agent.cfg
- APP="/usr/bin/newrelic-plugin-agent"
+ APP="/usr/local/bin/newrelic-plugin-agent"
```

Apacheのserver status pageの表示を有効化にするため、httpdの設定を変更します。また、より詳細な情報を表示するためにExtendedStatusを有効化します。ExtendedStatusを有効にするとサーバーの動作が遅くなることもあるようなので本番の環境でやる場合には注意が必要だと思います。

```lang:/etc/httpd/conf/httpd.conf

- #ExtendedStatus On
+ ExtendedStatus On

- #<Location /server-status>
- #    SetHandler server-status
- #    Order deny,allow
- #    Deny from all
- #    Allow from .example.com
- #</Location>

+ <Location /server-status>
+     SetHandler server-status
+     Order deny,allow
+     Deny from all
+     Allow from 127.0.0.1
+ </Location>
```

httpdサービスを再起動します。

```
$sudo service httpd restart
```

newrelicプラグインのサービスを起動します。

```
$sudo /etc/init.d/newrelic-plugin-agent start
```

ログは`/var/log/newrelic/newrelic-plugin-agent.log`以下で確認できます。


確認できる内容は以下に記載があります。

[Apache モジュール mod_status](http://httpd.apache.org/docs/2.2/ja/mod/mod_status.html)

![Screen Shot 2015-07-30 at 10.28.06 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/37a60d7f-1bbe-f9e9-3bc2-8eaee19a5d9f.png)

![Screen Shot 2015-07-30 at 10.28.16 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/639c3dcb-fc6a-0d9e-3a3c-3a7268e6c571.png)