第3章 Java アプリケーションの設定
Cryostat が Java 仮想マシン (JVM) 上で実行されるターゲットアプリケーションに関する Java Flight Recorder (JFR) データを収集、保存、分析できるようにするには、Cryostat がアプリケーションを検出して接続できるようにアプリケーションを設定する必要があります。
アプリケーションは次のいずれかの方法で設定できます。
- Cryostat エージェント
検出と接続には、Cryostat エージェントコンポーネントを使用できます。このコンポーネントは、Java Instrumentation Agent として実装され、JVM 上で実行されるアプリケーションのプラグインとして機能します。
Cryostat エージェントは、Cryostat サーバーがアプリケーションの JMX ポートの代わりに使用できる HTTP API を提供します。適切に設定された Cryostat エージェントを、デプロイするワークロードアプリケーションに割り当てることで、ターゲットアプリケーションで JMX ポートを公開する必要なく、Cryostat 機能セットをすべて使用できます。
Cryostat エージェントの HTTP API は、JMX ポートと比較して次の利点があります。
- API 領域の縮小によりセキュリティーが向上する
- Cryostat エージェントが Cryostat 検出プラグインとして 2 つの役割を果たすことでデプロイメントの柔軟性が向上する
詳細は、Cryostat エージェントの使用 を参照してください。
- リモート Java Management Extensions (JMX) 接続
Java Management Extensions (JMX) 接続を許可するようにターゲットアプリケーションを設定できます。このタイプの設定では、検出に OpenShift サービスを使用し、接続に JMX を使用します。
JMX は、JVM 上で実行されるターゲットアプリケーションを監視および管理できる JVM の標準機能です。Cryostat が JMX を使用するには、JVM の起動時に JMX を有効にして設定する必要があります。これは、ターゲットアプリケーションによる JMX ポートの公開を Cryostat が必要とするためです。
Cryostat は、この JMX ポートを介してターゲットアプリケーションと通信して、JFR レコーディングを開始および停止し、ネットワーク経由で JFR データを取得することで、この JFR データを Cryostat で保存および分析できるようにします。リモート監視には、権限のない人がアプリケーションにアクセスできないようにするためのセキュリティーが必要です。Cryostat がアプリケーションの JFR レコーディングにアクセスする前に、Cryostat は認証情報の入力を求めるプロンプトを表示します。
詳細は、JMX 接続を使用するためのアプリケーションの設定 を参照してください。
- Cryostat エージェントと JMX のハイブリッド
Cryostat エージェントと JMX の両方を使用するハイブリッドアプローチを使用するようにターゲットアプリケーションを設定できます。このアプローチでは、Cryostat エージェントを使用してターゲットアプリケーションを検出し、JMX を使用して JFR データを Cryostat に公開するため、高い柔軟性が得られます。
たとえば、エージェントを使用すると、特定のポート番号に依存せずにアプリケーションを検出したり、JMX 接続を使用して JFR フライトレコーディングをオンデマンドで開始および停止したりできます。
Cryostat エージェントがアプリケーション上でも JMX が設定されていることを検出すると、エージェントはエージェント HTTP API 定義と JMX URL 定義の両方を使用して自身を Cryostat サーバーに公開します。この場合は、任意の設定オプションを使用できます。
詳細は、Cryostat エージェントと JMX 接続を使用するためのアプリケーションの設定 を参照してください。
3.1. Cryostat エージェントの使用 リンクのコピーリンクがクリップボードにコピーされました!
Cryostat エージェントは、JVM で実行されるアプリケーションのプラグインとして機能する Java インストルメンテーションエージェントとして実装されます。Cryostat エージェントは、検出プラグインとしてエージェントのロールが 2 つあるため、JMX ポートよりも柔軟にデプロイできる HTTP API を提供します。検出と Cryostat との接続の両方にエージェントの HTTP API を使用するようにターゲットアプリケーションを設定できます。
3.1.1. Cryostat エージェントの特徴 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat build of Cryostat は、Cryostat エージェントのさまざまなディストリビューションを提供し、エージェントのさまざまなデプロイおよび使用方法をサポートしています。次の情報を考慮して、ニーズに最適な Cryostat エージェントのデプロイタイプとユースケースを決定してください。
3.1.1.1. Cryostat エージェントの自動または手動設定 リンクのコピーリンクがクリップボードにコピーされました!
Cryostat Operator を使用して Cryostat エージェントを自動的に設定できます。または、必要に応じて、Cryostat エージェントを手動で設定することもできます。
エージェントの自動設定
Cryostat Operator を使用して Cryostat エージェントを自動的に設定できます。この機能を有効にするには、Pod がどの Cryostat インスタンスと連携するかを識別する cryostat.io/name および cryostat.io/namespace ラベルをアプリケーションデプロイメントに追加します。Cryostat Operator が、アプリケーションに cryostat.io/name および cryostat.io/namespace ラベルがあることを検出すると、Operator はエージェント JAR ファイルを含むボリュームをこのアプリケーションにマウントします。
この自動設定機能の一部として、Cryostat は、作成時に Pod を変更して Cryostat エージェントを注入する mutating admission webhook を使用します。また、webhook は、選択された Cryostat インスタンスに自動的に接続するようにエージェントを設定します。この場合、必要な cryostat.io/name および cryostat.io/namespace ラベルを含む Pod のみが webhook を呼び出すため、任意の Pod での Cryostat エージェントのセットアップが簡素化されます。さらに、Operator は、これらのラベルが Cryostat インスタンスのターゲット namespace のリスト内のアプリケーションデプロイメントで指定されている場合にのみ動作します。それ以外の場合は、セキュリティー上の理由から、Operator はアプリケーションがこの Cryostat インスタンスと通信するように設定しません。
webhook は、Cryostat エージェントのコンテナーベースのディストリビューション (cryostat-agent-init) を使用して、選択した Pod へのエージェントの自動設定と注入を行います。webhook が cryostat-agent-init コンテナーイメージを使用するため、ユーザーは Red Hat Maven リポジトリーからエージェント JAR ファイルをダウンロードする必要がなくなります。
Cryostat Operator がエージェントを自動的に設定できるようにする方法の詳細は、Cryostat Operator によるエージェントの自動設定の有効化 を参照してください。
エージェントの手動設定
自動設定機能の代わりに、必要に応じて Cryostat エージェントを手動で設定することを選択できます。ただし、手動での設定では、Cryostat Operator による自動設定に比べて時間のオーバーヘッドが大きくなり、誤った設定が発生する可能性があります。Cryostat 4.0 より前は、Cryostat エージェントを設定する唯一の方法は手動での設定方法でした。
Red Hat build of Cryostat は、エージェントを手動で設定するために、Cryostat エージェントの JAR ファイルを 2 種類配布しています。
自己完結型で、エージェントコードとそのすべての依存関係が含まれるオールインワンの "shaded" JAR ファイル
この "shaded" JAR ファイルは、追加のエージェント JAR ファイルを 1 つだけ含める必要があるため、既存のアプリケーションに組み込むのに最も便利な形式の Cryostat エージェントを提供します。これは、同様のエージェントやツールの一般的な配布パターンです。Cryostat 2.4 より前は、Cryostat エージェントのディストリビューションで唯一利用できるのが “shaded” JAR ファイルがでした。“shaded” JAR ファイル名の形式は
cryostat-agent-0.5.X.redhat-xxxxx-shaded.jarです。ここで、0.5.Xとxxxxxは、それぞれエージェントのバージョンとビルド番号を表します。依存関係のないエージェントコードを含む標準 JAR ファイル
このタイプの JAR ファイルは、エージェントとワークロードアプリケーションの間に依存関係の競合が存在することがわかっている場合に役立ちます。独自のストラテジーを適用して、エージェントとアプリケーションの両方の要件を満たすように、各依存関係の正しいバージョンを提供する場合は、スタンドアロン JAR ファイルを使用できます。標準の JAR ファイル名の形式は
cryostat-agent-0.5.X.redhat-xxxxx.jarです。ここで、0.5.Xおよびxxxxxは、それぞれエージェントのバージョンとビルド番号を表します。
Cryostat エージェントを手動で設定する場合は、オールインワンの “shaded” JAR ファイルを使用してエージェントをデプロイすることを推奨します。手動で設定されたエージェントとワークロードアプリケーション間の依存関係の競合を解決するために独自のストラテジーを適用する意図がない限り、標準の JAR ファイルは使用しないでください。
これらのエージェント JAR ファイルは、Red Hat Maven リポジトリー からダウンロードできます。
3.1.1.2. JVM への静的または動的な割り当て リンクのコピーリンクがクリップボードにコピーされました!
Cryostat エージェントは、要件に応じて、静的または動的な方法を使用して JVM に割り当てることができます。
JVM への静的割り当て
静的割り当てとは、ワークロードアプリケーションの JVM が JVM の起動時に Cryostat エージェントをロードして初期化することを意味します。
Cryostat Operator がエージェントを自動的に設定するか、エージェントを手動で設定するかに関係なく、JVM への静的割り当てがサポートされます。Cryostat Operator でエージェントを自動的に設定する場合、エージェントを JVM に接続するための唯一のサポートされる方法は静的接続による方法です。
Cryostat Operator を使用してエージェントを自動的に設定する場合、Operator がすべての設定タスクを処理し、OpenShift Container Platform はアプリケーションを自動的に再デプロイします。
詳細は、Cryostat エージェントを使用するためのアプリケーションの設定 を参照してください。
JVM への動的割り当て
動的割り当てとは、Cryostat エージェントが、アプリケーションを再起動することなく、すでに実行中のアプリケーション JVM に動的に割り当てできることを意味します。
JVM への動的な接続では、エージェントを手動で設定する必要があります。動的接続アプローチは、Cryostat Operator によって自動的に設定されるエージェントではサポートされません。
この動的割り当て機能には、以下の要件があります。
-
エージェントの JAR ファイルが JVM のファイルシステムにコピーされていることを確認する必要があります (たとえば、
oc cpコマンドを使用します)。 -
エージェントを同じホスト上または同じアプリケーション内で別のプロセスとして実行できる必要があります (たとえば、
oc execコマンドを使用する)。
動的割り当て機能は、JVM が起動するたびにエージェントを割り当てる必要がない、アドホックな 1 回限りのプロファイリングまたはトラブルシューティングワークフローをサポートします。動的割り当ては、エージェントを割り当てる目的でアプリケーションの再設定を行うことができない場合や再設定しない場合に適しています。エージェントはアプリケーションを再起動せずに実行中の JVM に割り当てることができるため、アプリケーションのダウンタイムも発生しません。
詳細は、JVM への動的割り当てのスタンドアロンプロセスとして Cryostat エージェントを起動する を参照してください。
3.1.1.3. エージェント JAR ファイルをワークロードアプリケーションに含めるためのオプション リンクのコピーリンクがクリップボードにコピーされました!
エージェント JAR ファイルをワークロードアプリケーションに含めるオプションは、エージェントの自動設定を使用するか手動設定を使用するか、および JVM への割り当てを静的にするか動的にするかによって異なります。
エージェントの自動設定の場合
Cryostat Operator でエージェントを自動的に設定する場合、Operator は
cryostat-agent-initコンテナーを使用して、エージェント JAR ファイルを含むボリュームを関連するアプリケーションにマウントします。この場合、アプリケーションデプロイメントに、Pod が連携する Cryostat インスタンスを識別するためのcryostat.io/nameラベルとcryostat.io/namespaceラベルを含める必要があります。JVM への動的割り当てによるエージェントの手動設定の場合
実行中の JVM への動的な 1 回限りの割り当ての場合は、
oc cpコマンドを使用してエージェントの JAR ファイルを JVM のファイルシステムにコピーできます。
3.1.1.4. エージェント設定プロパティー リンクのコピーリンクがクリップボードにコピーされました!
エージェントを手動で設定することを選択した場合は、次の 2 つの方法のいずれかで Cryostat エージェントの設定プロパティーを指定できます。
-
アプリケーションで JVM システムプロパティーフラグを使用します (例:
-Dcryostat.agent.api.writes-enabled=true)。 -
すべての文字を大文字にし、句読点をアンダースコアに置き換えて環境変数を使用します (例:
CRYOSTAT_AGENT_API_WRITES_ENABLED=true)。
Cryostat Operator を使用してエージェントを自動的に設定する場合、Operator は関連するプロパティーを設定します。
必須のエージェントプロパティー
エージェントを手動で設定する場合は、Cryostat エージェントが正常に動作するように次のプロパティーを設定する必要があります。
|
|
これは、Cryostat エージェントが自身をアドバタイズする Cryostat サーバーバックエンド (つまり、内部 OpenShift サービスオブジェクト) の URL の場所 ( |
|
|
これは、Cryostat エージェントインスタンスまたはアプリケーション自体の URL の場所を指定します。Cryostat は、この URL を使用してヘルスチェックを実行し、エージェントにデータを要求します。OpenShift/Kubernetes Downward API を使用して、このプロパティーを |
|
|
これは、Cryostat エージェントが Cryostat サーバーへの API リクエストに含めることができるヘッダー値を指定します (例: 注記
このプロパティーは、 |
|
|
これは、 注記
有効な認可タイプは次のとおりです。
このプロパティーはデフォルトで |
|
|
これは、 注記
次のガイドラインを考慮してください。
デフォルトでは、このプロパティーは |
任意のエージェントプロパティー
セットアップ要件に応じて、エージェントを手動で設定する場合は、次のエージェントプロパティーも設定できます。
|
|
これは、Cryostat エージェントが書き込み操作を許可するかどうかを示します。デフォルトで 注記
このプロパティーが |
|
| これは、エージェントが HTTP API をバインドするために使用する HTTP ポート番号を指定します (デフォルトでは 9977)。これがアプリケーションまたは別のツールエージェントが使用する既存のポートと競合する場合は、別のポート番号を指定する必要があります。 |
|
|
これは、この Cryostat エージェントインスタンスがどのアプリケーションに割り当てられているかを識別するためのラベルを指定します (デフォルトでは、 |
上記のリストでは、Cryostat エージェントで使用可能な設定プロパティーの一部だけを説明しています。エージェントプロパティーの完全なリストは、Agent Properties を参照してください。
3.1.2. Cryostat エージェントを使用するためのアプリケーションの設定 リンクのコピーリンクがクリップボードにコピーされました!
Java Instrumentation Agent として実装された Cryostat エージェントを使用するようにターゲットアプリケーションを設定すると、Cryostat はこれらのアプリケーションを検出してデータを収集し、このデータを分析のために Cryostat に送信できます。
Cryostat エージェントは、次の設定ユースケースをサポートします。
3.1.2.1. Cryostat Operator によるエージェントの自動設定の有効化 リンクのコピーリンクがクリップボードにコピーされました!
Cryostat Operator がエージェントを自動的に設定できるようにするには、アプリケーションデプロイメントに特定のラベルを追加する必要があります。
手順
アプリケーションデプロイメントで、
cryostat.io/nameおよびcryostat.io/namespaceラベルを追加します。例
apiVersion: apps/v1 kind: Deployment ... spec: ... template: metadata: labels: ... cryostat.io/namespace: <namespace> cryostat.io/name: <namespace>上記の例で、
<namespace>は Cryostat インスタンスのインストール namespace に置き換え、<name>は Cryostat CR の名前に置き換えます。デフォルトでは、エージェントのコールバックサーバーはコンテナーポート 9977 にバインドされます。Cryostat エージェントのコールバックサーバーに別のポート番号を指定する場合は、アプリケーションデプロイメントに
cryostat.io/callback-portラベルを追加します。例
apiVersion: apps/v1 kind: Deployment ... spec: ... template: metadata: labels: ... cryostat.io/namespace: <namespace> cryostat.io/name: <namespace> cryostat.io/callback-port: <port>上記の例で、
<port>はエージェントのコールバックサーバーをバインドするポート番号に置き換えます。エージェントを注入するコンテナーを指定する場合は、アプリケーションデプロイメントに
cryostat.io/containerラベルを追加します。例
apiVersion: apps/v1 kind: Deployment ... spec: ... template: metadata: labels: ... cryostat.io/namespace: <namespace> cryostat.io/name: <namespace> cryostat.io/callback-port: <port> cryostat.io/container: <container>上記の例で、
<container>は関連するコンテナーの名前に置き換えます。注記同じ Pod 内で複数のコンテナーが実行されている場合、エージェント注入用に選択できるコンテナーは 1 つだけです。マルチコンテナー Pod では、エージェントを注入する Java コンテナーが 1 つしかない場合にこの機能が役立ちます。このラベルを含めない場合、ミューテーション webhook はデフォルトでエージェントを最初のコンテナーイメージに注入します。
注入されたエージェントに Pod への読み取り専用アクセス権を与える場合は、アプリケーションデプロイメントで
cryostat.io/read-onlyラベルをtrueに設定します。例
apiVersion: apps/v1 kind: Deployment ... spec: ... template: metadata: labels: ... cryostat.io/namespace: <namespace> cryostat.io/name: <namespace> cryostat.io/callback-port: <port> cryostat.io/container: <container> cryostat.io/read-only: true注記この機能により、注入されたエージェントのセキュリティーをより詳細に制御できるようになります。
デフォルトでは、Cryostat エージェントのロギングは無効になっています。エージェントのロギングを有効にする場合は、アプリケーションのデプロイメントに
cryostat.io/log-levelラベルを追加します。有効な値は、
trace、debug、info、warn、error、offです。デフォルト値はoffです。例
apiVersion: apps/v1 kind: Deployment ... spec: ... template: metadata: labels: ... cryostat.io/namespace: <namespace> cryostat.io/name: <namespace> cryostat.io/callback-port: <port> cryostat.io/container: <container> cryostat.io/read-only: true cryostat.io/log-level: debug注記この機能により、エージェントのロギングに使用する適切なレベルをより細かく制御できるようになります。これは、エージェント設定のトラブルシューティングやデバッグに役立ちます。
エージェントロギングを有効にすると、これらのエージェントログがホストアプリケーションのログメッセージと混同される可能性があります。設定したロギングレベルによっては、エージェントログによって、警告またはエラーレベルのメッセージをチェックする他のアラートシステムがトリガーされる可能性があります。
Cryostat Operator が、アプリケーションデプロイメントに cryostat.io/name および cryostat.io/namespace ラベルがあることを検出すると、Operator は cryostat-agent-init を使用して、エージェント JAR ファイルを含むボリュームをこのアプリケーションにマウントします。この場合、Operator は、Cryostat インスタンスのターゲット namespace のリスト内のアプリケーションデプロイメントでこれらのラベルが指定されている場合にのみ動作します。それ以外の場合は、セキュリティー上の理由から、Operator はアプリケーションがこの Cryostat インスタンスと通信するように設定しません。
3.1.2.2. JVM への動的割り当てのスタンドアロンプロセスとして Cryostat エージェントを起動する リンクのコピーリンクがクリップボードにコピーされました!
Cryostat エージェントをすでに実行中のアプリケーション JVM に動的に割り当てる場合は、エージェントをスタンドアロン Java プロセスとして起動できます。
この手順は、Cryostat エージェントが実行中の JVM にアドホックに 1 回だけ割り当てできるようにする動的割り当て機能を使用する場合のみが対象です。ワークロードアプリケーションの JVM が JVM の起動時に Cryostat エージェントをロードして初期化するようにする場合は、エージェントの自動設定の有効化 を参照してください。
前提条件
oc cpコマンドを使用して、エージェントの JAR ファイルを JVM のファイルシステムにコピーしてある。注記最新の “shaded” JAR ファイルは、Red Hat Maven リポジトリー からダウンロードできます。“shaded” JAR ファイル名の形式は
cryostat-agent-0.5.X.redhat-xxxxx-shaded.jarです。ここで、0.5.Xとxxxxxは、それぞれエージェントのバージョンとビルド番号を表します。
手順
以下のコマンドを入力します。
$ java -jar target/<agent_jar_file> <pid>上記のコマンドの <agent_jar_file> は、エージェントの JAR ファイル名に置き換えます。<pid> は、エージェントを割り当てる JVM のプロセス ID (PID) に置き換えます。
以下に例を示します。
$ java -jar target/cryostat-agent-0.5.0.redhat-00001-shaded.jar 1234注記上記の例は説明のみを目的としており、“shaded” JAR ファイルの最新バージョンとビルドを反映していない可能性があります。
上記のコマンドを実行すると、エージェントプロセスは Attach プロバイダーを使用して、指定された PID を検索します。指定された PID が見つかった場合、エージェントプロセスはこの PID に割り当てられ、エージェントの JAR ファイルをこの JVM にロードしようとします。その後、この JVM が通常のエージェント起動プロセスにブートストラップします。
PID 値に基づくエージェントの起動動作
PID の値に応じて、エージェント起動動作に関する次のガイドラインを考慮してください。
- 無効な PID を指定すると、エージェントは正常に起動できません。
-
PID 値としてワイルドカードのアスタリスク (
*) を指定すると、エージェントの JAR ファイルは、検出されたすべての JVM へのブートストラップを試みます。 -
PID 値として
0を指定するか、PID 値を指定しない場合は、エージェントは候補となる JVM が 1 つだけ使用可能かどうかを確認します。使用可能な JVM が 1 つだけの場合、エージェントはこの JVM へのブートストラップを試みます。JVM が複数ある場合または JVM が使用できない場合、エージェントは正常に起動できません。
遅延バインディング設定オプション
Cryostat エージェントをスタンドアロンプロセスとして起動する場合、コマンドラインオプションを使用して、エージェントランチャーに追加の遅延バインディング設定オプションを指定することもできます。
以下に例を示します。
$ java -jar target/cryostat-agent-0.5.0.redhat-00001-shaded.jar \
-Dcryostat.agent.baseuri=<cryostat_server_url> \
-Dcryostat.agent.callback=<cryostat_agent_url> \
-Dcryostat.agent.authorization=Bearer <authorization_value> \
--smartTrigger=[ProcessCpuLoad>0.2]~profile \
@/deployment/app/moreAgentArgs \
1234
使用可能なオプションとその動作の詳細を参照するには、java -jar target/<filename>.jar -h ヘルプコマンドを実行してください。<filename> は、コピーした “shaded” エージェント JAR ファイルの名前を表します。
Cryostat エージェントをスタンドアロンプロセスとして起動する場合は、前の例のように、-jar <path_to_jarfile> 引数の 後 に、遅延バインディング設定オプションの -D フラグを指定してください。ここでは -D フラグの位置が重要です。
-
-jar <path_to_jarfile>引数の前にシステムプロパティーの-Dフラグを指定すると、そのプロパティーがスタンドアロンランチャー JVM プロセスに設定されます。これにより、エージェントをスタンドアロンプロセスとして起動する場合に予期しない問題が発生する可能性があります。 -
-jar <path_to_jarfile>引数の後にシステムプロパティーの-Dフラグを指定すると、そのプロパティーがエージェントランチャーに引数として渡されます。ランチャーがエージェントをホスト JVM にブートストラップすると、エージェントが起動時にそのプロパティーを JVM に適用します。
前の例のように、cryostat.agent.baseuri、cryostat.agent.callback、cryostat.agent.authorization などの必要なエージェントプロパティーが、エージェントランチャーの設定オプションとして指定されたことを確認してください。設定プロパティーの詳細は、エージェント設定プロパティー を参照してください。