Cryostat 2.1の新ダウンロードAPIでJFRデータに高速にアクセス

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

この記事は、Red Hat Developerのブログ記事、Access JFR data faster with Cryostat 2.1's new download APIs | 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は、Kubernetes上でJDK Flight Recorderのデータを管理するためのツールです。この記事では、JSON Web Token (JWT) に基づく新しいダウンロード API が、Cryostat 2.1 Web クライアントにおいて、より応答性が高く効率的なダウンロードの流れを促進するのに役立つことを説明します。

Cryostat Webクライアントのダウンロードの流れ

以前は、Web クライアントの記録、レポート、テンプレートなどのリソースのダウンロードの流れは、アプリケーションがバックエンドに適切な認証ヘッダー付きの HTTP GET 要求を行い、返されたファイルをブラウザのメモリにダウンロードし、その blob に対してローカルオブジェクト URL を作成し、その URL をアンカー要素(<a>タグ)に割り当ててユーザの応答を促すというものでした。ファイルサイズによってダウンロード速度が決まり、「ファイルを保存する」プロンプトが表示されるタイミングも決まりました。このプロセスが完了すると、ファイルがすでにユーザーのマシンに転送されているにもかかわらず、ユーザーはファイルをディスクに保存するか、ダウンロードをキャンセルするかを尋ねられます。

Cryostat 2.1では、ほとんどのブラウザで利用可能なHTML 5の download 属性を使用することにより、ダウンロードの流れを改良しています。具体的には、アンカー要素を作成し、href属性にバックエンドが提供するリソースのURLを設定し、download属性にファイル名を設定します。アンカーをクリックすると、"Save File" というプロンプトが表示されます (図 1 参照)。

https://developers.redhat.com/sites/default/files/styles/article_floated/public/image1_4.png?itok=pDkMuTKz

図1:「Save File」プロンプトで、記録ファイルをディスクに保存するかどうかを決定可能

ユーザが「ファイルを保存」をクリックすると、ファイルは直接ディスクにダウンロードされます。ユーザが「キャンセル」をクリックすると、ファイルはダウンロードされません。また、ブラウザのメモリに何もダウンロードされないため、「ファイルを保存」ダイアログの表示時間がファイルサイズに依存しなくなるというメリットもあります。

しかし、href属性の制限として、リソースを取得するための権限なしにURLと一緒にヘッダを提供することは不可能です。そこでJSONウェブトークンの出番です。

JSON Web Tokenによるダウンロードの流れ改善方法

JWTは、サーバリクエストを送信するユーザが、セッション内で以前に認証された(すなわち、ログインした)同じユーザであり、要求されたリソースへのアクセス権も持っていることを保証する認証情報です。JWTは、認証メタデータを含むJSONデータ本体で構成されています。

Cryostat 2.1では、JWTダウンロードを容易にするために新しいAPIハンドラが実装されました。ユーザがWebクライアントを通してファイルをダウンロードするとき、POSTリクエストは必要な認証ヘッダと要求されたリソースを特定するマルチパートフォーム属性を含み、/api/v2.1/auth/tokenエンドポイントに送信されます。APIハンドラは情報をJWTトークンにエンコードし、それを対称的に暗号化して、トークンに関連付けられたリソースURLを返します。これは前述の href 属性が設定されている URL です。アンカー要素がクリックされると、ファイルリソースへの GET リクエストが JWT トークンを使って認証され、href 属性でヘッダーを提供できない問題が解決されます。

JWTトークンに関連するすべてのGETリクエストは、この目的のために特別に設計された新しいバージョン2.1 APIハンドラによって処理されます。ブラウザ関連のパフォーマンスが向上したため、Webクライアントではこれらを広範に使用しています。しかし、ユーザーが作成した自動ワークフローなどの他のAPIクライアントは、新しいバージョン2.1ハンドラと機能的に同じであるJWTトークンを生成する必要がないため、元のバージョン1のダウンロードAPIを引き続き使用できます。

図2は、Webクライアントからの記録ダウンロード要求を受信したときのCryostatコンテナのメインログです。

https://developers.redhat.com/sites/default/files/styles/article_floated/public/Image%209.jpg?itok=DEkVb2II

図2:図1の記録ダウンロードのリクエストは、ここに示す2つのHTTPリクエストになります。

まとめ

新しいJWTベースのダウンロードAPIにより、CryostatのWebクライアントは、ユーザに改善されたリソースのダウンロードの流れを提供できます。Cryostatの詳細については、cryostat.ioを参照してください。質問、コメント、フィードバックは、GitHubで私たちとつながるか、私たちのメーリングリストに参加してください。

赤帽エンジニアブログでCryostatのチュートリアルをもっと見る。

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