第3章 Java アプリケーションの設定
Cryostat が Java 仮想マシン (JVM) 上で実行されるターゲットアプリケーションに関する Java Flight Recorder (JFR) データを収集、保存、分析できるようにするには、Cryostat がアプリケーションを検出して接続できるようにアプリケーションを設定する必要があります。
アプリケーションは次のいずれかの方法で設定できます。
- Cryostat エージェントコンポーネントを検出と接続性に使用します。これは Java インストルメンテーションエージェントとして実装され、JVM 上で実行されるアプリケーションのプラグインとして機能します。
- Java Management Extensions (JMX) 接続を許可するようにアプリケーションを設定し、検出には OpenShift Service を、接続性には JMX を使用します。
- 検出には Cryostat エージェントを使用し、接続性には JMX を使用します。
Cryostat エージェント
Red Hat build of Cryostat 2.4 以降では、Cryostat エージェントは、Cryostat サーバーがアプリケーションの JMX ポートの代わりに使用できる HTTP API を提供します。適切に設定された Cryostat エージェントをデプロイするワークロードアプリケーションに接続すると、ターゲットアプリケーションが JMX ポートを公開する必要がなく、Cryostat 機能セットをすべて使用できます。
Red Hat build of Cryostat 2.4 の前は、Cryostat エージェントは、限られた JFR 操作のみをサポートする読み取り専用 HTTP API を提供していました。
Cryostat エージェントの HTTP API は、JMX ポートと比較して次の利点があります。
- API 領域の縮小によるセキュリティーの向上
- Cryostat エージェントが Cryostat 検出プラグインとして 2 つの役割をはたすことでデプロイメントの柔軟性を向上
Cryostat エージェントがアプリケーション上でも JMX が設定されていることを検出すると、エージェントはエージェント HTTP API 定義と JMX URL 定義の両方を使用して自身を Cryostat サーバーに公開します。この場合は、任意の設定オプションを使用できます。
ワークロードのアプリケーションで Cryostat エージェントを使用するには、Cryostat エージェントの JAR ファイル (例: -javaagent:/deployment/app/lib/cryostat-agent.jar) へのパスを使用して -javaagent JVM フラグを渡すようにアプリケーションを設定する必要があります。この設定により、ワークロードアプリケーションの JVM が起動時に Cryostat エージェントを読み込み、初期化できるようになります。Cryostat エージェントの基本的な初期化が完了すると、ワークロードアプリケーションの通常の起動プロセスが通常どおり開始されます。
エージェントの JAR ファイルをワークロードアプリケーションに含めるためのオプション
Cryostat エージェントの JAR ファイルは、さまざまな方法でワークロードアプリケーションに含めることができます。
-
最も簡単な方法は、JAR ファイルを
pom.xmlまたはbuild.gradleファイルのアプリケーションの依存関係に追加することです。ビルドツール (Maven または Gradle) は、アプリケーションのビルド出力に含めるための JAR ファイルをダウンロードします。 -
maven-dependency-pluginなどの Maven プラグインを使用して、アプリケーションのビルド出力に JAR ファイルのダウンロードおよび組み込みをより詳細に制御できます。 -
JAR ファイルを含めた PersistentVolume ストレージボリュームを作成できます。次に、アプリケーションの
Deployment/DeploymentConfigを再設定して PersistentVolume をマウントし、-javaagent:/path/to/persistentvolume/cryostat-agent.jarを使用します。このタスクを実行する方法は、OpenShift クラスターで有効になっている PersistentVolume プロバイダーのタイプによって異なります。
Cryostat エージェントがアプリケーションコンテナーに正常に追加されてロードされると、アプリケーションの stdout および コンソール ログが Cryostat エージェントからのログメッセージを表示し始めます。
エージェント設定プロパティー
Cryostat エージェントの設定プロパティーは、次の 2 つの方法のいずれかで指定できます。
-
アプリケーションで JVM システムプロパティーフラグを使用します (例:
-Dcryostat.agent.api.writes-enabled=true)。 -
すべての文字を大文字にし、句読点をアンダースコアに置き換えて環境変数を使用します (例:
CRYOSTAT_AGENT_API_WRITES_ENABLED=true)。
Cryostat エージェントが正常に動作できるようにするには、次のプロパティーを設定する必要があります。
|
|
これは、Cryostat エージェントが自身をアドバタイズする Cryostat サーバーバックエンド (つまり、内部 OpenShift サービスオブジェクト) の URL の場所 ( |
|
|
これは、Cryostat エージェントインスタンスまたはアプリケーション自体の URL の場所を指定します。Cryostat は、この URL を使用してヘルスチェックを実行し、エージェントにデータを要求します。OpenShift/Kubernetes Downward API を使用して、これを動的に判別できます。詳細は、 |
設定要件に応じて、次のエージェントプロパティーを設定することもできます。
|
|
これは、Cryostat エージェントが書き込み操作を許可するかどうかを示します。デフォルトで 注記
このプロパティーが |
|
| これは、エージェントが HTTP API をバインドするために使用する HTTP ポート番号を指定します (デフォルトでは 9977)。これがアプリケーションまたは別のツールエージェントが使用する既存のポートと競合する場合は、別のポート番号を指定する必要があります。 |
|
|
これは、この Cryostat エージェントインスタンスがどのアプリケーションにアタッチされているかを識別するためのラベルを指定します (デフォルトでは、 |
リモート Java Management Extensions (JMX) 接続
JMX は、JVM 上で実行されるターゲットアプリケーションを監視および管理できる JVM の標準機能です。Cryostat が JMX を使用するには、JVM の起動時に JMX を有効にして設定する必要があります。これは、ターゲットアプリケーションによる JMX ポートの公開を Cryostat が必要とするためです。
Cryostat は、この JMX ポートを介してターゲットアプリケーションと通信して、JFR レコーディングを開始および停止し、ネットワーク経由で JFR データを取得することで、この JFR データを Cryostat で保存および分析できるようにします。リモートモニタリングには、承認されていないユーザーがアプリケーションにアクセスできないようにセキュリティーが必要です。Cryostat がアプリケーションの JFR レコーディングにアクセスする前に、Cryostat は認証情報の入力を求めるプロンプトを表示します。
Cryostat エージェントと JMX のハイブリッド
Cryostat エージェントと JMX の両方を使用するハイブリッドアプローチを使用するようにターゲットアプリケーションを設定できます。このアプローチでは、Cryostat エージェントを使用してターゲットアプリケーションを検出し、JMX を使用して JFR データを Cryostat に公開するため、高い柔軟性が得られます。
たとえば、エージェントを使用すると、特定のポート番号に依存せずにアプリケーションを検出したり、JMX 接続を使用して JFR フライトレコーディングをオンデマンドで開始および停止したりできます。
3.1. Cryostat エージェントを使用したアプリケーションの設定 リンクのコピーリンクがクリップボードにコピーされました!
Java インストルメンテーションエージェントとして実装した Cryostat エージェントを使用すると、Cryostat がアプリケーションを検出し、データを収集し、分析のためにデータを Cryostat に送信できるようにターゲットアプリケーションを設定できます。オプションで、Cryostat エージェントが Cryostat サーバーからの JFR レコーディングの開始、停止、削除リクエストを受け入れることもできます。
Red Hat build of Cryostat 2.4 は、Cryostat エージェントの JAR ファイルに 2 つの異なるバリエーションを配布しています。設定要件に応じて、次のタイプのエージェント JAR ファイルのいずれかを使用できます。
自己完結型で、エージェントコードとそのすべての依存関係が含まれるオールインワンの "shaded" JAR ファイル
この "shaded" JAR ファイルは、追加のエージェント JAR ファイルを 1 つだけ含める必要があるため、既存のアプリケーションに組み込むのに最も便利な形式の Cryostat エージェントを提供します。これは、同様のエージェントやツールの一般的な配布パターンです。
依存関係のないエージェントコードを含む標準 JAR ファイル
このタイプの JAR ファイルは、エージェントとワークロードアプリケーションの間に依存関係の競合が存在することがわかっている場合に役立ちます。独自のストラテジーを適用して、エージェントとアプリケーションの両方の要件を満たすように、各依存関係の正しいバージョンを提供する場合は、スタンドアロン JAR ファイルを使用できます。
以前のリリースでは、オールインワンの "shaded" JAR ファイルである Cryostat エージェントの 1 つのディストリビューションが提供されていました。次の手順では、Cryostat 2.4 エージェントの "shaded" JAR ファイルディストリビューションをインストールする方法について説明します。
Java アプリケーションの設定: Cryostat エージェント で説明されているように、Cryostat 2.4 エージェントは、エージェントの JAR ファイルをワークロードアプリケーションに含めるためのさまざまなオプションをサポートしています。以下の手順では、"shaded" JAR ファイルを pom.xml または build.gradle ファイルのアプリケーションの依存関係に追加する方法を説明します。
前提条件
- Cryostat Web コンソールにログインしている。
- JDK バージョン 11 以降がインストールされている。
手順
Cryostat エージェントをインストールします。アプリケーションのビルドに応じて、次のオプションのいずれかを選択します。
Maven の使用:
アプリケーションの
pom.xmlファイルを Cryostat エージェントの JAR ファイルの情報で更新します。pom.xml の例
<project> ... <repositories> <repository> <id>redhat-maven-repository</id> <url>https://maven.repository.redhat.com/earlyaccess/all/</url> </repository> </repositories> ... <build> <plugins> <plugin> <artifactId>maven-dependency-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <phase>prepare-package</phase> <goals> <goal>copy</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>io.cryostat</groupId> <artifactId>cryostat-agent</artifactId> <version>0.3.0.redhat-00001</version> <classifier>shaded</classifier> </artifactItem> </artifactItems> <stripVersion>true</stripVersion> </configuration> </execution> </executions> </plugin> </plugins> ... </build> ... </project>次回アプリケーションをビルドするときに、Cryostat エージェント JAR ファイルが
target/dependency/cryostat-agent-shaded.jarで利用可能になります。Gradle の使用:
build.gradleファイルを更新します。build.gradleファイルの例repositories { … maven { url "https://maven.repository.redhat.com/earlyaccess/all/" credentials { username "myusername" password "mytoken" } } }エージェント JAR ファイルをアプリケーションにパッケージ化する方法は、ビルドに使用する Gradle プラグインによって異なります。たとえば、Jib プラグインを使用している場合は、次のように
build.gradleファイルを更新します。build.gradleファイルの例plugins { id 'java' id 'application' id 'com.google.cloud.tools.jib' version '3.3.1' id 'com.ryandens.javaagent-jib' version '0.5.0' } … dependencies { … javaagent 'io.cryostat:cryostat-agent:0.3.0.redhat-00001:shaded'
Docker ファイルを更新します。次の例では、
JAVA_OPTS環境変数を使用して、関連する JVM 情報を渡します。例
... COPY target/dependency/cryostat-agent.jar /deployments/app/ ... ENV JAVA_OPTS="-javaagent:/deployments/app/cryostat-agent-shaded.jar"アプリケーション固有のコンテナーイメージを再構築します。
docker build -t docker.io/myorg/myapp:latest -f src/main/docker/DockerfileCryostat エージェントの設定に必要な JVM システムプロパティーまたは環境変数を指定するには、更新されたイメージをプッシュし、アプリケーションのデプロイメントを変更します。
例
apiVersion: apps/v1 kind: Deployment ... spec: ... template: ... spec: containers: - name: sample-app image: docker.io/myorg/myapp:latest env: - name: CRYOSTAT_AGENT_APP_NAME value: "myapp" # Replace this with the Kubernetes DNS record # for the Cryostat Service - name: CRYOSTAT_AGENT_BASEURI value: "http://cryostat.mynamespace.mycluster.svc:8181" - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP - name: CRYOSTAT_AGENT_CALLBACK value: "http://$(POD_IP):9977"1 # Replace "abcd1234" with a base64-encoded authentication token - name: CRYOSTAT_AGENT_AUTHORIZATION2 value: "Bearer abcd1234" - name: CRYOSTAT_AGENT_API_WRITES_ENABLED3 value: true ports: - containerPort: 9977 protocol: TCP resources: {} restartPolicy: Always status: {}-
<1>: ポート番号
9977は、Cryostat のリクエストを処理する内部 Web サーバーに対してエージェントが公開するデフォルトの HTTP ポートです。エージェントがインストールされているターゲットアプリケーションとこのポート番号が競合する場合は、番号を変更できます。 -
<2>:
CRYOSTAT_AGENT_AUTHORIZATION値は、エージェントが自身の存在をアドバタイズするために、または JFR データをプッシュするために Cryostat への API リクエストに含める認証情報を示します。また、この目的で KubernetesService Accountを作成し、abcd1234を、サービスアカウントに関連付けられている Base64 エンコードされた認証トークンに置き換えることもできます。 -
<3>:
CRYOSTAT_AGENT_API_WRITES_ENABLED変数はデフォルトでfalseに設定されます。Cryostat エージェントが Cryostat サーバーからの JFR フライト記録の開始、停止、または削除のリクエストを受け入れるようにするには、この変数をtrueに設定する必要があります。
-
<1>: ポート番号