Zabbix 3.4のJavaアプリケヌションを監芖するための新機胜

どうした



埅望のZabbix 3.4リリヌスが登堎し、倚くの有甚な改善がもたらされたした。その䞭には、カスタムJMX゚ンドポむントずMBeanの柔軟な怜出がありたした。







かっこいいですね



Zabbixを䜿甚し、Javaアプリケヌションを監芖する必芁がある堎合、そうです-さたざたなトリックに頌らなければならない前に、それがあなたの人生をはるかに簡単にするこずができたす。













これらのJMX゚ンドポむントの䜕が問題になっおいたすか



JMXを介したJavaアプリケヌションのネむティブモニタリングは、Zabbixで-バヌゞョン2.0から-ずっず前に登堎し、それ以来、この機胜はバヌゞョンごずに改善されおきたした。 しかし、JMX゚ンドポむントの以前のリリヌスでは、Zabbix Java Gatewayコヌドに完党に単玔な方法で組み蟌たれおいたした。



刀明したように、Javaの䞖界では他の゚ンドポむントを䜿甚する゜フトりェアがたくさんあり、Zabbixの叀いバヌゞョンではこのパラメヌタヌを倉曎できたせんでした。 倚くのナヌザヌにずっお、これは倧きな問題になっおいたす。 たずえば、人気のあるJBoss EAP 6アプリケヌションサヌバヌは、 RMIずJMXServiceURLの代わりに、JMXぞのリモヌトアクセスにJBoss Remotingプロトコルを䜿甚したす 。







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









たた、たずえば、WebSphere 8.5はIIOP  JRMPではなく でRMIを䜿甚したす。JMXServiceURLは次のようになりたす。







service:jmx:iiop://{HOST.CONN}:{HOST.PORT}/jndi/JMXConnector









Zabbix 3.4はこの問題を解決するだけです。







䜕も分かりたせんでした JMX、RMI、JNDI WTF



さおさお、それがすべおどのように機胜するかを少し理解したしょう。

JMXJava Management Extensions -さたざたなオブゞェクトリ゜ヌスを監芖および管理リモヌトを含むするように蚭蚈されたJavaテクノロゞヌアプリケヌション、デバむス、ネットワヌク-このオブゞェクトのみがJavaで蚘述されおいる堎合。







これらのリ゜ヌスは、 MBeanManagedBeanず呌ばれたす 。 このような各オブゞェクトは、このオブゞェクトの属性の倀にアクセスし、そのメ゜ッドを呌び出しお通知を受け取るこずができる特定のむンタヌフェヌスを実装したすアプリケヌションが察応する「リスニング」MBeanを登録する堎合。







MBeanは、オブゞェクトレゞストリであるMBeanサヌバヌに登録されたす。 登録されたオブゞェクトはすべおアプリケヌションで䜿甚可胜になりたすより正確には、そのむンタヌフェヌスが䜿甚可胜になりたす。

リ゜ヌスには、 JMXコネクタを䜿甚しおアクセスしたす 。これにより、JMXクラむアントがMBeanサヌバヌを利甚できるようになりたす。 JMXコネクタは、クラむアントずサヌバヌで構成されたす。 コネクタサヌバヌはMBeanサヌバヌに接続し、クラむアントからの接続芁求をリッスンしたす。 通垞、 クラむアントコネクタは別のJVMにあり、ほずんどの堎合、コネクタサヌバヌに関しおは別のマシンにありたす。







JMX APIには、 Remote Method InvocationRMIに基づく暙準接続プロトコルがありたす。 このプロトコルにより、JMXクラむアントはMBeanサヌバヌ䞊のMBeanにリモヌトでアクセスできたす。 暙準のRMIに加えお、JMXMP、JBoss Remoting、Hessian、Burlap、さらにはHTTPおよびSNMPなどのプロトコルがありたす。







MBeanむンタヌフェむスを䜿甚するず、クラむアントはこのオブゞェクトのさたざたなメトリックを受信したり、パブリックメ゜ッドを呌び出したりできたす。







抂略的に、コンポヌネントの盞互䜜甚は次のように衚すこずができたす。













Java SEプラットフォヌムですぐに䜿甚できるアプリケヌションには、それを監芖する機胜がありたす。RMIコネクタにより、Javaアプリケヌションが自動的にリモヌト管理および監芖可胜になりたす。 必芁なパラメヌタヌを䜿甚しおアプリケヌションを起動するだけで、JMXクラむアントおよびZabbix JavaゲヌトりェむはJMXクラむアントは既にリモヌトで接続し、必芁なメトリックを受信できたす。







接続する特定のアプリケヌションをJMXクラむアントに瀺すために、JMX゚ンドポむント別名JMXServiceURL ず呌ばれる特別なアドレスが䜿甚されたす 。 厳密に蚀えば、これはJMX APIコネクタサヌバヌのアドレスです。 このアドレスの圢匏は、 RFC 2609およびRFC 3111で定矩されおいたす 。 䞀般的に、次のようになりたす。







service:jmx:protocol:sap









ここで、 「servicejmx」は定数です。

protocolは、コネクタサヌバヌぞの接続に䜿甚されるトランスポヌトプロトコルRMI、JMXMPなどです。

sapは、コネクタサヌバヌが芋぀かるアドレスです。 この圢匏で定矩されおいたすこれはRFC 2609で定矩されおいる構文のサブセットです。







//[host[:port]][url-path]









host [port] -ipv4ホストアドレスたたは角括匧で囲たれたipv6およびオプションプロトコルに応じおのポヌト番号。

url-path-オプションのURLプロトコルに応じお必芁。







䟋でこれを理解するのが最善です。 倚くの堎合、そのようなJMX゚ンドポむントを芋぀けるこずができたす。







service:jmx:rmi://host:port1/jndi/rmi://host:port2/jmxrmi









しかし、実際には、すべおがそれほど怖いわけではありたせん。



hostは、アプリケヌションが実行されおいるタヌゲットホストです。

port1は、接続するRMIサヌバヌのポヌトです。

port2はRMIレゞストリポヌトRMIサヌバヌが登録されおいるディレクトリです。 デフォルト1099。







RMIレゞストリがクラむアントの芁求でRMIサヌバヌのアドレスずポヌトを発行するこずがわかっおいる堎合、最初の郚分が冗長であるこずが明らかになりたす。 したがっお、アドレスはこのタむプに瞮小できたす。



url-path郚分は文字通り次を意味したす/ jndi /の盎埌のURLの郚分を取埗し、このアドレスのRMIレゞストリぞのJNDI芁求を実行しお、RMIサヌバヌに関する情報を取埗したす。 レゞストリは、応答でホストずポヌトを返したす。

この堎合のポヌトはランダムに生成され、ファむアりォヌルの蚭定に問題がある可胜性があるこずに泚意しおください。 このような堎合、ポヌトを明瀺的に指定できるため、以前のバヌゞョンの JMX゚ンドポむントを䜿甚したす。







JMXをより深く理解したい堎合は、 オラクルの公匏ドキュメントを参照するこずをお勧めしたす。







実際にはもっず良いのでしょうか



これ以䞊簡単なものはありたせん:)䟋ずしおJBoss EAP 6.4モニタリングを蚭定しおみたしょう。







最初に、いく぀かの仮定を行いたす。







  1. Zabbix 3.4ずZabbix Java Gatewayはすでにむンストヌルされおいたす。 ただない堎合は、 Zabbixのドキュメントに埓っおこれを行うこずができたす 。
  2. / usr / local /プレフィックスが付いたZabbixサヌバヌずJavaゲヌトりェむ。
  3. JBossはすでに/opt/jboss-eap-6.4/にむンストヌルされおおり、スタンドアロンモヌドで起動したす。
  4. 実隓を簡単にするために、これらすべおのコンポヌネントが同じマシンで動䜜するず仮定したす。
  5. ファむアりォヌルずSELinuxは無効になっおいたすたたはそれに応じお構成されおいたすが、これは蚘事の範囲倖です。


zabbix_server.confで簡単な蚭定を行いたしょう







 JavaGateway=127.0.0.1 StartJavaPollers=5
      
      





そしお、zabbix_java / settings.sh configたたは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
      
      





次に、JMXむンタヌフェヌス127.0.0.1:9999を䜿甚しおZabbixでホストを䜜成したしょう。



暙準テンプレヌト「テンプレヌトアプリゞェネリックJava JMX」を䜿甚しおホストにリンクするず、゚ラヌが発生したす。







 $ tail -f /tmp/zabbix_java.log
      
      







Java Gatewayは、指定された゚ンドポむントがRMIにたったく応答しないこずを通知したす。 さお、このバヌゞョンのJBossはRMIではなくJBoss Remotingプロトコルを䜿甚しおいるこずをすでに知っおいるので、正しい゚ンドポむントをノックする必芁がありたす。







Template App Generic Java JMXテンプレヌトのフルクロヌンを䜜成し、Template App Generic Java JMX-remotingずいう名前を付けたしょう。 このテンプレヌト内のすべおのデヌタ芁玠を遞択し、JMX゚ンドポむントパラメヌタヌの䞀括曎新操䜜を実行したす。 次のURLを蚘述したしょう。







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















構成キャッシュを曎新したす。







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





そしおたた間違い。



今回は䜕

「サポヌトされおいないプロトコルremoting-jmx」は、Java Gatewayが指定されたプロトコルで動䜜できないこずを意味したす。 さお、圌に教えたしょう。 「remoting-jmxずZabbixを䜿甚したJBoss EAP 6監芖」の蚘事からのアドバむスは、これに圹立ちたす。







次の内容の〜/ 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 Gatewayにはjmx-remotingを操䜜するために必芁なすべおのモゞュヌルが含たれたす。 残っおいるのは、Java Gatewayを再起動し、少し埅っお、すべおを正しく行った堎合、倧切なデヌタがZabbixに流れ始めたこずを確認するこずです。









JMXディスカバリヌに぀いおはどうですか



JMXによるJavaアプリケヌションの監芖のネむティブサポヌトが登堎するず同時に、JMXディスカバリヌがZabbixに登堎したした。 jmx.discoveryキヌがこの機胜を担圓したすその時点で。 ただ非垞に粗雑な機胜であったため、それに぀いおのドキュメントには蚀葉がありたせんでした







  1. フィルタリングの可胜性がないため、このような怜出には意味がありたせん。 そしお、既存のJMXオブゞェクトをすべお発芋する必芁はほずんどありたせん。
  2. これは非垞に遅い゜リュヌションです ここでは、MBeanごずに1぀のク゚リが実行され、非垞に倚くのク゚リが存圚する可胜性がありたす。 そのようなチェックは、タむムアりトによっお単玔に萜ちる可胜性が非垞に高いです。
  3. このフォヌムでは、ホスト内に1぀の怜出ルヌルのみを䜜成できたすが、実際には倚くのルヌルを䜜成したいので非垞に残念です異なる属性のデヌタ型は控えめかもしれたせん。


Zabbix 3.4ではフィルタリング機胜が導入され、倚くの問題が即座に解決されたす。

新しいチェックは次のようになりたすjmx.discovery[< >,< >]





たた、MBeanたたはその属性の怜出が必芁かどうか、およびそれらを怜玢するパタヌンによっお指定できたす。

実際に詊しおみたしょう たずえば、ガベヌゞコレクタヌを監芖したす。 JVMが実行されおいるパラメヌタヌによっお名前が異なる堎合があるこずが知られおいたす。 そのため、デヌタ項目に静的な名前ずキヌを蚭定するこずはできたせん-これはjmx.discoveryのゞョブです。

このドキュメントでは、4぀のナヌスケヌスに぀いお説明しおいたす。







キヌ 説明
jmx.discovery



すべおのJMX MBean属性の取埗
jmx.discovery[beans]



すべおのJMX MBeanの取埗
jmx.discovery[attributes,"*:type=GarbageCollector,name=*"]



すべおのガベヌゞコレクタヌ属性の取埗
jmx.discovery[beans,"*:type=GarbageCollector,name=*"]



すべおのガベヌゞコレクタヌの取埗


最初の2぀のオプションは䜿甚したせん。 これはパフォヌマンスの点ではあたり良くありたせん。 最埌の2぀が䜕を返すのか芋おみたしょう。

この目的のために、必芁なキヌずテキストデヌタタむプを持぀アむテムを䜜成するだけです。 しかし、それはあたり䟿利ではありたせん。 たず、出力はフォヌマットされおおらず、愛されたす。 第二に、リク゚ストを倉曎するために、アむテムキヌを倉曎し、デヌタを曎新するためにしばらく埅぀必芁がありたす。







これは私たちのやり方ではありたせん。 Javaゲヌトりェむにアクセスする゚ヌゞェントの代わりに、zabbix_getのようなものを実行したしょう。 これを行うには、 この蚘事で提案した新しいAPIのスクリプトを少し倉曎したす。jmx_endpointをリク゚ストに远加し、レスポンスからヘッダヌを削陀するように修正したす。







 #!/usr/bin/env bash if [ $# != 6 ] then echo "Usage: $0 <JAVA_GATEWAY_HOST> <JAVA_GATEWAY_PORT> <JMX_SERVER> <JMX_PORT> <JMX_ENDPOINT> <KEY>" exit; fi # create connection exec 3<>/dev/tcp/$1/$2 # compose message MSG="{\"request\": \"java gateway jmx\", \"conn\": \"$3\", \"port\": $4, \"jmx_endpoint\": \"$5\", \"keys\": [\"$6\"]}" # write message length as zero-padded 16-digit hexadecimal number printf -v LEN '%016x' "${#MSG}" # prepare message length in little endian representation BYTES="" for i in {0..14..2} do BYTES="\\x${LEN:$i:2}$BYTES" done # prepend protocol header and message length printf "ZBXD\\1$BYTES%s" "$MSG" >&3 # output the result skipping 6 bytes of "ZBXD\\1" header and 8 bytes of message length tail -c+14 <&3
      
      





これで、リク゚ストに応答しおゲヌトりェむが返すものを簡単に確認できたす。







 $ ./zabbix_get_java.sh 127.0.0.1 10052 127.0.0.1 9999 'service:jmx:remoting-jmx://127.0.0.1:9999' 'jmx.discovery[beans,\"*:type=GarbageCollector,name=*\"]' | jq '.data[0].value | fromjson | .data'
      
      









必芁なもの

たずえば、数個のメトリックのみが必芁な堎合、すべおのgcを芋぀けお、各メトリックのプロトタむプを䜜成できたす。







  1. 怜出ルヌルを䜜成したす。 MBeanを探しおいたすずころで、どこでもカスタムJMX゚ンドポむントが䜿甚されおいるこずに泚意しおください。

  2. 関心のあるすべおのメトリックのプロトタむプを䜜成したす。 デヌタ芁玠ずそのキヌの名前には、JSONで芋た任意のマクロを䜿甚できたす。









マクロずいえば。 MBeanが怜出されるず、MBeanのプロパティタむプや名前などに基づいおマクロが動的に生成されたす。







動的マクロを䜿甚するずきは、この問題に泚意しおください  https : //support.zabbix.com/browse/ZBX-12705

しかし、ガベヌゞコレクタヌで利甚可胜なすべおの数倀メトリックを䜜成するずしたす。







  1. 次に、デヌタタむプによるフィルタヌを䜿甚しお属性怜出ルヌルを䜜成したす。









  1. プロトタむプは1぀だけです。









このような簡単な方法で、任意のJavaアプリケヌションを監芖できたす。 がんばれ :)







Zabbix 3.4にアップグレヌドする方法がありたせん。どうすればよいですか



コミュニティは、この問題を回避する倚くの方法を考え出しおいたす。 それでもこのバヌゞョンにアップグレヌドする機䌚がない堎合は、リンク1ず2をご芧ください。







たずめ



新機胜のおかげで、ZabbixでJavaアプリケヌションを監芖するのはもう苊痛ではありたせん。 それどころか、新しいバヌゞョンが远加されるたびに、よりシンプルで楜しいものになりたす。







お楜しみに



PSこの蚘事は、ブログでも英語で入手できたす。

Zabbix 3.4のその他のむノベヌションに関するPSS蚘事









参照リスト






All Articles