13 JMX 監視

概要

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

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

ホスト上の特定のJMXカウンターの値を取得するために、ZabbixサーバーはZabbix Javaゲートウェイ に問い合わせを行い、Javaゲートウェイはさらに JMX管理API を使用して対象のアプリケーションにリモートで問い合わせます。

詳細および設定については、Zabbix Javaゲートウェイ セクションを参照してください。

Javaゲートウェイと監視対象の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はローカルホストからの受信JMX接続をポート12345で待ち受けるようになり、認証や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.* オプションをJavaゲートウェイに追加して 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アイテムで固有の情報が必要なフィールドは次のとおりです。

Type ここで JMXエージェント を設定します。
Key jmx[] アイテムキーには、3つのパラメータが含まれます。
object name - MBeanのオブジェクト名
attribute name - ドットで区切られたオプションの複合データフィールド名を含むMBean属性名
unique short description - 同じオブジェクト名と属性名を持つ複数のJMXアイテムをホスト上で区別できるようにする一意の説明(任意)
JMXアイテムキーの詳細については、以下を参照してください。
jmx.discovery[] ローレベルディスカバリ アイテムを使用して、MBeanおよびMBean属性を検出できます。
JMX endpoint カスタムJMXエンドポイントを指定できます。JMXエンドポイントの接続パラメータがJMXインターフェースと一致していることを確認してください。これは、デフォルトのJMXエンドポイントで行われているように {HOST.*} マクロを使用することで実現できます。
{HOST.*} マクロ およびユーザーマクロがサポートされています。
User name Javaアプリケーションで認証を設定している場合は、ユーザー名(255文字以内)を指定します。
ユーザーマクロがサポートされています。
Password Javaアプリケーションで認証を設定している場合は、パスワード(255文字以内)を指定します。
ユーザーマクロがサポートされています。

"true" または "false" のいずれかとなるBooleanカウンターを監視したい場合は、情報の型として "Numeric (unsigned)" を指定し、[前処理] タブで "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" ではなく "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ゲートウェイ をインストールしていること。まだの場合は、documentation に従ってインストールできます。
  • 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 に届き始めることを確認できます(参照: Latest data)。