構文
newrelic.agent.function_trace(name=None, group=None, label=None, params=None, terminal=False)
デフォルトではインストルメント化されていない関数、メソッド、ジェネレータ、コルーチンをインストルメント化するために使用します。
説明
function_trace
関数、メソッド、ジェネレーター、コルーチンに追加するデコレーターです。このデコレータを追加すると、追加の トランザクション 情報 (トランザクション追跡情報を含む) を収集できるようになります。(アプリのコードに手を加えずに関数をインストルメント化する別の方法は、 構成ファイルに関数をリストすることです。)
function_trace
装飾された関数で発生するすべての関数の完全なプロファイルは提供されません。これは、装飾された関数を New Relic UI のノードとして追加し、その関数に費やされた時間をキャプチャします。その関数で何が起こっているかについてさらに詳細が必要な場合は、関数トレースを関数の子関数にも適用する必要があります。
function_trace
デコレーターは、エージェント バージョン 2.102.0.85 以降のジェネレーターとコルーチンで使用できます。これらのオブジェクトのタイミングは、消費が開始されたときに始まり、オブジェクトが使い果たされるか範囲外になると終了します。これは、メトリックがジェネレータまたはコルーチン オブジェクト自体の作成にかかった時間を表す以前のバージョンからの変更です。
デコレータは、静的メソッドやクラス メソッドのデコレータを含む既存のデコレータと組み合わせて使用できます。複数のデコレータをネストする場合は、 function_trace
デコレータを最も外側のデコレータとして使用します。
重要
ラップされているデコレータについては、実装で Python 標準ライブラリの functools.wraps()
を使用します。(または、正しい名前のイントロスペクションを可能にするために必要な、最も内側のラップされたオブジェクトの正しい名前属性をデコレーターが伝播することを確認します。)これが行われていない場合、メトリックが報告されるときに、ネストされたデコレータ関数 (最も内側にラップされた関数ではない) の名前が使用されます。
代替コールフォーム
デコレーターを使用できない設定の場合は、以下の代替コールフォームを利用できます。
コンテキストマネージャー
FunctionTrace
コンテキスト マネージャーは、渡されるパラメーターを実行前に決定できない場合に使用されます。(たとえば、インポート時に関数の名前がわからない場合があります。)コンテキスト マネージャーを使用してメトリックに名前を付ける場合は、常に名前とメトリック パスのプレフィックスを指定する必要があります。
FunctionTrace
クラスはコンテキスト マネージャーを実装し、 with
ステートメントと組み合わせて使用されます。 FunctionTrace
クラスは、トランザクションに対する時間のトレースに使用できる最低レベルのプリミティブです。
with
ステートメントは、単一の関数ではなく、時間を測定する対象の境界を定義します。したがって、コンテキスト マネージャーはコードの任意のブロックに適用できます。したがって、コード ブロックには複数の関数の呼び出しが含まれる場合もあれば、追跡する時間指向のアルゴリズムを実装する自己完結型のコード ブロックである場合もあります。
重要
過度に多くの回数呼び出されるコードブロックのトレースは避けてください。例えば、何度も実行されるループのコンテキスト内では使用しないでください。生成されたデータは、パフォーマンスのオーバーヘッドになります。より良い解決策は、ループを囲むことです。
ラッパー
トレースする特定の関数がどこにあるか事前にわかっている場合は、 function_trace
デコレータを使用できます。 ただし、トレースする必要があるすべての関数がわかっdon'tいる場合 (たとえば、ルーティング システムの一部として動的に検索されている場合)、登録時または呼び出し時にFunctionTraceWrapper
を使用して関数をラップする必要があります。
パスベースのラッピング
wrap_function_trace
は、関数が宣言されているコードの外で関数をラップするために使用されます。たとえば、これを使用して、変更したくないライブラリ コードをインスツルメントすることができます。
これらの通話フォーマットの違いについては、 Different call formats をご覧ください。
パラメーター
デコレーターのパラメータ
newrelic.agent.function_trace(name=None, group=None, label=None, params=None, terminal=False)
このコールには、以下のパラメータが含まれています。
パラメータ | 説明 |
---|---|
ストリング | オプションです。関数名を指定します。設定されていない場合は、キャプチャされた関数名がデフォルトとなります。 |
ストリング | オプション。 指定しない場合、名前が |
ストリング | オプション。トランザクション追跡のセグメントにコールアウト スタイルのフラグを追加します。デフォルトは |
ディクト | オプションです。トランザクション・トレースのセグメントに追加するカスタム・パラメータ。 |
ブール値 | オプションです。Trueの場合、子供のセグメントは記録されません。デフォルトはFalseです。 |
コンテキストマネージャのパラメータ
newrelic.agent.FunctionTrace(name, group=None, label=None, params=None, terminal=False)
コンテキスト マネージャーのパラメーターには、 function_trace
のすべての パラメーター が含まれます。 name
パラメータは必須であり、オプションではありません。
パラメータ | 説明 |
---|---|
ストリング | 必須項目です。関数名です。 |
ラッパーのパラメーター
newrelic.agent.FunctionTraceWrapper(wrapped, name=None, group=None, label=None, params=None, terminal=False)
ラッパーのパラメーターには、 function_trace
のすべてのパラメーターとwrapped
パラメーターが含まれます。
パラメータ | 説明 |
---|---|
機能 | 必要です。ラッピングされる機能 |
パスベースのラッピングパラメータ
newrelic.agent.wrap_function_trace(module, object_path, name=None, group=None, label=None, params=None, terminal=False)
パラメータには、 function_trace
のすべてのパラメータと次のパラメータが含まれます:
パラメータ | 説明 |
---|---|
物体 | 必要です。インストルメント化する機能を含むモジュール。 |
ストリング | 関数の場所へのパスです。 |
例
function_trace
例
function_trace
デコレーターの使用例:
import newrelic.agent
class _Database(UserDict.DictMixin):
...
@newrelic.agent.function_trace() def _commit(self): ...
@newrelic.agent.function_trace()def open(file, flag=None, mode=0666):...
ネイティブ コルーチンでfunction_trace
デコレータを使用する例:
import newrelic.agent
class _Database(UserDict.DictMixin):
...
@newrelic.agent.function_trace() async def _commit(self): ...
@newrelic.agent.function_trace()async def open(file, flag=None, mode=0666):...
コンテクストマネージャーの例
FunctionTrace
コンテキスト マネージャーの使用例:
import newrelic.agent
def dispatch_request(self, request): adapter = self.url_map.bind_to_environ(request.environ) try: endpoint, values = adapter.match() function = getattr(self, 'on_' + endpoint) with newrelic.agent.FunctionTrace( endpoint, 'Python/EndPoint'): return function(request, <DNT>**values) except HTTPException as e: return e
ラッパーの例
FunctionTraceWrapper
の使用例:
Werkzeug を使用した URL ルーティングでは、最初に getattr()
を使用してクラスのメソッドを動的に検索するために使用される名前が生成され、その結果が呼び出されます。
def dispatch_request(self, request): adapter = self.url_map.bind_to_environ(request.environ) try: endpoint, values = adapter.match() return getattr(self, 'on_' + endpoint)(request, **</DNT>values) except HTTPException as e: return e
終点の関数をトレースしたい場合は、次のように書き換えることができます。
import newrelic.agent
def dispatch_request(self, request): adapter = self.url_map.bind_to_environ(request.environ) try: endpoint, values = adapter.match() function = getattr(self, 'on_' + endpoint) function = newrelic.agent.FunctionTraceWrapper(function) return function(request, <DNT>**values) except HTTPException as e: return e
(呼び出される関数の識別子に基づいてメトリックに名前を付けるのではなく) エンドポイント名に基づいてメトリックに名前を付ける場合は、 FunctionTraceWrapper
オブジェクトの作成時に、使用する名前と代替メトリック パス プレフィックスを指定できます。
import newrelic.agent
def dispatch_request(self, request): adapter = self.url_map.bind_to_environ(request.environ) try: endpoint, values = adapter.match() function = getattr(self, 'on_' + endpoint) function = newrelic.agent.FunctionTraceWrapper( function, name=endpoint, group='Python/EndPoint') return function(request, **</DNT>values) except HTTPException as e: return e
この例では、エンドポイントの名前が help
の場合、最終的なメトリックは次のようになります。
Python/EndPoint/help
トランザクションのパフォーマンスの内訳では、カテゴリは Python
、セグメント名は EndPoint/help
になります。そのセグメント名は、低速トランザクション トレースにもノード名として表示されます。