13 JMX 監視

概要

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

JMX監視は、"Zabbix Java gateway"と呼ばれるZabbixデーモンの形でZabbixにネイティブサポートされています。

ホスト上の特定のJMXカウンタの値を取得するために、ZabbixサーバーはZabbix Java gatewayにクエリを送り、Java gatewayはJMX管理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 /path/to/your/application.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 /path/to/your/application.jar

これらの設定のほとんど(すべてではないにしても)は、$JRE/lib/management/management.properties(またはシステム上のそのファイルがある場所)に指定できます。

SSLを使用する場合は、Javaゲートウェイがキーストアやトラストストアの場所を認識できるように、-Djavax.net.ssl.*オプションを追加してstartup.shスクリプトを修正する必要があることに注意してください。

詳細については、Monitoring and Management Using JMXを参照してください。

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

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

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

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

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

JMXエージェントアイテムの追加

監視したい各JMXカウンターについて、そのインターフェースにJMXエージェントアイテムを追加します。

下のスクリーンショットのキーは jmx["java.lang:type=Memory","HeapMemoryUsage.used"] です。

必須入力フィールドには赤いアスタリスクが付いています。

JMXアイテムに特有の情報が必要なフィールドは以下の通りです。

タイプ ここでJMXエージェントを設定します。
キー jmx[]アイテムキーには3つのパラメータがあります:
オブジェクト名 - MBeanのオブジェクト名
属性名 - MBean属性名。複合データフィールド名はドットで区切って指定可能
一意の短い説明 - ホスト上で同じオブジェクト名と属性名を持つ複数のJMXアイテムを許可する一意の説明(省略可能)
JMXアイテムキーの詳細は下記を参照してください。
jmx.discovery[] 低レベルディスカバリアイテムを使用して、MBeanやMBean属性を発見することもできます。
JMXエンドポイント カスタムJMXエンドポイントを指定できます。JMXエンドポイントの接続パラメータがJMXインターフェースと一致していることを確認してください。これは、デフォルトのJMXエンドポイントで行われているように{HOST.*}マクロを使用することで実現できます。
{HOST.*} マクロおよびユーザーマクロがサポートされています。
ユーザー名 Javaアプリケーションで認証を設定している場合は、ユーザー名(最大255文字)を指定します。
ユーザーマクロがサポートされています。
パスワード Javaアプリケーションで認証を設定している場合は、パスワード(最大255文字)を指定します。
ユーザーマクロがサポートされています。

"true"または"false"のいずれかとなるBooleanカウンターを監視したい場合は、情報の型を「数値(整数)」に指定し、[事前処理]タブで「Boolean to decimal」事前処理ステップを選択します。サーバーはBoolean値をそれぞれ1または0として保存します。

JMX item キーの詳細

シンプルな属性

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

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

この例では、オブジェクト名は "com.example:Type=Hello"、属性名は "weight" で、返される値の型はおそらく "数値(浮動小数点)" であるべきです。

複合データを返す属性

例えば、属性名が "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.fruits"であることを、Zabbixにどのように伝えればよいのでしょうか?属性名とハッシュキーを区切るドットと、名前の一部であるドットをどのように区別すればよいのでしょうか?

これは可能です。名前の一部であるドットをバックスラッシュでエスケープするだけです。

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アイテムキー内のその他の特殊文字の扱いについては、アイテムキーのフォーマット セクションを参照してください。

実際、これがすべてです。JMX監視をお楽しみください!

非プリミティブデータ型

toString() メソッドをオーバーライドする非プリミティブデータ型を返すカスタムMBeanを使用することができます。

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

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

この機能を例示するために、JBoss EAP 6.4 の監視を設定してみましょう。まず、いくつかの前提条件を設定します。

  • すでにZabbix Javaゲートウェイをインストールしていること。まだの場合は、ドキュメントに従ってインストールしてください。
  • ZabbixサーバーとJavaゲートウェイは /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テンプレート内のアイテムのJMXエンドポイントパラメータを一括更新します。

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

設定キャッシュを更新します。

/usr/local/sbin/zabbix_server -R config_cache_reload

最初にエラーが発生する場合がありますのでご注意ください。

「Unsupported protocol: remoting-jmx」は、Javaゲートウェイが指定されたプロトコルで動作する方法を知らないことを意味します。これは、次の内容の ~/needed_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

次のコマンドを実行します。

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ゲートウェイはjmx-remotingで動作するために必要なすべてのモジュールを持つことになります。あとはJavaゲートウェイを再起動し、しばらく待って、すべてが正しく設定されていれば、JMX監視データがZabbixに届き始めるはずです(参考:最新データ)。