Wildflyをzabbix-java-gatewayで監視する

WildflyのJVM監視はtomcatと使用するプロトコルが異なっている。
そのためソースコードに一部修正＆makeする必要がある。
zabbix-serverなど全てをソースからコンパイルする方法もあるが、面倒であったり稼働中の
zabbixにJMX監視を追加する場合などを想定して、必要な部分だけコンパイル&置換して対応する。

####1: Zabbixバイナリ一式のインストール
・MySQLやJavaのインストール等については通常通り
・# yum -y install zabbix-server zabbix-agent .... zabbix-java-gateway

※ZabbixServerは別サーバ稼動しており、java-gatewayのみインストールする場合、
　MySQLのインストールやyumによるzabbix-serverのインストールは不要。

####2: Zabbixソースコードの入手

・http://www.zabbix.com/jp/download よりソース一式ダウンロードしてtar展開する。
・# cd ***/zabbix-3.0.7/src/zabbix_java/src/com/zabbix/gateway

####3: ソースコードの修正

修正対象ファイル： JMXItemChecker.java

[修正前]
`url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + conn + ":" + port + "/jmxrmi");`

[修正後]
`Integer remoting = new Integer("`**7777**`");`
`int retval = remoting.compareTo(port);`
`if (retval == 0){`
`  url = new JMXServiceURL("service:jmx:remoting-jmx://" + conn + ":" + port);`
`}else{`
`  url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + conn + ":" + port + "/jmxrmi");`
`}`

これは zabbix-java-gateway⇔JVM 間の通信ポートが"7777"だったら"service:jmx:remoting-jmx://～"、
それ以外の場合には従来どおり"service:jmx:rmi:///jndi/rmi://～"を使うようにする。
つまり、tomcatのJVM監視に使用するポートと別にすると共に事前にポート番号を決めておく必要がある。
※Wildfly専用のgatewayにするのであれば、if文による分岐は不要。
　　→ポート番号の縛りも無くなる

####4: make
・# cd ***/zabbix-3.0.7
・# ./configure --enable-java
・# make

####5: ファイルの置換
yumでzabbixをインストールした場合、おそらく /usr/share/zabbix-java-gateway にインストールされている。
このディレクトリ配下をコンパイルしたものに置換する。

####6: クラスライブラリのコピー
{wildflyのインストールディレクトリ)/bin/client/jboss-client.jar を
/usr/share/zabbix-java-gateway/lib にコピーする。

####7: Wildfly側の設定
Wildflyのconfigファイル(standalone.xml等）を修正する。

・management-interfaceの追加
[修正前]
\<management-interfaces>
\<http-interface security-realm="ManagementRealm" http-upgrade-enabled="true">
\<socket-binding http="management-http"/>
\</http-interface>
\</management-interfaces>
[修正後]
\<management-interfaces>
**\<native-interface security-realm="ManagementRealm">
\<socket-binding native="management-native"/>
\</native-interface>**
\<http-interface security-realm="ManagementRealm" http-upgrade-enabled="true">
\<socket-binding http="management-http"/>
\</http-interface>
\</management-interfaces>

・socket-bindingの追加
\<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}"> ～ \</socket-binding-group>に次の1行を追加
**\<socket-binding name="management-native" interface="management" port="${jboss.management.native.port:7777}"/>**

####8: zabbix-server側でのzabbix-java-gateway設定
/etc/zabbix/zabbix_server.conf で下記を設定
・JavaGateway= **(zabbix-java-gatewayが稼動しているアドレス)**
・JavaGatewayPort= **(zabbix-server ⇔ zabbix-java-gateway の通信ポート)**
・StartJavaPollers= **(JavaPollerの数 :0以外を指定)**
zabbix-serverを再起動(# systemctl restart zabbix-server)

####9: zabbix-java-gatewayのservice追加
・# systemctl enable zabbix-java-gateway
・# systemctl start zabbix-java-gateway

 ※zabbix_java_gateway.logに "The protocol 'remoting-jmx' is deprecated, instead you should use 'remote'."とwarningメッセージが出るが、バグなので無視してOKとのこと。

####10: Zabbixの設定
Zabbixのホスト設定における JXM Interfaces にPort=7777としてインターフェースを追加する

####11: Itemの追加
手っ取り早く動作確認するのであれば"Template JMX Generic"あたりのテンプレートをHostに適用すると、"mem Heap Memory used"などのItemを取得できる。
 ※Item設定で"User name","Password"にはWildflyのAdministratorアカウントのID/Passを設定すること
 ※Java8以降ではPermanent領域が無くなっているので、取得できなくても慌てないこと