構文
newrelic.agent.register_application(name=None, timeout=None)
Pythonエージェントを直ちに登録します。エージェントを手動で初期化する場合に使用します。
説明
initialize
が呼び出されると、Python エージェントが設定されますが、エージェントは コレクタに登録されません。この呼び出しは、エージェントをコレクターに登録します。
これは主に、API を使用してインストルメント化された Web 以外の バックグラウンド トランザクション に使用されます。非 Web トランザクションで使用する場合は、 initialize
呼び出しの後、できるだけ早く register_application
を呼び出します。
Web トランザクションの場合、エージェントは通常、最初の Web 要求またはバックグラウンド タスクが発生したときに自動的に登録され、エージェントはコレクターから サーバー側の構成 を受け取ります。登録には 1 秒ほどかかることがあるため、通常、詳細は最初のトランザクションから失われます。 register_application
への登録を強制することで、このすべてのデータを収集できます。ただし、そうすると、アプリは登録が完了するのを待ってから、ウェブ リクエストを処理したり、バックグラウンド タスクを実行したりする場合があります。
スクリプト自体が WSGI サーバーを実行する場合は、メイン スクリプト ファイルのメイン プログラム スレッドからregister_application
を呼び出します。 Apache/mod_wsgiまたはuWSGIを使用する場合は、 WSGIスクリプトファイルから呼び出しを行い、 initialize
.
この呼び出しは、 application
と同じ方法でアプリケーション オブジェクトを返します。アプリケーション オブジェクトは、エージェントによって監視されている現在のアプリケーションへの参照を取得するために使用され、一部の Python エージェント API 呼び出しで使用されます。
グローバルインポートロック中の呼び出しを避ける
Python グローバル インポート ロックが保持されている場合は、ゼロ以外のタイムアウトで register_application
を呼び出さないでください。つまり、モジュールのインポート中にモジュール ファイル内でグローバル スコープで呼び出さないでください。これを行うと、この呼び出しによって作成されたバックグラウンド スレッドで一時的なデッドロックが発生する可能性があります (デッドロックは、タイムアウトが期限切れになるまで解除されません)。
多くのWSGIサーバは、標準的なPythonモジュールインポートメカニズムを介してWSGIアプリケーションを含むモジュールをインポートすることに注意してください。そのような場合、グローバルなインポートロックが保持され、上述のデッドロック問題が発生する可能性があります。
Gunicorn の場合: 前述のデッドロックの問題は、Gunicorn の使用時にも発生する可能性があります。問題は、モジュールを親プロセスにプリロードするため、WSGI モジュールからの register_application
のトリガーは安全ではないことです。Gunicorn で register_application
(タイムアウトの有無にかかわらず) 使用するには、 post_fork()
コールバックから呼び出します。これは Apache/mod_wsgi の問題ではありません。これらのツールはこれを行わないように設計されているため、WSGI アプリケーションがロードされたときにバックグラウンド スレッドを作成しても安全です。
ワーカープロセスのフォーク後の呼び出し
子ワーカー プロセスでトランザクションを記録している場合は、子ワーカー プロセスがフォークされる前に、親プロセスで register_application
を呼び出さないでください。フォークする前に register_application
を呼び出すと、プロセスがフォークされたときにバックグラウンド エージェント スレッドが強制終了されます。親スレッドがコレクタにデータをレポートしているため、エージェントは子ワーカー プロセスからデータをレポートできません。
パラメーター
パラメータ | 説明 |
---|---|
ストリング | オプションです。アプリケーション名を指定します。設定されている場合は、Pythonエージェントの構成で設定されたアプリケーション名よりも優先されます。 |
int or float | あきらめて応答を送信する前に、アプリが登録を試行する秒数。つまり、New Relic が起動するか、タイムアウトを超えるまで、この行はブロックされます。 この値は、制御が返され、呼び出し元が処理を続行できるようになる前に、呼び出し元がブロックされる最大秒数を指定します。値がない場合、呼び出しは、エージェント構成でグローバルに構成された |
戻り値
他のPythonエージェントAPIコールで使用可能なアプリケーションオブジェクトを返します。
例
バックグラウンドタスクの登録
この例では、ウェブ以外のバックグラウンドタスクを長いタイムアウトで登録しています。通常、ウェブアプリケーションでは、非常に短いタイムアウト(デフォルトは0)を設定しますが、頻度の低い非ウェブタスクでは、初期化と登録が確実に行われるように、より長いタイムアウトを設定することがあります。
import newrelic.agent
newrelic.agent.initialize('newrelic.ini')newrelic.agent.register_application(timeout=10.0)
@newrelic.agent.background_task()def main(): pass
if __name__ == '__main__': main()