New RelicでMySQLを詳細に監視する

クラウド時代の運用監視サービス「[New Relic](http://newrelic.com/)」にMySQLを監視するためのPLUGINをインストールする方法をまとめてみました。



# 前提
- New Relicのアカウントを取得済みであること
    - まだ取得されてない方は[こちら](http://qiita.com/kou/items/fcb75108e6e882fd12bb)をどうぞ
- 動作環境
    - 監視エージェントを実行するサーバにJava1.6以上がインストールされていること
    - 監視エージェントを実行するサーバにMySQLクライアントがインストールされていること
    - 監視対象のMySQLが5.0以上であること


# 事前準備
MySQLに監視用アカウントの作成を行います

```sql
mysql> CREATE USER newrelic@'%' IDENTIFIED BY 'himitsu';
mysql> GRANT PROCESS,REPLICATION CLIENT ON *.* TO newrelic@'%';
```

ユーザ名や接続許可するネットワークなどは適宜変更してください


# New Relic Platform Installerのインストール
- New RelicのPluginsを簡単に導入することができるインストーラーです。通称npiと云います
- npiのインストールにはNew Relicのライセンスキーが必要です
- 各プラットフォームごとにインストーラーが用意されていますので、こちらのページから監視エージェントを稼働させるサーバに適したものを選択してください
    - https://discuss.newrelic.com/t/getting-started-with-the-platform-installer/842
- 下記はRed Hat/CentOSのx64でのインストール例です
    - **YOUR_KEY_HERE**にあなたのNew Relicのライセンスキーに置き換えてください
    - デフォルトでは**$HOME**にインストールされますが、**PREFIX**を指定することで任意のディレクトリにインストールすることができます

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

You are about to download the New Relic Platform Installer v0.1.5.
This will download the 'npi' tool from the following URL: https://download.newrelic.com/npi/v0.1.5/platform_installer-linux-x64-v0.1.5.tar.gz
It will place the tool at '/home/foo/newrelic-npi'.  It will not affect your path or global settings.

Are you sure you want to continue? (y/n) y
Setting default configurations
  user -> foo
  license_key -> YOUR_KEY_HERE
  distro -> redhat
Successfully setup the New Relic Platform Installer!

Next steps:
  - Navigate to the directory: '/home/foo/newrelic-npi'
  - Run './npi available' to get a list of available plugins
  - Run './npi install <plugin>' to download, configure and start a plugin
  - For additional help run the following './npi --help'

```

# MySQL Pluginのインストール

## インストール手順
対話型インストーラーで必要な情報を入力していきます

```shell-session
$ /home/foo/newrelic-npi
$ ./npi install nrmysql
Enter your New Relic license key (YOUR_KEY_HERE):　→初期値と異なるNew Relicライセンス設定する場合はここから入力してください
[08:58:11] [INFO] operations - Using license key: YOUR_KEY_HERE
[08:58:11] [INFO] operations - Fetching the plugin to your file system...
You are about to download the following plugin:
- com.newrelic.plugins.mysql.instance:
  - Details:
      download_url           https://github.com/newrelic-platform/newrelic_mysql_java_plugin/raw/master/dist/newrelic_mysql_plugin-2.0.0.tar.gz
      implementation         Java
      publisher_name         New Relic Inc.
      publisher_support_url  https://support.newrelic.com/home
      version                2.0.0

Are you sure you want to continue? (y/n): y
[08:58:16] [INFO] platform_helpers - Downloading compressed archive for 'com.newrelic.plugins.mysql.instance'...
[08:58:24] [INFO] platform_helpers - Extracting archive for 'com.newrelic.plugins.mysql.instance'...

Current state for the plugin: com.newrelic.plugins.mysql.instance
- com.newrelic.plugins.mysql.instance:
  - State:
      Downloaded   [x]
      Prepared     [ ]
      Installed    [ ]
      Running      [ ]

[08:58:24] [INFO] operations - Configuring the plugin to run...
[08:58:24] [INFO] operations - Generating 'newrelic.json' file for plugin...
Configure the plugin in a text editor before continuing? (y/n): y　→監視対象のDB情報を設定します

Current state for the plugin: com.newrelic.plugins.mysql.instance
- com.newrelic.plugins.mysql.instance:
  - State:
      Downloaded   [x]
      Prepared     [x]
      Installed    [ ]
      Running      [ ]

[08:59:13] [INFO] operations - Setting the plugin as a background process...
Do you want to set this plugin as a background process? (y/n): y  ←ここでyとすれば監視エージェントがバックグラウンドで起動します
```

## 設定ファイル
対話インストール中に編集するplugin.jsonファイル

```
{
  "agents": [
    {
      "name"    : "Localhost",  →監視画面の表示に使う表示名
      "host"    : "localhost",   →監視対象のサーバ名
      "metrics" : "status,newrelic",
      "user"    : "USER_NAME_HERE",   →監視用のデータベース接続ユーザ名
      "passwd"  : "USER_PASSWD_HERE"   →監視用ユーザのパスワード
    }
  ]
}
```

### 複数データベースの監視
複数のデータベースサーバを監視したい場合は下記のようにします

```
{
  "agents": [
    {
      "name"    : "DBmaster",
      "host"    : "192.168.1.10",
      "metrics" : "status,newrelic",
      "user"    : "USER_NAME_HERE",
      "passwd"  : "USER_PASSWD_HERE"
    }
    {
      "name"    : "DBslave",
      "host"    : "192.168.1.11",
      "metrics" : "status,newrelic",
      "user"    : "USER_NAME_HERE",
      "passwd"  : "USER_PASSWD_HERE"
    }
  ]
}
```

### 取得項目の変更
metricsのパラメーターによって取得項目を変更することができます

|項目|内容|
|---|---|
|status|一般的な情報|
|master|マスターならではの情報|
|slave|スレーブならではの情報|
|buffer_pool_stats|バッファプールの詳細情報|
|innodb_status|InnoDBのステータス情報|
|innodb_metrics|InnoDBのinformation情報（MySQL5.6以上）|
|innodb_mutex|InnoDBのMUTEX情報|


# デーモン化
監視エージェントをデーモン化してサーバ起動時にも自動的に立ち上がるようにしましょう
ここでは伝統的な`/etc/init.d`に起動ファイルを作成して、そこから起動します

```shell-session
# vi /etc/init.d/nrmysql
# chmod +x /etc/init.d/nrmysql
# /etc/init.d/nrmysql start
```

下記はRedHat系の起動ファイルテンプレートです
`PLUGIN_DIR`を書き換えて使ってください

```/etc/init.d/nrmysql
#!/bin/bash
#
#
# chkconfig:   2345 80 20
# description: Starts and stops the New Relic MySQL Plugin
# processname: java-newrelic-mysql-plugin


# Source function library.
FUNCTIONS="/etc/init.d/functions"
[ -s "${FUNCTIONS}" ] && . ${FUNCTIONS}

# Program Specific Variables
PROGRAM="newrelic-mysql-plugin"
LOCK_FILE="/var/lock/subsys/${PROGRAM}"
PID_FILE="/var/run/${PROGRAM}.pid"

# Set this to the plugin directory
[ -z "${PLUGIN_DIR}" ] && PLUGIN_DIR="/usr/local/newrelic-mysql"

# Logging
[ -z "${LOG_DIR}" ] && LOG_DIR="/var/log"
LOG_FILE="${LOG_DIR}/${PROGRAM}.log"

# Java Process
JAVA=`which java 2>/dev/null`
[ -z "${JAVA}" ] && echo "java not found in the PATH" && exit 1

# Plugin Location verification
[ -z "${PLUGIN_DIR}" ] && echo "PLUGIN_DIR must be defined" && exit 2
[ ! -d "${PLUGIN_DIR}" ] && echo "PLUGIN_DIR '${PLUGIN_DIR}' is not a directory" && exit 3

# New Relic MySQL Jar verification
cd ${PLUGIN_DIR}
JAR=`ls *.jar 2>/dev/null | head -1`
[ -z "${JAR}" ] && echo "No New Relic jar found in '${PLUGIN_DIR}'" && exit 4

start() {
        # Start daemons.
        echo -n $"Starting ${PROGRAM}: "
        nohup ${JAVA} -jar ${JAR} > ${LOG_FILE} 2>&1 &
	RETVAL=$?
        echo $! > ${PID_FILE}
        echo
	[ $RETVAL -eq 0 ] && touch ${LOCK_FILE}
	return $RETVAL
}

stop() {
        echo -n $"Shutting down ${PROGRAM}: "
        [ ! -s "${PID_FILE}" ] && echo "No pid file found" && exit 1
        PID=`cat ${PID_FILE}`
	#killproc -p ${PID}
        kill -9 ${PID} > /dev/null 2>&1
	RETVAL=$?
        echo
	[ $RETVAL -eq 0 ] && rm -f ${LOCK_FILE} ${PID_FILE}
	return $RETVAL
}

# See how we were called.
case "$1" in
  start)
	start
	;;
  stop)
	stop
	;;
  status)
	status $PROGRAM
	;;
  restart|force-reload)
	stop
	start
	;;
  try-restart|condrestart)
	if status $PROGRAM > /dev/null; then
	    stop
	    start
	fi
	;;
  reload)
	exit 3
	;;
  *)
	echo $"Usage: $0 {start|stop|status|restart|try-restart|force-reload}"
	exit 2
esac
```

debian系やUpstartを使う場合の起動ファイルのテンプレートは下記から入手可能です。
https://github.com/newrelic-platform/newrelic_mysql_java_plugin/tree/master/scripts


# 管理画面にアクセス
管理画面にアクセスし、情報が表示されていることを確認します
メニューの「PLUGINS」をクリックし、「MySQL」を選択します

![newrelic_plugin1.png](https://qiita-image-store.s3.amazonaws.com/0/32789/46653405-f573-868e-2de0-685906744da3.png)

![newrelic_plugin2.png](https://qiita-image-store.s3.amazonaws.com/0/32789/060ed231-e385-e08f-a3b5-b12abe0c5bdb.png)

これで終了！


# （おまけ）監視エージェントの操作
npiコマンドで行います

## 設定ファイルの編集

```shell-session
$ ./npi prepare nrmysql
[18:48:24] [INFO] operations - Generating 'newrelic.json' file for plugin...
Configure the plugin in a text editor before continuing? (y/n): y
Sucessfully prepared 'com.newrelic.plugins.mysql.instance'!

Next steps:
  Test the plugin:                    npi start com.newrelic.plugins.mysql.instance --foreground
  Setup and run in background:        npi add-service com.newrelic.plugins.mysql.instance --start
```

## 設定ファイルの動作確認
監視エージェントをforegroudで起動しエラーメッセージが出力されていないか確認します


```shell-session
$ ./npi start nrmysql --foreground
[18:50:04] [INFO] operations - Starting plugin 'com.newrelic.plugins.mysql.instance' in foreground...
[18:50:04] [INFO] operations - Please visit https://rpm.newrelic.com to verify that the plugin is successfully reporting to your account. It may take a few minutes to become visible.
INFO: Using configuration file /home/foo/newrelic-npi/plugins/com.newrelic.plugins.mysql.instance/newrelic_mysql_plugin-2.0.0/config/newrelic.json
INFO: Using configuration file /home/foo/newrelic-npi/plugins/com.newrelic.plugins.mysql.instance/newrelic_mysql_plugin-2.0.0/config/plugin.json
INFO: New Relic monitor started
```

エラーが出力されていなかったらCtl-cで中断し、監視エージェントをバックグラウンドで起動します

```shell-session
$ ./npi stop nrmysql
[18:52:07] [INFO] platform_helpers - Attempting to stop service for 'com.newrelic.plugins.mysql.instance'
Stopping newrelic_plugin_com.newrelic.plugins.mysql.instance
$ ./npi start nrmysql
[18:52:11] [INFO] operations - Starting plugin 'com.newrelic.plugins.mysql.instance' in background...
[18:52:11] [INFO] operations - Please visit https://rpm.newrelic.com to verify that the plugin is successfully reporting to your account. It may take a few minutes to become visible.
[18:52:11] [INFO] platform_helpers - Attempting to start service for 'com.newrelic.plugins.mysql.instance'...
Starting newrelic_plugin_com.newrelic.plugins.mysql.instance
```

上記の例では念のために再起動（stop-start）しました



# 仲間募集
[株式会社スピカ](http://spika.co.jp)では一緒に切磋琢磨できるエンジニアの方を募集しています！ぜひ、[こちら](https://www.wantedly.com/companies/spika/projects)をご覧ください！！