JBoss EAP の CLI を利用してデータソースの統計情報を抽出する

JBoss EAPCLI を利用してデータソースの統計情報を抽出する手順を整理します。
(このネタも殆ど同じ会社の方に教えていただいた情報ですが…)


  • 5秒毎に任意のデータソースの統計情報から ActiveCount の行を抽出し、値の右側にあるカンマを削除するサンプル
while true; do $JBOSS_HOME/bin/jboss-cli.sh -c --command="/subsystem=datasources/data-source=<データソース名>/statistics=pool:read-resource(include-runtime=true)" | grep "ActiveCount" | awk '{print $3}' | sed -e 's/,//'; sleep 5; done
5
5
5
5


  • (参考)上記検証を実施した環境で awk/sed によるフィルター/置換を実施しない場合の CLI 実行結果(ActiveCount が 5 だということが確認できます)
$JBOSS_HOME/bin/jboss-cli.sh -c --command="/subsystem=datasources/data-source=<データソース名>/statistics=pool:read-resource(include-runtime=true)"
{
    "outcome" => "success",
    "result" => {
        "ActiveCount" => 5,
        "AvailableCount" => 4,
        "AverageBlockingTime" => 3L,
        "AverageCreationTime" => 252L,
        "AverageGetTime" => 3L,
        "AveragePoolTime" => 26L,
        "AverageUsageTime" => 5L,
        "BlockingFailureCount" => 0,
        "CreatedCount" => 5,
        "DestroyedCount" => 0,
        "IdleCount" => 4,
        "InUseCount" => 1,
        "MaxCreationTime" => 724L,
        "MaxGetTime" => 140L,
        "MaxPoolTime" => 142980L,
        "MaxUsageTime" => 175L,
        "MaxUsedCount" => 5,
        "MaxWaitCount" => 4,
        "MaxWaitTime" => 37L,
        "TimedOut" => 0,
        "TotalBlockingTime" => 8261L,
        "TotalCreationTime" => 1262L,
        "TotalGetTime" => 591603L,
        "TotalPoolTime" => 5243097L,
        "TotalUsageTime" => 1138902L,
        "WaitCount" => 1236,
        "XACommitAverageTime" => 0L,
        "XACommitCount" => 0L,
        "XACommitMaxTime" => 0L,
        "XACommitTotalTime" => 0L,
        "XAEndAverageTime" => 0L,
        "XAEndCount" => 0L,
        "XAEndMaxTime" => 0L,
        "XAEndTotalTime" => 0L,
        "XAForgetAverageTime" => 0L,
        "XAForgetCount" => 0L,
        "XAForgetMaxTime" => 0L,
        "XAForgetTotalTime" => 0L,
        "XAPrepareAverageTime" => 0L,
        "XAPrepareCount" => 0L,
        "XAPrepareMaxTime" => 0L,
        "XAPrepareTotalTime" => 0L,
        "XARecoverAverageTime" => 0L,
        "XARecoverCount" => 0L,
        "XARecoverMaxTime" => 0L,
        "XARecoverTotalTime" => 0L,
        "XARollbackAverageTime" => 0L,
        "XARollbackCount" => 0L,
        "XARollbackMaxTime" => 0L,
        "XARollbackTotalTime" => 0L,
        "XAStartAverageTime" => 0L,
        "XAStartCount" => 0L,
        "XAStartMaxTime" => 0L,
        "XAStartTotalTime" => 0L,
        "statistics-enabled" => true
    }
}


  • CLI 実行結果の JSON テキストに対して jq コマンドで項目をフィルターし、CSV テキストへ変換するサンプル
$JBOSS_HOME/bin/jboss-cli.sh -c --output-json --command="/subsystem=datasources/data-source=<データソース名>/statistics=pool:read-resource(include-runtime=true)" | jq '[.result.ActiveCount,.result.IdleCount,.result.InUseCount,.result.MaxUsedCount] | @csv'
"5,2,3,5"


  • 上記処理をループして5秒毎に CSV テキストを出力するサンプル
while true; do $JBOSS_HOME/bin/jboss-cli.sh -c --output-json --command="/subsystem=datasources/data-source=<データソース名>/statistics=pool:read-resource(include-runtime=true)" | jq '[.result.ActiveCount,.result.IdleCount,.result.InUseCount,.result.MaxUsedCount] | @csv'; sleep 5; done
"5,4,1,5"
"5,3,2,5"
"5,3,2,5"
"5,4,1,5"


本格的に利用する場合は、実行タイミングで時刻情報も出力するような改良が必要ですね…。
こんなサンプルですが何か参考になれば幸いです。


(追記)

  • 上記処理の先頭に日付時刻情報を出力するようにしたサンプル
while true; do date '+%Y%m%d-%H%M%S' | tr '\n' ' '; $JBOSS_HOME/bin/jboss-cli.sh -c --output-json --command="/subsystem=datasources/data-source=<データソース名>/statistics=pool:read-resource(include-runtime=true)" | jq '[.result.ActiveCount,.result.IdleCount,.result.InUseCount,.result.MaxUsedCount] | @csv'; sleep 5; done
20220810-212010 "5,2,3,5"
20220810-212023 "5,4,1,5"
20220810-212037 "5,3,2,5"
20220810-212052 "5,3,2,5"


CLI コマンドの実行に数秒掛るためか約13秒くらいの間隔で出力されてますね。1行スクリプトは奥が深いです。