第2章 GraphQL API
GraphQL API エンドポイントである /api/v2.2/graphql
は、ターゲット JVM に対してより短くて単純なクエリーを自動的に実行します。これらのクエリーは、ターゲット JVM のアクティブおよびアーカイブされたレコーディングに対して実行することができます。さらに、API は一般的な Cryostat アーカイブに対してクエリーを実行できます。クエリーをカスタマイズして、アクティブまたはアーカイブされたレコーディングの以下のタスクを自動化できます。
クエリーをカスタマイズして、アクティブまたはアーカイブされたレコーディングの以下のタスクを自動化できます。
- アーカイブ
- 削除
- 起動
- 停止
カスタムクエリーを作成する場合、クエリーに GraphQL API エンドポイントの具体的な情報を指定する必要があります。続いて、POST
リクエストで情報を処理し、その情報を Cryostat に送信することができます。次の例では、Graph QL API の情報を指定します。
POST /api/beta/graphql HTTP/1.1
Accept: application/json, /;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 171
Content-Type: application/json
Host: localhost:8181
User-Agent: HTTPie/3.1.0
GraphQL API は、ワークロード機能が制限されている HTTP REST API よりも強力です。たとえば、HTTP REST API では、OpenShift 上のコンテナー内にあるスケーリングされた各レプリカで開始するレコーディングのコピーごとに、API リクエストを作成する必要があります。GraphQL API は、1 つの API 要求でこのタスクを実現できます。これにより、API のパフォーマンスが向上し、Cryostat インスタンスのネットワークトラフィックを削減できます。
HTTP REST API のもうひとつの制限されたワークロード機能として、この API は、応答データに対して反復的なアクションを実行する際に API JSON 応答を解析するカスタムクライアントを書く必要があるなど、ユーザーの介入をより必要とすることが挙げられます。GraphQL API では、この操作を完了する必要はありません。
関連情報
GraphQL の概要 (GraphQL) を参照してください。
2.1. GraphQL API を使用したカスタムクエリーの作成
HTTPie
などの HTTP クライアントを使用して GraphQL API と対話し、カスタムクエリーを生成することができます。
API を使ってクエリーを作成する場合、データ型やフィールドに特定の値を指定し、関数がこれらの値を使用して必要なデータを正確に検索できるようにする必要があります。
1 つのクエリーで複数の操作を実行するワークフローを自動化できるユースケースを考えてみましょう。たとえば、HTTPie
クライアントからのリクエストで Cryostat にクエリーを送り、Cryostat が以下のタスクを実行できるようにすることができます。
- ターゲットとなるすべての JVM アプリケーションのスナップショット記録を取ることができます。
- 各アプリケーションの記録情報を Cryostat アーカイブにコピーします。
- 検出されたターゲット JVM アプリケーションの連続監視記録を自動的に開始する自動化ルールを作成します。
クエリーにはさまざまな可能性があるので、クエリーのデータ型やフィールドの値を正確に決定してください。そうしないと、要件に合わないクエリー結果を取得する可能性があります。
以下の例は、HTTP クライアントを使用して GraphQL API と対話し、Cryostat データに対して単純なクエリーと複雑なクエリーを生成する方法を示しています。
Cryostat インスタンスと対話するすべての既知のターゲット JVM を決定するための単純なクエリーの例
$ https :8181/api/v1/targets HTTP/1.1 200 OK content-encoding: gzip content-length: 223 content-type: application/json { targetNodes { name nodeType labels target { alias serviceUri } } }
前の例では、targetNodes
要素に name
などの特定の値を設定しています。クエリーを実行すると、クエリーは、指定された基準に一致するターゲット JVM のリストを返します。
特定の Pod に属する Cryostat インスタンスに表示されるすべてのターゲットアプリケーションを特定するための複雑なクエリーの例
$ https -v :8181/api/v2.2/graphql query=@graphql/target-nodes-query.graphql
POST /api/v2.2/graphql HTTP/1.1
Accept: application/json, /;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 171
Content-Type: application/json
Host: localhost:8181
User-Agent: HTTPie/2.6.0
{
environmentNodes(filter: { name: "<application_pod_name>" }) {
descendantTargets {
doStartRecording(recording: {
name: "myrecording",
template: "Profiling",
templateType: "TARGET",
duration: 30
}) {
name
state
}
}
}
}
前の例では、environmentNodes
要素に以下の特定の値を設定しており、この例では JVM ターゲットアプリケーションは返されません。
-
<application_pod_name>
: クエリーが、Cryostat と同じ namespace で動作する特定の Pod をターゲットにしていることを確認します。 -
descendantTargets
: JVM ターゲットオブジェクトの配列を提供します。 -
doStartRecording
: GraphQL API は、クエリーがリストする各ターゲット JVM に対して JFR 記録を開始します。
クエリーを実行すると、クエリーは、アクティブなアプリケーションノードのリストなど、開始した JFR 記録に関する情報を返します。
Red Hat OpenShift の場合、このクエリーは Deployment
と DeploymentConfig
の API オブジェクト、および Cryostat と対話する Pod を返します。
この複雑なクエリーは、GraphQL API が、Cryostat および Red Hat OpenShift と対話する任意の JVM オブジェクトを返す単一の API リクエストを実行する方法を示しています。続いて、API リクエストは、それらの返されたオブジェクトの JFR 記録を開始します。