CryostatによるカスタムターゲットのJavaモニタリング

Red Hat で Java Platform Advocate として OpenJDK を担当している伊藤ちひろ(@chiroito)です。

この記事は、Red Hat Developerのブログ記事、Java monitoring for custom targets with Cryostat | Red Hat Developer の翻訳記事です。


https://developers.redhat.com/sites/default/files/styles/article_feature/public/2020_Java_ContainerJFR_Featured_Article__A-01.png?itok=K_g-UdJY

デフォルトでは、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を追加することで、作成するカスタムターゲットにカスタム接続プロトコルを指定できます。ここでは、そのような接続プロトコルを使用するカスタムターゲットを追加する方法を説明します。

このシリーズの全記事を読む

注: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のログインページです。

https://developers.redhat.com/sites/default/files/styles/article_floated/public/custom-target-login.png?itok=MB_dQLym

図1. Cryostatのログインページ

Target JVM の横にある + アイコンを押して、カスタムターゲットを作成します。接続 URL には service:jmx:remote+http://${IP_ADDRESS}:9990 と入力します。ここで IP_ADDRESS は WildFly アプリケーション・ポッドのアドレスです。エイリアスには、図2に示すように「WildFly」を使用することにします。

https://developers.redhat.com/sites/default/files/styles/article_floated/public/custom-target-create-target.png?itok=W4yvUXdp

図2. カスタムターゲット定義の作成

図3の画面で、ターゲットが作成されたことが確認できます。

https://developers.redhat.com/sites/default/files/styles/article_floated/public/custom-target-target-created.png?itok=-Sp_1QSG

図3.ターゲットが作成されたことを確認

ターゲットJVMでの認証

WildFlyターゲットが作成されたら、それを選択して、図4に示すように、「Recordings」に移動できます。

https://developers.redhat.com/sites/default/files/styles/article_floated/public/custom-target-select-target.png?itok=ZXMGsbcC

図4.新しく作成されたターゲットを選択

ターゲット JVM(つまり WildFly アプリケーション)で認証するよう促されます。アプリケーションは、ユーザー名 "admin"、パスワード "password" で JMX 認証を使用するように設定されています。図 5 は認証画面です。

https://developers.redhat.com/sites/default/files/styles/article_floated/public/custom-target-navigate-recordings.png?itok=SnF86ujY

図5. 新しいターゲットに接続するための認証情報を入力

セットアップが完了したら、図 6 に示すように WildFly ターゲット アプリケーションで新しいフライト レコーディングを作成できます。

https://developers.redhat.com/sites/default/files/styles/article_floated/public/customt-target-create-recording.png?itok=cegluiGR

図 6. カスタムターゲットで新規録画を開始

図7は、私たちが成功したことを示しています。

https://developers.redhat.com/sites/default/files/styles/article_floated/public/custom-target-recording-created.png?itok=ECV6kT_e

図7. ターゲット上で実行されているレコーディング

まとめ

この記事では、クライアント定義のプロトコルを使用して、Cryostat モニタリング用のカスタムターゲットを定義する方法を学びました。Cryostat でカスタムターゲットを設定したら、様々な方法でそのターゲットと対話できます。詳細はCryostat.ioにアクセスするか、以下の記事を参照してください。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。