ENdoSnipeのインストール（Javaアプリのリソース情報記録）

APM（アプリケーション性能管理）ツールとは、アプリのリソース情報を記録するソフトウェアです。APサーバに情報を取得するエージェントを導入して、取得した情報をマネージャに集約してリソース情報を可視化、24時間体制で監視、リソース情報の動きから障害を検知することができます。Javaアプリにおいて、ヒープの使用率などリソース情報の記録・監視にはJava Flight Recorder(以下「JFR」)+Java Mission Control(以下「JMC」)というOracleが提供しているツールがあります。機能的には申し分ないのですが、商用利用には有償ライセンスが必要です。

JFRに変わって、安価で利用できるものがないか探してみると、ENdoSnipe（エンドスナイプ）にたどり着きました。オライリーのJavaパフォーマンス本などを監訳している会社が開発、OSSとして公開しているツールであり、無料で利用できます。LinuxサーバにENdoSnipeを（以下「ES」）導入してみたいと思います。
####ESの主な特徴
・リソース情報に閾値を設定、超時に指定宛先へメール送付できる
・記録した情報を期間指定してグラフ出力（Excelなど）できる
・導入のために、既存のJavaソース修正不要
・OSSのため、無料で利用可能（有償サポートもあり）

#実施する作業
(環境はさくらのクラウドCentOS7を利用しました)
・環境を整える
・ESのインストール
・ESの起動
・使う

#環境を整える
必要なMWは以下の通り
・Java
・PostgreSQL
・Tomcat 2セット（エージェント、マネージャー用）


**Javaのインストール**

```sh
#1.8.0.73 is latest version of 2016/03/20
$ curl -OL --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.rpm
$ sudo rpm -ivh jdk-8u73-linux-x64.rpm
$ java -version
java version "1.8.0_73"

#環境変数の設定
$ export JAVA_HOME=/usr/java/jdk1.8.0_73/
```

**PostgreSQLのインストール**

```sh
#yumだと、9.2が入りますが正常に動作しなかったため9.4を入れる。
$ wget http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/pgdg-centos94-9.4-2.noarch.rpm
$ rpm -ivh pgdg-centos94-9.4-2.noarch.rpm
$ yum -y install postgresql94-server postgresql94-devel postgresql94-contrib

#DBの初期化
$ /usr/pgsql-9.4/bin/postgresql94-setup initdb
Initializing database ... OK

#管理ユーザにパスワードを設定するため、サービス起動
$ systemctl start postgresql
$ su - postgres 
$ psql -c "alter user postgres with password 'postgres'" 

#パスワード設定後、認証方式変更
$ vi /var/lib/pgsql/9.4/data/pg_hba.conf
# 127.0.0.1経由のアクセスではid/passwordで認証するよう、以下のように修正
(修正前）host    all             all             127.0.0.1/32            ident
(修正後）host    all             all             127.0.0.1/32            md5
```

**Tomcatのインストール**

```sh
#エージェント（リソース情報を記録する）のAPサーバ用と
#管理マネージャを動かすAPサーバ用に２セット準備する
#8.0.32 is latest version of 2016/03/20

$ wget http://ftp.kddilabs.jp/infosystems/apache/tomcat/tomcat-8/v8.0.32/bin/apache-tomcat-8.0.32.tar.gz
$　tar　-zxvf　apache-tomcat-8.0.32.tar.gz -C　/opt/ENdoSnipe/
$　tar　-zxvf　apache-tomcat-8.0.32.tar.gz -C　/opt/
※このままだと、利用するポートが重複してしまうため、「conf/server.xml」を修正します（省略）
```

#ESのインストール
**公式HPからファイルをダウンロード**

```sh
$ wget http://downloads.sourceforge.net/project/endosnipe/6.0.0-release/endosnipe_6.0.0-release.zip
```

※2017年5月現在、アクロクエスト社の公式からダウンロードできなくなりましたが以下より入手できるようです。
[sourceforge ENdoSnipe6.0.2](https://sourceforge.net/projects/endosnipe/)



**ファイルを解凍して配置します**

```sh
$ unzip　endosnipe_6.0.0-release.zip
Javelin_6.0.0.zip
endosnipe-datacollector-6.0.0.tar.gz
ENdoSnipe.war

#Javelin
$ unzip Javelin_6.0.0.zip
$ mv Javelin /opt/ENdoSnipe/

#DataCollector
$ tar -zxvf endosnipe-datacollector-6.0.0.tar.gz
$ mv ENdoSnipe/DataCollector /opt/ENdoSnipe/

#ENdoSnipe.war
$ mv ENdoSnipe.war /opt/ENdoSnipe/apache-tomcat-8.0.32/webapps
```

**設定変更**

```sh:/opt/apache-tomcat-8.0.32/bin/startup.sh
#リソース情報を集計するTomcat起動スクリプトの頭に、起動オプション追加
#!/bin/sh
export JAVA_OPTS="-javaagent:/opt/ENdoSnipe/Javelin/lib/javelin.jar $JAVA_OPTS"
```

**集計プロセス、Tomcat起動**

```sh
#リソース集計
/opt/ENdoSnipe/DataCollector/bin/endosnipe-dc start
Starting ENdoSnipe DataCollector: *****           [  OK  ]

#Tomcat（エージェント用）
/opt/apache-tomcat-8.0.32/bin/startup.sh

#Tomcat(マネージャ用）
/opt/ENdoSnipe/apache-tomcat-8.0.32/bin/startup.sh
```

#使う
エージェントにアクセスする
→http://(ホスト):8080/ENdoSnipe/

私のPC解像度が低いので、見辛いですが
ヒープ確保量、使用量のグラフを以下に表示します。

**確保量**
![max.png](https://qiita-image-store.s3.amazonaws.com/0/110457/b3cf110d-db77-a1c9-882b-ac0303ce8d65.png)


**使用量**
![used.png](https://qiita-image-store.s3.amazonaws.com/0/110457/6e5f3fbf-1e5d-c692-d98b-044458cd4b70.png)
jstatコマンドで確認しましたが、だいたい同じ値が取れているようです。

**閾値を設ける**
![signal.png](https://qiita-image-store.s3.amazonaws.com/0/110457/e3d384cb-3311-0cf3-37eb-973a9abe13ff.png)
プロセスのCPU使用率が、一定の%を超えた場合に検知する設定しました。青丸は閾値超えを検知した状態であり、内容をメールを送付することができます。（設定としてSNMPトラップを送付するような項目もありましたが、試していません）

ENdoSnipeを動かし、監視項目の設定と検知までは実施できることがわかりました。無料ということを考えれば、リソース情報の記録・監視ツールとして検討に挙げられるツールだと存じます。


追記
PostgreSQLはCentOS7.2のデフォルト（9.2）を利用する場合

```bash
[root@~]# yum install --downloadonly --downloaddir=./ postgresql-server postgresql-devel postgresql-contrib

[root@~]# ls -l ./
-rw-r--r-- 1 root root  247484  7月  4  2014 libxslt-1.1.28-5.el7.x86_64.rpm
-rw-r--r-- 1 root root 3137780  3月  3 02:56 postgresql-9.2.15-1.el7_2.x86_64.rpm
-rw-r--r-- 1 root root  562628  3月  3 02:56 postgresql-contrib-9.2.15-1.el7_2.x86_64.rpm
-rw-r--r-- 1 root root  971348  3月  3 02:57 postgresql-devel-9.2.15-1.el7_2.x86_64.rpm
-rw-r--r-- 1 root root  236884  3月  3 02:57 postgresql-libs-9.2.15-1.el7_2.x86_64.rpm
-rw-r--r-- 1 root root 3967928  3月  3 02:57 postgresql-server-9.2.15-1.el7_2.x86_64.rpm
-rw-r--r-- 1 root root   56724  7月  4  2014 uuid-1.6.2-26.el7.x86_64.rpm

[root@~]# /usr/bin/postgresql-setup initdb
Initializing database ... OK

[root@~]# systemctl start postgresql


```