JProfiler ヘルプ

スクリプトプローブ

カスタムプローブ

IDEでカスタムプローブを開発するには、インターセプトポイントとプローブが提供する利点を明確に理解する必要があります。一方、スクリプトプローブを使用すれば、APIを学習することなく、JProfiler GUIで直接シンプルなプローブをすばやく定義して試行することができます。組み込み型やインジェクション型のカスタムプローブとは異なり、スクリプトプローブは実行中のプロファイリングセッション中に再定義できるため、編集・コンパイル・テストの高速なループが可能になります。

スクリプトプローブの定義

スクリプトプローブは、インターセプト対象のメソッドを選択し、プローブのペイロード文字列を返すスクリプトを入力することで定義します。このようなメソッドとスクリプトのペアを複数まとめて、単一のプローブにバンドルできます。

スクリプトプローブの設定には、セッション設定からアクセスします。ここでは、スクリプトプローブの作成や削除を行うだけでなく、他のプロファイリングセッションでインポートできるようにスクリプトプローブをセットとして保存することもできます。

各スクリプトプローブには名前が必要で、任意で説明を追加することもできます。名前は、「JVM & Custom Probes」セクションにあるJProfilerのビューセレクターにプローブビューを追加するために使用されます。説明はプローブビューのヘッダーに表示され、その目的を簡潔に説明したものである必要があります。

メソッドを選択する方法には、設定されたクラスパスからクラスを選択したり、プロファイリングセッションがすでに実行されている場合はプロファイルされたクラスから選択したりするなど、複数の選択肢があります。2番目のステップで、選択したクラスからメソッドを選択できます。

インターセプト対象のメソッドをはるかに簡単に選択する方法は、呼び出しツリービューから選択することです。コンテキストメニューのスクリプトプローブでメソッドをインターセプトアクションにより、新しいプローブを作成するか、既存のプローブにインターセプトを追加するかを選択するダイアログが表示されます。

プローブスクリプト

スクリプトエディタでは、インターセプトされたメソッドのすべてのパラメータと、メソッドが呼び出されたオブジェクトにアクセスできます。インターセプトされたメソッドの戻り値やスローされた例外にアクセスする必要がある場合は、組み込みプローブまたはインジェクションされたプローブを作成する必要があります。

この環境では、スクリプトによって式として、あるいはreturn文を含む一連のステートメントとしてペイロード文字列を構築できます。このようなスクリプトの最も単純な形式は、1つのパラメータに対してparameter.toString()を返すか、プリミティブ型のパラメータに対してString.valueOf(parameter)を返します。nullが返された場合、ペイロードは作成されません。

CPUとプローブデータを同時に記録すると、CPUセクションの呼び出しツリービューにおいて、適切な呼び出しスタックの箇所にプローブビューへのリンクが表示されます。あるいは、CPUの呼び出しツリービュー内にペイロード文字列をインラインで表示するように選択することもできます。プローブウィザードの「ペイロードのインターセプト->呼び出しツリーのアノテーション」ステップにこのオプションが含まれています。

スクリプトで利用可能なもう1つのパラメータとしてスクリプトコンテキストがあります。これはcom.jprofiler.api.agent.ScriptContext型のオブジェクトで、現在のプローブに対して定義された任意のスクリプトの呼び出し間でデータを保持できます。たとえば、インターセプト対象のメソッドAが適切なテキスト表現を持たないオブジェクトしか参照できないものの、メソッドBをインターセプトすることでオブジェクトと表示名の関連付けを取得できるとします。この場合、同じプローブ内でメソッドBをインターセプトし、オブジェクトとテキストの関連付けをスクリプトコンテキストに直接保存できます。そしてメソッドAでは、その表示テキストをスクリプトコンテキストから取得してペイロード文字列の構築に利用できます。

インターセプトメソッド A:· object c· name nscriptContext.putObject(c,n);return null;タイム測定インターセプトメソッド B:· object creturn scriptContext.getObject(c);12

このような処理が複雑になりすぎる場合は、組み込みプローブまたはインジェクションされたプローブのAPIへの移行を検討してください。

サポートされていない機能

スクリプトプローブは、カスタムプローブ開発へ簡単に導入できるように設計されていますが、完全なプローブシステムの一部の機能はサポートされていません。以下の点にご注意ください。

  • スクリプトプローブは呼び出しツリーの分割を実行できません。JProfiler UIでは、カスタムプローブの概念で説明されているように、これは独立した機能です。組み込みプローブおよびインジェクションされたプローブは、呼び出しツリーの分割機能を直接提供します。
  • スクリプトプローブは制御オブジェクトの作成や、カスタムプローブイベントタイプの作成を行うことができません。これらは組み込みプローブまたはインジェクションされたプローブでのみ可能です。
  • スクリプトプローブは、組み込みプローブやインジェクションされたプローブとは異なり、戻り値やスローされた例外にアクセスできません。
  • スクリプトプローブはリエントラントなインターセプトを処理できません。メソッドが再帰的に呼び出された場合、最初の呼び出しのみがインターセプトされます。組み込みプローブおよびインジェクションされたプローブでは、リエントラント動作をきめ細かく制御できます。
  • プローブビューにデフォルトのテレメトリー以外のテレメトリーをバンドルすることはできません。代わりに、カスタムプローブの概念で説明されているスクリプトテレメトリー機能を使用できます。