3.4. カスタムイベント API の定義と使用


JDK Flight Recorder (JFR) は、カスタムイベント API を含むイベントレコーダーです。jdk.jfr モジュールに格納されているカスタムイベント API は、アプリケーションが JFR と通信できるようにするソフトウェアインターフェイスです。

JFR API には、Java アプリケーション、JVM、またはオペレーティングシステムの記録を管理し、カスタムイベントを作成するために使用できるクラスが含まれています。

カスタムイベント API を使用してイベントをモニターする前に、カスタムイベントタイプの名前とメタデータを定義する必要があります。

Event クラスを拡張することにより、DurationInstantRequestableTime event などの JFR ベースイベントを定義できます。具体的には、期間の値などのフィールドを、アプリケーションのペイロード属性で定義されたデータ型に一致するクラスに追加できます。Event クラスを定義した後、イベントオブジェクトを作成できます。

この手順では、JFR および JDK Mission Control (JMC) でカスタムイベントタイプを使用して、単純なサンプルプログラムの実行時パフォーマンスを分析する方法を示します。

手順

  1. カスタムイベントタイプの Event クラスで、@name アノテーションを使用してカスタムイベントに名前を付けます。この名前は、JMC グラフィカルユーザーインターフェイス (GUI) に表示されます。

    Event クラスでカスタムイベントタイプ名を定義する例

    @Name(“SampleCustomEvent”)
    public class SampleCustomEvent extends Event {...}

  2. Event クラスのメタデータと、名前、カテゴリー、ラベルなどの属性を定義します。ラベルには、JMC などのクライアントのイベントタイプが表示されます。

    注記

    大きな記録ファイルはパフォーマンスの問題を引き起こす可能性があり、これはファイルの操作方法に影響を与える可能性があります。必要なイベント記録アノテーションの数を正しく定義していることを確認してください。不要なアノテーションを定義すると、記録ファイルのサイズが大きくなる可能性があります。

    サンプルの Event クラスのアノテーションを定義する例

    @Name(“SampleCustomEvent”)  1
    @Label("Sample Custom Event")
    @Category("Sample events")
    @Description("Custom Event to demonstrate the Custom Events API")
    @StackTrace(false) 2
    public class SampleCustomEvent extends Event {
    
    
        @Label("Method") 3
        public String method;
    
    
        @Label("Generated Number")
        public int number;
    
    
        @Label("Size")
        @DataAmount 4
        public int size;
    }

    1
    JMC GUI でのカスタムイベントの表示方法のメタデータを定義する @Name などのアノテーションを記述します。
    2
    @StackTrace アノテーションは、フライト記録のサイズを増やします。デフォルトでは、JFR にはイベントが作成された場所の stackTrace は含まれていません。
    3
    @Label アノテーションは、HTTP リクエストのリソースメソッドなど、各メソッドのパラメーターを定義します。
    4
    @DataAmount アノテーションには、データ量をバイト単位で定義する属性が含まれています。JMC は、データ量をメガバイト (MB) などの他の単位で自動的にレンダリングします。
  3. Event クラスでコンテキスト情報を定義します。この情報は、カスタムイベントタイプの要求処理動作を設定するため、特定の JFR データを収集するようにイベントタイプを指定します。

    単純な main クラスとイベントループの定義例

    public class Main {
    
    	private static int requestsSent;
    
    	public static void main(String[] args) {
        	// Register the custom event
        	FlightRecorder.register(SampleCustomEvent.class);
        	// Do some work to generate the events
        	while (requestsSent <= 1000) {
            	try {
                	eventLoopBody();
                	Thread.sleep(100);
            	} catch (Exception e) {
                	e.printStackTrace();
            	}
        	}
        }
    
    	private static void eventLoopBody() {
        	// Create and begin the event
        	SampleCustomEvent event = new SampleCustomEvent();
        	event.begin();
        	// Generate some data for the event
        	Random r = new Random();
        	int someData = r.nextInt(1000000);
        	// Set the event fields
        	event.method = "eventLoopBody";
        	event.number = someData;
        	event.size = 4;
        	// End the event
        	event.end();
        	event.commit();
        	requestsSent++;
        }

    前の例では、単純な main クラスがイベントを登録し、イベントループがイベントフィールドにデータを入力してから、カスタムイベントを発生させます。

  4. JMC や JFR ツールなど、選択したアプリケーションのイベントタイプを調べます。

    図3.2 JMC でイベントタイプを調べる例

    イベントタイプのサンプルアプリケーションを調べる

    JFR 記録には、さまざまなイベントタイプを含めることができます。アプリケーションで各イベントタイプを調べることができます。

関連情報

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.