2014-11-06

2014-11-06 22:39
今回は、Zabbixを利用してTomcatのリソースを監視してみたいと思います。
監視の流れは以下のようになります。
Zabbix Server(Port:10051、IP:192.168.56.101)
  ↓
ZabbixJavaGateway(Port:10052、IP:192.168.56.101)
  ↓
Tomcat【JMX Interface(Port:10080、IP:192.168.56.102)】

インストール環境とバージョン

名前 バージョン ダウンロード元
ubuntu 10.04.4(64bit) http://releases.ubuntu.com/lucid/
ZABBIX 2.2.0 http://www.zabbix.com/
Tomcat 7.0.50 http://tomcat.apache.org/

Zabbix Serverインストール

Zabbix Serverのインストール手順」を参照してください。

Zabbix Agentインストール

Zabbix Agentのインストール手順」を参照してください。

Tomcatインストール

Tomcatは監視対象(Agent側)のサーバにインストールされている必要があります。
Tomcatのインストール手順(7.0.50)」をご参考ください。

Tomcatの設定変更【監視される側(Agent)】

リモートからJMXでの監視が出来るようにTomcatの起動オプションを変更します。
Tomcatの起動時の環境変数CATALINA_OPTSに以下のオプションを追加してください。

-Dcom.sun.management.jmxremote=true

#Openするポート
-Dcom.sun.management.jmxremote.port=10080

#OpenするIP(TomcatサーバのIP)
-Djava.rmi.server.hostname=192.168.56.102

#SSL有無
-Dcom.sun.management.jmxremote.ssl=false

#認証有無
-Dcom.sun.management.jmxremote.authenticate=false

実際の例は以下のようになります。
・オプション追加

# vi /etc/init.d/tomcat

export CATALINA_OPTS="-Xms512m -Xmx512m -XX:NewSize=341m -XX:MaxNewSize=341m
        -XX:SurvivorRatio=2 -XX:PermSize=128m -XX:MaxPermSize=128m
        -Dcom.sun.management.jmxremote=true
        -Dcom.sun.management.jmxremote.port=10080
        -Djava.rmi.server.hostname=192.168.56.102
        -Dcom.sun.management.jmxremote.ssl=false
        -Dcom.sun.management.jmxremote.authenticate=false"


・Tomcat再起動後、プロセス確認
# ps -awef|grep tomcat | grep -v grep
root      1868     1  0 16:22 ?        00:00:00 jsvc.exec -java-home /usr/local/java/current -user tomcat -pidfile /usr/local/tomcat/current/logs/catalina-daemon.pid -wait 10 -outfile /usr/local/tomcat/current/logs/catalina.out -errfile &1 -classpath /usr/local/tomcat/current/bin/bootstrap.jar:/usr/local/tomcat/current/bin/commons-daemon.jar:/usr/local/tomcat/current/bin/tomcat-juli.jar -Djava.util.logging.config.file=/usr/local/tomcat/current/conf/logging.properties -Djava.security.egd=file:/dev/./urandom -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms512m -Xmx512m -XX:NewSize=341m -XX:MaxNewSize=341m -XX:SurvivorRatio=2 -XX:PermSize=128m -XX:MaxPermSize=128m -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=10080 -Djava.rmi.server.hostname=192.168.56.102 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.endorsed.dirs= -Dcatalina.base=/usr/local/tomcat/current -Dcatalina.home=/usr/local/tomcat/current -Djava.io.tmpdir=/usr/local/tomcat/current/temp org.apache.catalina.startup.Bootstrap
tomcat    1869  1868 11 16:22 ?        00:00:03 jsvc.exec -java-home /usr/local/java/current -user tomcat -pidfile /usr/local/tomcat/current/logs/catalina-daemon.pid -wait 10 -outfile /usr/local/tomcat/current/logs/catalina.out -errfile &1 -classpath /usr/local/tomcat/current/bin/bootstrap.jar:/usr/local/tomcat/current/bin/commons-daemon.jar:/usr/local/tomcat/current/bin/tomcat-juli.jar -Djava.util.logging.config.file=/usr/local/tomcat/current/conf/logging.properties -Djava.security.egd=file:/dev/./urandom -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms512m -Xmx512m -XX:NewSize=341m -XX:MaxNewSize=341m -XX:SurvivorRatio=2 -XX:PermSize=128m -XX:MaxPermSize=128m -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=10080 -Djava.rmi.server.hostname=192.168.56.102 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.endorsed.dirs= -Dcatalina.base=/usr/local/tomcat/current -Dcatalina.home=/usr/local/tomcat/current -Djava.io.tmpdir=/usr/local/tomcat/current/temp org.apache.catalina.startup.Bootstrap


※接続時のID・パスワードの認証をかけたい場合は以下のようにオプションを変更してください。
authenticate=true
# vi /etc/init.d/tomcat

export CATALINA_OPTS="-Xms512m -Xmx512m -XX:NewSize=341m -XX:MaxNewSize=341m
        -XX:SurvivorRatio=2 -XX:PermSize=128m -XX:MaxPermSize=128m
        -Dcom.sun.management.jmxremote=true
        -Dcom.sun.management.jmxremote.port=10080
        -Djava.rmi.server.hostname=192.168.56.102
        -Dcom.sun.management.jmxremote.ssl=false
        -Dcom.sun.management.jmxremote.authenticate=true"

#        -Dcom.sun.management.jmxremote.authenticate=false" Comment Out



接続するID・Passwordの設定
[jdk_install_dir]/jre/lib/management/jmxremote.password

# cp /usr/local/java/current/jre/lib/management/jmxremote.password.template /usr/local/java/current/jre/lib/management/jmxremote.password

# vi /usr/local/java/current/jre/lib/management/jmxremote.password


最後のラインのコメントアウト解除(パスワード設定)

monitorRole  QED
# controlRole   R&D


パスワードファイルのパーミッションが600でないと以下のような エラーが発生しますので、パーミッションを変更します。
エラー: パスワードファイルの読み取りアクセスは制限する必要があります。: /usr/local/java/current/jre/lib/management/jmxremote.password


# chmod 600 /usr/local/java/current/jre/lib/management/jmxremote.password


Tomcat再起動

Zabbix Serverの設定を変更【監視する側(Server)】


・Zabbix Server で Zabbix Java Gateway を認識させる

# vi /usr/local/etc/zabbix_server.conf

JavaGateway=192.168.56.101 #server ip

JavaGatewayPort=10052

StartJavaPollers=2



・ZabbixのJava ゲートウェイをインストールする(し直す)
(Zabbixのインストールオプションで--enable-javaがすでに有効になっている場合はこちらの手順は省略してください。)

ZabbixでJavaをenableするためにはサーバ側にjdkがインストールされている必要があります。
インストール手順は 「Javaのインストール手順」を参照してください。

# cd /usr/local/src/zabbix-2.2.0
# ./configure --enable-server --with-mysql=/usr/local/mysql/current/bin/mysql_config --with-net-snmp --with-libcurl --enable-java

# make clean (Zabbixは再インストールなので、clean しています。)
# make
# make install



・Zabbix Java Gateway の設定を行う

# vi /usr/local/sbin/zabbix_java/settings.sh


LISTEN_IP="192.168.56.101" # [server ip]
LISTEN_PORT=10052
START_POLLERS=2



・ログファイルを設定する

# vi /usr/local/sbin/zabbix_java/lib/logback.xml



        

                /var/log/zabbix/zabbix_java.log

                
                        /var/log/zabbix/zabbix_java.log.%i
                        1
                        3
                

                
                        5MB
                

                
                        %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
                

        

        
                
        





・zabbix_javaを起動する

# /usr/local/sbin/zabbix_java/startup.sh
# ps -awef|grep zabbix-java-gateway | grep -v grep
root     25460     1  3 19:19 pts/0    00:00:00 java -server -classpath lib:lib/logback-classic-0.9.27.jar:lib/logback-core-0.9.27.jar:lib/org-json-2010-12-28.jar:lib/slf4j-api-1.6.1.jar:bin/zabbix-java-gateway-2.0.5.jar -Dzabbix.pidFile=/tmp/zabbix_java.pid -Dzabbix.listenIP=192.168.56.101 -Dzabbix.listenPort=10052 -Dzabbix.startPollers=2 com.zabbix.gateway.JavaGateway
#


もし、プロセスが無い場合は「logback.xml」で指定した「/var/log/zabbix/zabbix_java.log」を確認して対応してください。
例)Cannot assign requested address エラーが発生した場合
2014-10-21 23:31:02.647 [main] ERROR com.zabbix.gateway.JavaGateway - caught fatal exception
java.net.BindException: Cannot assign requested address
        at java.net.PlainSocketImpl.socketBind(Native Method) ~[na:1.6.0_17]
        at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:365) ~[na:1.6.0_17]
        at java.net.ServerSocket.bind(ServerSocket.java:319) ~[na:1.6.0_17]
        at java.net.ServerSocket.(ServerSocket.java:185) ~[na:1.6.0_17]
        at com.zabbix.gateway.JavaGateway.main(JavaGateway.java:65) ~[zabbix-java-gateway-2.2.0.jar:na]
2014-10-21 23:31:02.648 [Thread-1] INFO  com.zabbix.gateway.JavaGateway - Zabbix Java Gateway 2.2.0 (revision 40163) has stopped

該当のポートが既に使われているか確認
# lsof -i -n -P | grep 10052
サーバのIPアドレスが問題なく設定されているの確認
# vi /usr/local/etc/zabbix_server.conf
# vi /usr/local/sbin/zabbix_java/settings.sh


Zabbix管理画面でHostを登録する

・tomcatのテンプレートをインポートする

まず、以下のリンクから自分のTomcatバージョンのテンプレートxmlファイルをダウンロードします。
tomcat6のテンプレート ダウンロード
tomcat7のテンプレート ダウンロード

ダウンロードしたテンプレートをZabbix管理画面の以下のページにてインポートしてください。
設定テンプレートインポート

・Tomcatのホストを登録する

設定ホストホストの作成
JMX interfacesにはTomcat(Agent)側に設定したIPとポートを入れてください。


Templatesタブに移動して、先ほど登録したTemplate JMX Tomcat7テンプレートを検索して追加します。

Macrosタブに移動して以下のマクロを追加します。
マクロ名
{$AJP_PORT} 8009
{$CONNECTOR_MODE} apr
{$HTTP_PORT} 8080
{$HTTPS_PORT} 8088
{$JMX_PASSWORD} QED
{$JMX_USERNAME} monitorRole

こちらのマクロのリストはそれぞれのテンプレートXML(一番上)に記載されていますので、 ご参考ください。
また、こちらの設定値はTomcat(Agent側)のserver.xmlに記載されている内容を設定して頂く必要があります。

監視状態確認

ここまで問題なく設定されましたら、グラフ画面にて以下のようなデータが確認出来るかと思います



もし、 上手くデータが取得出来ない場合はログなどを確認し、対応してください。

・Zabbix ServerとAgent間の通信問題
以下のコマンドで、適切な値が返ってくるのかをご確認ください。
# zabbix_get -s 192.168.56.102 -k agent.ping
1

# zabbix_get -s 192.168.56.102 -k agent.version
2.2.0

・テンプレートXMLのキー(もしくはマクロ)の設定値の不一致
Zabbix管理画面に登録されているマクロの設定値はTomcatのServer.xmlの値である必要がありますので、
それぞれの値が正確に入っているのか比較してください。

また、
テンプレートXMLのKeyの値は、AgentサーバのTomcatのServer.xmlに設定されている値、且つ現在のJavaのバージョンのJMX(MBeans)から取得可能な値である必要があります。
上記の値を確認する方法としては、JConsoleなどのツールから該当のAgent(Tomcat)サーバに接続し、MBeansの値をチェックするのが一番簡単ではないかと思います。

例)
テンプレートXMLの HTTP Connector threads allocatedjmx["Catalina:type=ThreadPool,name=\"http-{$CONNECTOR_MODE}-{$HTTP_PORT}\"",currentThreadCount]が取得可能かどうかを確認してみます。

JConsoleを立ち上げ、Agentサーバに接続 → MBeansタブへ移動
JConsole経路:%JAVA_HOME%\bin\jconsole.exe

XMLキーで、Treeをで辿って行きます。
jmx["Catalina:type=ThreadPool,name=\"http-{$CONNECTOR_MODE}-{$HTTP_PORT}\"",currentThreadCount]
の場合は
jmx["Catalina(1階層):type=ThreadPool(2階層),name=\"http-{$CONNECTOR_MODE}-{$HTTP_PORT}\""(3階層),currentThreadCount(属性)]
になります。
即ち
Treeの第1階層: Catalina
Treeの第2階層: ThreadPool
Treeの第3階層: http-{$CONNECTOR_MODE}-{$HTTP_PORT} (マクロにそれぞれに入れた値)
属性currentThreadCountがあればOK。
ない場合は、取得したい値をMBeansから探して、テンプレートXMLもしくはマクロを修正する必要があります。



参考URL

https://gist.github.com/hgomez/3209196
http://www.checksite.jp/zabbix-2-0-jmx-tomcat7-javagateway/

0 コメント:

コメントを投稿