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のインストール
#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のインストール
#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のインストール
#エージェント(リソース情報を記録する)のAPサーバ用と
#管理マネージャを動かすAPサーバ用に2セット準備する
#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からファイルをダウンロード
$ wget http://downloads.sourceforge.net/project/endosnipe/6.0.0-release/endosnipe_6.0.0-release.zip
※2017年5月現在、アクロクエスト社の公式からダウンロードできなくなりましたが以下より入手できるようです。
sourceforge ENdoSnipe6.0.2
ファイルを解凍して配置します
$ 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
設定変更
#リソース情報を集計するTomcat起動スクリプトの頭に、起動オプション追加
#!/bin/sh
export JAVA_OPTS="-javaagent:/opt/ENdoSnipe/Javelin/lib/javelin.jar $JAVA_OPTS"
集計プロセス、Tomcat起動
#リソース集計
/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解像度が低いので、見辛いですが
ヒープ確保量、使用量のグラフを以下に表示します。
使用量
jstatコマンドで確認しましたが、だいたい同じ値が取れているようです。
閾値を設ける
プロセスのCPU使用率が、一定の%を超えた場合に検知する設定しました。青丸は閾値超えを検知した状態であり、内容をメールを送付することができます。(設定としてSNMPトラップを送付するような項目もありましたが、試していません)
ENdoSnipeを動かし、監視項目の設定と検知までは実施できることがわかりました。無料ということを考えれば、リソース情報の記録・監視ツールとして検討に挙げられるツールだと存じます。
追記
PostgreSQLはCentOS7.2のデフォルト(9.2)を利用する場合
[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