Payara の Health Check Service

この記事は、Payara Advent Calendar 2016 の 6 日目です。昨日は「Payara Server と Payara Micro のクラスタリング」です。

今回から 3 回に渡って、Payara が持つ監視機能についてご紹介します。Payara には現在、以下の 3 種類の監視機能が備わっています。

  • Health Check Service
  • Nortification Service
  • Request Tracing Service

今回は Health Check Service について取り上げます。

1. Health Check Service とは

Health Check Service は、Payara の状態を監視して一定の閾値を超えた場合に、それを server.log へ出力する機能です。Payara が持つ 3 種類の監視機能の中では最も古く、Payara 4.1.1.161 から実装されています。

Health Check Service の監視対象は以下の通りです。

  • ホストの CPU 使用率
  • ホストのメモリ使用量
  • Payara の JVM の GC
  • Payara の JVM のヒープ使用量
  • 個々のスレッドの CPU 使用率
  • 長時間動作していないスレッド

Health Check Service ではログに GOOD、WARNING、CRITICAL といった状態表示がなされるため、Payara の状態をいち早く知る手がかりとなります。

2. Health Check Service を使用する

Health Check Service に関する設定は、基本的に asadmin コマンドで行います。また、コマンド実行時には Payara が動作している必要があります。

2.1. Health Check Service の有効化/無効化

Health Check Service は既定では無効になっています。有効にするには、以下のコマンドを実行します。

$ asadmin healthcheck-configure --enabled=true --dynamic=true

--dynamic=true オプションは Payara の再起動なしで設定を即時反映する場合に指定します。指定しない場合は次回起動時から Health Check Service が有効となります。

Health Check Service を無効にするには、以下のコマンドを実行します。

$ asadmin healthcheck-configure --enabled=false --dynamic=true

2.2. Health Check Service の対象一覧の表示

asadmin healthcheck-list-services コマンドで、監視対象の一覧を表示することができます。実行結果は、例えば以下のようになります。

$ asadmin healthcheck-list-services
Available Health Check Services:
        healthcheck-cpool
        healthcheck-cpu
        healthcheck-gc
        healthcheck-heap
        healthcheck-threads
        healthcheck-machinemem

2.3. Health Check Service の監視対象の設定

Health Check Service は単に有効化しただけでは何も監視しません。どの項目を監視対象にするかを asadmin healthcheck-configure-service コマンドで指定します。具体的には、以下のようなコマンドを実行します。

$ asadmin healthcheck-configure-service --enabled=true --serviceName=監視対象 --name=短縮名 --dynamic=true

監視対象は、asadmin healthcheck-list-services で表示される一覧の中から選択します。短縮名はログ出力時に監視対象を識別するためのラベルで、省略時は各監視対象に用意された既定値 (CONP、CPUC、GBGC、HEAP、HOGT、MEMM) が使用されます。--dynamic=true は設定を即時反映するためのオプションです。

2.4. Health Check Service の閾値の設定

監視の閾値を任意の値に設定するには、asadmin healthcheck-config-threshold コマンドを使用します。例を以下に示します。

$ asadmin healthcheck-configure-service-threshold --serviceName=監視対象 --thresholdCritical=90 --thresholdWarning=50 --thresholdGood=0 --dynamic=true

閾値は監視対象ごとに設定します。--thresholdCritical は CRITICAL 出力、--thresholdWarning は WARNING 出力、--thresholdGood は GOOD 出力の閾値をそれぞれ設定するためのオプションです。既定値はそれぞれ 90 (%)、50 (%)、0 (%) です。上記の例は、既定の閾値と同じ値を設定しています。閾値を特に設定しない場合には、既定値が自動的に適用されます。

なお、healthcheck-configure-service-threshold で閾値を設定できるのは、healthcheck-cpool (JDBC コネクション・プール)、healthcheck-cpu (CPU 使用率)、healthcheck-heap (ヒープ使用量)、healthcheck-machinemem (物理メモリ使用量) の 4 種類です。healthcheck-threads (応答のないスレッドの検出) と healthcheck-gc (GC) に関する設定は別の方法を用います。

2.5. 応答のないスレッドを検出するための設定

応答のないスレッドを検出するためには、asadmin healthcheck-hoggingthreads-configure コマンドを使用します。

2.6. GC を監視するための設定

GC を監視する設定については、実は asadmin では設定できません。一旦 Payara を停止し、domain.xml を直接書き換える必要があります。

3. 実行サンプル

Health Check Service を有効にすると、server.log に以下のようなメッセージが出力されます。

[2016-05-24T03:52:28.690+0000] [Payara 4.1] [INFO] [fish.payara.nucleus.healthcheck.HealthCheckService] [tid: _ThreadID=72 _ThreadName=healthcheck-service-3 [timeMillis: 1464061948690] [levelValue: 800] [[
CPUC:Health Check Result:[[status=WARNING, message='CPU%: 75.6, Time CPU used: 267 milliseconds'']']]]

[2016-05-24T21:11:36.579+0000] [Payara 4.1] [SEVERE] [fish.payara.nucleus.healthcheck.HealthCheckService] [tid: _ThreadID=71 _ThreadName=healthcheck-service-3] [timeMillis: 1464124296579] [levelValue: 1000] [[
HOGT:Health Check Result:[[status=CRITICAL, message='Thread with : 145-testing-thread-1 is a hogging thread for the last 59 seconds 999 milliseconds'']']]]

これは Payara のマニュアルからの抜粋です。私の環境では GOOD しか出力されず、Health Check Service の効果を実感しづらいためです。

4. See also

Payara のマニュアルに Health Check Service に関する説明があります (英語)。