GlassFish の 構成項目とモニタリング項目

この記事はGlassFish Advent Calendar 2013の13日目として新たに書き下ろしたものです。昨日は @itoKami1123 さんの「GlassFish4.0ならJavaEE7のWebsocketが試せる!」でした。


今回はGlassFishの構成項目とモニタリング項目について、そのさわりの部分をお話しします。特にモニタリング項目については、本日のJavaFX勉強会の発表内容と重複するところがあるかと思いますが...いや、意図的に重複させてます。事前調査の効率化のために。

1. GlassFishのモニタリング機能

GlassFishが単体でも強力なモニタリング機能を持っていることは、実はあまり知られていません。まずは以下の図をご覧ください。

Monitoring Framework.png

図中央の Monitoring Framework は、Nucleusの構成要素で、GlassFishの監視系統を司る部位です。Monitoring Frameworkは、Nucleus自身、AppServer、JVMなどを監視し、その結果を JMX またはGlassFish独自の Monitor と呼ばれるインタフェースを用いて各監視クライアントに提供します。JMX経由ではそれほど多くの情報は提供できませんが、JMSに対応した多くのツールを使用できるメリットがあります。例えばJConsoleやVisualVM、あるいはMission ControlといったJDK付属のツールが活用できます。一方でMonitorに対応しているツールは数少ないのですが、詳細な情報を取ることが出来ます。現状ではasadminとREST backendくらいに限定されます。

上図、および初出のLT大会ではVisualVMがMonitorに対応しているという表現をしましたが、今この瞬間筆者の斜め右のモニターに映っているVisualVMにはそれらしき項目は見当たりません。

もう少し深く見ていくと、監視機能についてはJMXに JSR 77 : J2EE Management を統合した AMX と、BTraceをベースとした Flashlight Framework によって構成されています。それぞれの補足事項として、AMXではMBeanGMBAL (「ガンボール」と発音します)と呼ばれるアノテーション・ライブラリによって記述しています。またFlashlight Frameworkでは、Solaris環境においてオプショナルですがDTraceにも対応しています(更新ツール上では実際にDTrace対応の更新モジュールが存在しますが、Solaris以外の環境にインストールするとGlassFishが動作しない場合があります)。

現時点で筆者が把握しているのはこのくらいで、これ以上のこと、例えばAMXがJMX出力でFlashlightがMonitor出力を担当するような明確な切り分けがあるのか、監視機能が拾ってきたすべての情報をJMXとMonitorで提供しているのか(言い換えるとFlashlightを直接叩かないと出てこないような情報が存在するのか)、といったことは不明となっています。GlassFishのモニタリング機能自体、Monitorの出力形式以外はUndocumentedな部分だらけなのです。

なお、Monitorは図中の括弧書き Tree Node API が示すように、ツリー構造を持ったインタフェースです。また、GlassFishではMonitor以外にもドメインの構成項目もツリー構造となっています。

2. 構成項目とモニタリング項目のツリー

前述の通り、GlassFishではドメインの構成項目(平たくいうと管理コンソールで取得・設定が可能な項目)とモニタリング項目を、すべてツリー構造にして管理しています。先日ご紹介したREST backendでは、これらの項目をURIのパスツリー構造で表現しています。asadminでは、各ノードの階層をドット "." で区切って表現します。

表現は異なりますが、REST backend、asadminともにツリー構造になります。以下に例を示します。

構成項目(JDBC接続プール)の例

  • REST backend: /management/domain/resources/jdbc-connection-pool
  • asadmin: resources.jdbc-connection-pool

モニタリング項目(JVMメモリ使用状況)の例

  • REST backend: /monitoring/domain/server/jvm/memory
  • asadmin: server.jvm.memory

参考まで、筆者の検証環境のうち比較的構成が小さいもの(Windows上のGlassFish 4.0にLightFishをデプロイして、他のブログ記事原稿執筆のため多少設定をいじった程度)の構成項目とモニタリング項目の一覧をダンプしたものをアップロードします。構成項目で約320項目、モニタリング項目で約230項目存在しています。ちなみに、これらの値はMinimumに近いものです(つまり、Java Day Tokyo 2013のデモで使った24ノードクラスタが現存していたならば、項目数はとんでもないことになっていたということ)。

なお、REST管理チャネルではこれら構成項目の他に、ドメインに対する各種操作がURIのツリーに含まれるため、実際にはさらに大きなツリーを構成します。

3. 監視ツールLightFishの舞台裏

LightFishは、ドイツのJava Champion、Adam Bienが開発したGlassFishの監視ツールです。発表当時「JavaFXでGlassFishを監視できる」ことで注目を集めましたが(昨年のリリース直後から日本でも話題になりました)、「GlassFishを監視できる」という点でも非常に貴重なツールです。

GlassFishの監視ツールという点に絞れば、LightFishはREST backendの監視チャネルをポーリングするWebアプリケーションに過ぎません。しかし、そのような基本的なツールさえ提供されなかったところにアプリケーション・サーバーとしてのGlassFishの悲哀を感じます。

LightFishはGitHub上でソースコードが公開されているオープンソース・ソフトウェアなので、その仕組みを追うのは簡単です。例えば、以下のソースファイルを見てみましょう。

https://github.com/AdamBien/lightfish/blob/master/multilight/lightfish/src/main/java/org/lightfish/business/appmonitoring/control/EJBStatisticsCollector.java

getUri メソッドを見れば分かるように、URI /monitoring/domain 以下のリソース、つまりREST監視チャネルへのアクセスが確認できますし、以前の記事で取り上げた extraProperties の解析も行っていることが見て取れます。

LightFishは監視チャネルをポーリングして、その結果をWebSocketで送信し、JavaFXまたはJavaServer Facesで一覧やグラフ化を行っている監視ツールです。

4. 構成項目の上位要素

構成項目は最上位のノードだけで相当数存在します。一応、全量は以下に示すように /management/domain のchildResourcesに含まれるものになりますが、実際には(特にスタンドアロンの場合)いくつかの要素は存在しないか、あるいは空になっています。

  • applications
  • clusters
  • configs
  • jmx-urls
  • lb-configs
  • load-balancers
  • managed-job-config
  • node-agents
  • nodes
  • property
  • resources
  • secure-admin
  • security-configurations
  • servers
  • system-applications
  • system-properties
  • system-property

個々の項目についての説明は省略します。なぜなら、これらは管理コンソール上に対応する項目が存在しているからです。

5. モニタリング項目の上位要素

モニタリング項目の場合、最上位ノードは server だけです。そのため、実際には第2レベルのノードが一番大きい分類項目となります。これらの項目もまた、構成されていない場合は値を取得できません。

  • server.applications
  • server.connector-service
  • server.deployment
  • server.http-service
  • server.jms-service
  • server.jvm
  • server.network
  • server.orb
  • server.resources
  • server.security
  • server.thread-pool
  • server.transaction-service
  • server.web

個々の項目についての説明はGlassFishの Administration Guide (PDF) を参照してください(第8章:「Administrating the Monitoring Service」)。

6. 構成項目とモニタリング項目にアクセスするには?

6.1. 構成項目

構成項目へのアクセスは避け、可能な限り管理コンソール、またはasadminのサブコマンドを使用するようにしてください。値取得だけなら問題ありませんが、値設定で誤りがあるとGlassFish(正確には現在のドメイン)が破損する恐れがあります。

方法1 -- REST backendを用いる → 「GlassFishのREST backend」参照

方法2 -- asadminを用いる

項目名を一覧表示する場合は、listサブコマンドを用います。

asadmin list 構成項目名

例えば、次のように用います。listサブコマンドでは、ほとんどの場合でモニタリング項目名にワイルドカード "*" を使用することになるかと思われます。

asadmin list "applications.*"

項目の値を取得する場合は、getサブコマンドを用います。

asadmin get 構成項目名

例えば、次のように用います。getコマンドでも複数項目を同時取得するためにワイルドカード "*" を使用します。

asadmin get server.monitoring-service.module-monitoring-levels.*

項目に値を設定する場合は、setサブコマンドを用います

asadmin set 構成項目名=

例えば、次のように用います。setコマンドではワイルドカードは使用しません。

asadmin set resources.jdbc-connection-pool.DerbyPool.steady-pool-size=9

6.2. モニタリング項目

方法1 -- REST backendを用いる → 「GlassFishのREST backend」参照

方法2 -- asadminを用いる

項目名を一覧表示する場合は、listサブコマンドを用います。

asadmin list --monitor モニタリング項目名

例えば、次のように用います。listサブコマンドでは、ほとんどの場合でモニタリング項目名にワイルドカード "*" を使用することになるかと思われます。

asadmin list --monitor "server.*"

項目の値を取得する場合は、getサブコマンドを用います。

asadmin get --monitor モニタリング項目名

例えば、次のように用います。getコマンドでも複数項目を同時取得するためにワイルドカード "*" を使用します。

asadmin get --monitor "server.jvm.memory.*"

7. まとめ

GlassFishの基盤は、商用サーバーに匹敵する強力な監視機能を持っています。しかし、残念なことにその監視機能を生かすツールがごくわずかしか存在しないのが現状です。この記事が出発点となって、GlassFishの優れたモニタリングツールが開発されるようなことがあれば、それはとても嬉しいことだと思います。


明日は、最近JJUGの幹事になったらしい槙 @making さんから、JavaFXとJAX-RSに関する投稿がある予定です。