This is a translation of the original English documentation page. Help us make it better.

13 JMX 監視

概要

JMX監視は、JavaアプリケーションのJMXカウンターを監視するために使用できます。

JMX監視はZabbix 2.0から導入された "Zabbix Java gateway"と呼ばれるZabbix daemon によって
Zabbixでネイティブにサポートされています。

ホスト上の特定のJMXカウンタの値を取得するために、Zabbix server はZabbix Java gateway に問合せをし、
ZabbixはJMX management APIを使用して
対象のアプリケーションにリモートで問い合わせをします。

詳細と設定方法はZabbix Java gatewayの項を参照してください。

Java gatewayと監視対象のJMXアプリケーション間の通信をファイアウォールで遮断してはいけません。

Java アプリケーションの JMX リモート監視の有効化

Javaアプリケーションは、追加のソフトウェアをインストールする必要はありませんが、リモートJMX監視をサポートするためには、
以下に指定するコマンドラインオプションを使用して起動することが必要です。

最低限、ローカルホスト上の単純なJavaアプリケーションをセキュリティなしで監視することから始めたい場合は、
以下のオプションで起動してください。

java \
       -Dcom.sun.management.jmxremote \
       -Dcom.sun.management.jmxremote.port=12345 \
       -Dcom.sun.management.jmxremote.authenticate=false \
       -Dcom.sun.management.jmxremote.ssl=false \
       -Dcom.sun.management.jmxremote.registry.ssl=false \
       -jar /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar

これは、Javaがローカルホストからの12345番ポート上の着信JMX接続をリッスンするようにし、
認証やSSLを要求しないように指示します。

別のインタフェースでの接続を許可する場合は、-Djava.rmi.server.hostnameパラメータを
そのインタフェースのIPに設定します。

もし、セキュリティにもっと厳しくしたいのであれば、他にも多くのJavaのオプションがあります。
例えば、次の例では、より多用途なオプションのセットでアプリケーションを開始し、ローカルホストだけでなく、
より広いネットワークに開放しています。

java \
       -Djava.rmi.server.hostname=192.168.3.14 \
       -Dcom.sun.management.jmxremote \
       -Dcom.sun.management.jmxremote.port=12345 \
       -Dcom.sun.management.jmxremote.authenticate=true \
       -Dcom.sun.management.jmxremote.password.file=/etc/java-6-openjdk/management/jmxremote.password \
       -Dcom.sun.management.jmxremote.access.file=/etc/java-6-openjdk/management/jmxremote.access \
       -Dcom.sun.management.jmxremote.ssl=true \
       -Dcom.sun.management.jmxremote.registry.ssl=true \
       -Djavax.net.ssl.keyStore=$YOUR_KEY_STORE \
       -Djavax.net.ssl.keyStorePassword=$YOUR_KEY_STORE_PASSWORD \
       -Djavax.net.ssl.trustStore=$YOUR_TRUST_STORE \
       -Djavax.net.ssl.trustStorePassword=$YOUR_TRUST_STORE_PASSWORD \
       -Dcom.sun.management.jmxremote.ssl.need.client.auth=true \
       -jar /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar

これらの設定のほとんど(すべてではないにしても)は、/etc/java-6-openjdk/management/management.properties
(または別の場所にあるそのファイル)に指定することができます。

SSLを使用したい場合は、startup.shスクリプトを変更して、Java gateway に -Djavax.net.ssl.* オプションを追加し、
鍵とトラストストアの場所を認識させる必要があることに注意してください。

Monitoring and Management Using JMXを参照してください。

ZabbixフロントエンドでのJMXインターフェースと item の設定

Java gateway が動作し、serveer が Java gateway の場所を認識し、リモートJMX監視をサポートするJavaアプリケーションが
起動したら、Zabbix GUIでインタフェースと item を設定する必要があります。

JMX インターフェースの設定

まず、対象のホストで JMX タイプのインターフェイスを作成します。

必須入力項目にはすべて赤いアスタリスクが付けられています。

JMX エージェント項目の追加

関心のある JMX カウンターごとに、そのインターフェースに接続された JMX agent item を追加します。

下のスクリーンショットのキーには、次のように書かれています。jmx["java.lang:type=Memory", "HeapMemoryUsage.used"]

必須入力項目には、赤いアスタリスクが表示されています。

JMX item で特定の情報を必要とするフィールドは、以下の通りです。

JMX agent をここにセット
Key The jmx[] item key contains three parameters:
object name - the object name of an MBean
attribute name - an MBean attribute name with optional composite data field names separated by dots
unique short description - a unique description that allows multiple JMX items with the same object name and attribute name on the host (optional)
See below for more detail on JMX item keys.
Since Zabbix 3.4, you may discover MBeans and MBean attributes using a jmx.discovery[] low-level discovery item.
JMX endpoint You may specify a custom JMX endpoint. Make sure that JMX endpoint connection parameters match the JMX interface. This can be achieved by using {HOST.*} macros as done in the default JMX endpoint.
This field is supported since 3.4.0. {HOST.*} macros and user macros are supported.
User name Specify the user name, if you have configured authentication on your Java application.
User macros are supported.
Password Specify the password, if you have configured authentication on your Java application.
User macros are supported.

"true "または "false "のブール値カウンターを監視したい場合は、情報のタイプを "Numeric(unsigned)"に指定し、
プリプロセッシングタブで "Boolean to decimal "プリプロセスステップを選択します。
サーバーはブール値をそれぞれ1または0として格納します。

JMX item キーの詳細

単純な属性

MBeanオブジェクト名はJavaアプリケーションで定義する文字列にすぎません。一方、属性名はもっと複雑なことができます。
属性がプリミティブなデータ型(整数、文字列など)を返す場合、何も心配する必要はなく、キーは次のようになります。

jmx[com.example:Type=Hello,weight] 

この例では、オブジェクト名は "com.example:Type=Hello"で、属性名は "weight"、戻り値の型はおそらく
"Numeric (float) "であるべきです。

複合データを返す属性

例えば、属性名が "apple" で、"weight" 、"color" などのパラメータを表すハッシュを返す場合、属性はより複雑になります。 キーは次のようになります。

jmx[com.example:Type=Hello,apple.weight] 

このように、属性名とハッシュ・キーは、ドット記号で区切られます。 同じように、属性がネストした複合データを返す場合は、ドットで区切ります。

jmx[com.example:Type=Hello,fruits.apple.weight] 
表形式データを返す属性

表形式データ属性は、1つまたは複数の複合属性から構成されます。属性名パラメータにそのような
属性が指定された場合、この item 値はその属性の完全な構造をJSON形式で返します。
表形式データ属性の中の個々の要素値は、プリプロセスによって取得することができます。

表形式データ属性の例:

Item 値:

[
         {
           "a": "apple",
           "b": "banana",
           "c": "cherry"
         },
         {
           "a": "potato",
           "b": "lettuce",
           "c": "onion"
         }
       ]
ドットの問題

ここまではいい。しかし、属性名やハッシュキーにドット記号が含まれている場合はどうでしょうか。 以下はその例です。

jmx[com.example:Type=Hello,all.fruits.apple.weight]

これは問題です。属性名が "all" ではなく "all.fruits" であることをZabbixに伝えるにはどうすればよいですか? 名前の一部であるドットと属性名やハッシュキーの区切りであるドットを区別する方法は?

2.0.4 以前のZabbix Java gateway はこのような状況に対応することができず、ユーザは UNSUPPORTED item が 表示されたままになっていました。2.0.4以降では、名前の一部であるドットをバックスラッシュでエスケープすることで、 この問題を解決することができます。

jmx[com.example:Type=Hello,all\.fruits.apple.weight]

同じように、ハッシュキーにドットが含まれている場合は、それをエスケープします。

jmx[com.example:Type=Hello,all\.fruits.apple.total\.weight]
その他の問題

属性名中のバックスラッシュ文字はエスケープする必要があります:

JMX[com.example:type=Hello,c:\documents] 

JMX item キーのその他の特殊文字の扱いについては、アイテムキー形式 [section] (/manual/config/items/item/key##parameter_-_quoted_string) を参照してください。

実はこれだけなんです。それでは、JMXの監視をお楽しみください。

非プリミティブなデータ型

Zabbix 4.0.0以降、toString()メソッドをオーバーライドした非プリミティブなデータ型を返すカスタムMBeansを使用することができます。

JBoss EAP 6.4 でのカスタムエンドポイントの使用

カスタムエンドポイントを使用すると、デフォルトの RMI 以外の異なるトランスポートプロトコルで作業することができます。

この可能性を説明するために、例として JBoss EAP 6.4 モニタリングを構成してみましょう。まず、いくつかの前提条件を設定します。

  • ZabbixのJava gateway はすでにインストールされています。 インストールされていない場合、documentationに従ってインストールすることができます。
  • Zabbix server とJava gateway は/usr/local/というプレフィックスでインストールされます。
  • JBoss は /opt/jboss-eap-6.4/にインストール済みで、スタンドアロンモードで動作しています。
  • これらのコンポーネントはすべて同一ホスト上で動作していると仮定します。
  • ファイアウォールとSELinuxは無効になっています(または適宜設定されています)

zabbix_server.conf で簡単な設定をしてみましょう。

JavaGateway=127.0.0.1
       StartJavaPollers=5

そして、zabbix_java/settings.sh 設定ファイル(または zabbix_java_gateway.conf) に追加します。

START_POLLERS=5

JBoss がその標準的なマネジメントポートをリッスンしていることを確認します。

$ netstat -natp | grep 9999
       tcp        0      0 127.0.0.1:9999          0.0.0.0:*               LISTEN      10148/java

では、ZabbixでJMXインターフェース127.0.0.1:9999を持つホストを作成してみましょう。

このバージョンの JBoss は、RMI の代わりに JBoss Remoting プロトコルを使用することがわかっているので、
それに応じて JMXテンプレートの item の JMXエンドポイントパラメータを大量に更新することができます。

service:jmx:remoting-jmx://{HOST.CONN}:{HOST.PORT}

設定キャッシュを更新してみましょう。

$ /usr/local/sbin/zabbix_server -R config_cache_reload

なお、最初にエラーが発生する場合があります。

"Unsupported protocol: remoting-jmx" は、Java gateway が指定されたプロトコルをどのように動作させるか知らないことを意味します。
そのため、以下のような内容で、"need‾/need‾modules.txt "を作成することで、解決することができます。

jboss-as-remoting
       jboss-logging
       jboss-logmanager
       jboss-marshalling
       jboss-remoting
       jboss-sasl
       jcl-over-slf4j
       jul-to-slf4j-stub
       log4j-jboss-logmanager
       remoting-jmx
       slf4j-api
       xnio-api
       xnio-nio</pre>

そして、以下のコマンドを実行します:

$ for i in $(cat ~/needed_modules.txt); do find /opt/jboss-eap-6.4 -iname ${i}*.jar -exec cp {} /usr/local/sbin/zabbix_java/lib/ \; ; done

このように、Java gateway にはjmx-remotingを使用するために必要なモジュールがすべて含まれています。
あとは、Java gatewayを再起動し、少し待つと、JMX監視データがZabbixに届き始めます。 Latest data も参照ください。