Red Hat で Java Platform Advocate として OpenJDK を担当している伊藤ちひろ(@chiroito)です。
この記事は、Red Hat Developerのブログ記事、Java monitoring for custom targets with Cryostat | Red Hat Developer の翻訳記事です。
デフォルトでは、CryostatはリモートJava Management Extensions (JMX)とJMX-RMIが有効な接続性を持つ、発見可能で有効なターゲットを自動的に認識します。発見機能は、Kubernetes APIベースのサービスエンドポイントやJava Discovery Protocol (JDP)など、さまざまなメカニズムに基づいています。
Cryostat 2.0では、開発者は、有効だがまだ発見されていない既知の潜在的なJavaアプリケーションのターゲットにカスタムURLを提供することによって、接続を作成できるようになりました。カスタムターゲット定義は、Cryostatインスタンスが再起動した後でも利用できるように保存できます。この機能は、CryostatのWebフロントエンドで、この記事で紹介したターゲットの作成機能を通じて利用できます。
Cryostat 2.0では、新しいclientlibディレクトリも導入されました。このディレクトリにターゲットアプリケーションJARを追加することで、作成するカスタムターゲットにカスタム接続プロトコルを指定できます。ここでは、そのような接続プロトコルを使用するカスタムターゲットを追加する方法を説明します。
このシリーズの全記事を読む
- Part 1: Cryostat 2.0を発表:コンテナ用JDK Flight Recorder - 赤帽エンジニアブログ
- Part 2: Cryostatを使用するためのJavaアプリケーションの設定 - 赤帽エンジニアブログ
- Part 3: CryostatによるカスタムターゲットのJavaモニタリング - 赤帽エンジニアブログ
- Part 4: Automating JDK Flight Recorder in containers - 赤帽エンジニアブログ
- Part 5: Creating Custom JFR event templates with Cryostat 2.0
注:CryostatはKubernetesまたはRed Hat OpenShiftのためのJDK Flight Recorderです。Cryostat 2.0 の Red Hat ビルドは、現在、技術プレビューで広く利用できます。Red Hat ビルドには、Red Hat OpenShift 上での Cryostat のデプロイを簡素化および自動化するための Cryostat Operator が含まれています。
前提条件とセットアップ方法
このデモでは、クライアント定義の接続プロトコルでカスタムターゲットに接続します。前提条件として、Red Hat OpenShift クラスタ上で Cryostat Operator を介して Cryostat をインストールし、動作させておく必要があります。インストールの詳細については、Cryostat.io を参照してください。
ターゲットには単純な WildFly アプリケーションを使用することにします。まず、Cryostat インスタンスが動作しているのと同じ名前空間にアプリケーションを追加します。
oc new-app quay.io/andrewazores/wildfly-demo:v0.0.2 && oc expose svc wildfly-demo --port=8082
アプリケーションがクラスタ上で動作しているので、oc status
を入力すると、cryostat-operator
とCryostatインスタンスと一緒に表示されます。
注:JavaアプリケーションがCryostatを使用するように設定する手順については、このシリーズの前の記事を参照してください。Cryostatについて学ぶ他の方法については、この記事の最後を参照してください。
クライアント定義の接続プロトコルを追加
アプリケーションはポート 9990 で JMX remote+http プロトコルを使ってリッスンしますが、Cryostat のデフォルト接続プロトコルである JMX-RMI ではありません。Cryostat インスタンスがターゲットアプリケーションを認識し、通信する(つまり、カスタム接続プロトコルを受け入れる)ためには、追加の JAR を提供しなければなりません。
WildFly クライアント JAR をダウンロード
WildFly アプリケーションの場合、JAR は WildFly の完全なリリースをダウンロードすると入手できます。選択したバージョンは、アプリケーションの作成に使用したものと一致しなければならず、この場合、バージョン 23.0.1.Final です。したがって、このバージョンの Jakarta EE Full & Web ディストリビューションの tarball をダウンロードしなければなりません。ダウンロードしたら、次のようにtarballを展開します。
tar -xvf ~/Downloads/wildfly-23.0.1.Final.tar.gz
必要な jboss-client.jar は解凍した wildfly-23.0.1.Final/bin/client/ ディレクトリに配置されています。
クライアントJARをclientlibに追加
必要な JAR が手に入ったので、あとは Cryostat インスタンスにマウントされている永続ボリューム内の clientlib ディレクトリに追加するだけです。まず、インスタンスを収容するポッドの名前を取得します。
oc get pods -l app=cryostat-sample
Pod名がわかったので、oc cp
コマンドでJARを転送します。
oc cp ~/Downloads/wildfly-23.0.1.Final/bin/client/jboss-client.jar ${PROJECT_NAME}/${CRYOSTAT_POD_NAME}:/opt/cryostat.d/clientlib.d
注:PROJECT_NAME
はクラスタを含むプロジェクト(すなわち名前空間)の名前、CRYOSTAT_POD_NAME
は前のコマンドを実行した結果です。
Cryostatインスタンスを再起動
JARをCryostatのクラスパスに追加したので、ファイルをロードするためにCryostatインスタンスを再起動します。
oc rollout restart deployment/cryostat-sample -n ${PROJECT_NAME}
Cryostatモニタリング用カスタムターゲットの追加
ポッドが復旧したら、Cryostat が監視するカスタムターゲットとして WildFly アプリケーションを追加できます。まず、アプリケーションを収容しているポッドの IP アドレスを取得します。
ポッド名とIPアドレスの取得
まず、ポッド名を取得することから始めます。
oc get pods -l deployment=wildfly-demo
ここで、ポッド名を使って、IPアドレスを取得します。
oc get pod ${WILDFLY_POD_NAME} -o jsonpath='{.status.podIP}' ; echo
注:WILDFLY_POD_NAME
は、前のコマンドを実行したときの結果です。
WildFlyをカスタムターゲットとして追加
IPアドレスが分かったので、先に進んでWildFlyアプリケーションをカスタムターゲットとして追加します。
CryostatのWebフロントエンドを使用するには、oc status
を確認し、cryostat-sample
サービスのアプリケーションURLを辿ってください。認証トークンの入力を求められたら、oc whoami -t
を使って取得できる OpenShift アカウントのトークンを入力します。図1は、Cryostatのログインページです。
Target JVM の横にある + アイコンを押して、カスタムターゲットを作成します。接続 URL には service:jmx:remote+http://${IP_ADDRESS}:9990
と入力します。ここで IP_ADDRESS
は WildFly アプリケーション・ポッドのアドレスです。エイリアスには、図2に示すように「WildFly」を使用することにします。
図3の画面で、ターゲットが作成されたことが確認できます。
ターゲットJVMでの認証
WildFlyターゲットが作成されたら、それを選択して、図4に示すように、「Recordings」に移動できます。
ターゲット JVM(つまり WildFly アプリケーション)で認証するよう促されます。アプリケーションは、ユーザー名 "admin"、パスワード "password" で JMX 認証を使用するように設定されています。図 5 は認証画面です。
セットアップが完了したら、図 6 に示すように WildFly ターゲット アプリケーションで新しいフライト レコーディングを作成できます。
図7は、私たちが成功したことを示しています。
まとめ
この記事では、クライアント定義のプロトコルを使用して、Cryostat モニタリング用のカスタムターゲットを定義する方法を学びました。Cryostat でカスタムターゲットを設定したら、様々な方法でそのターゲットと対話できます。詳細はCryostat.ioにアクセスするか、以下の記事を参照してください。