ここでは、 Python エージェントをインストールする際の、Gunicorn を統合するための要件とヒントについて説明しています 。PythonエージェントはGunicornのをサポートしています。
- デフォルト
sync
worker - 非同期
イベントレット
およびgevent
ワーカー
Pythonエージェントの統合
Gunicornで推奨されているアドミン・スクリプトの統合方法を利用することができます。ここでは、アドミンスクリプトを使って起動コマンドをラッピングする例を紹介します。
NEW_RELIC_CONFIG_FILE=/PATH/TO/newrelic.ini newrelic-admin run-program gunicorn YOUR_COMMAND_OPTIONS
また、Gunicornを起動する前に設定ファイルの場所をエクスポートすることもできます。
NEW_RELIC_CONFIG_FILE=/PATH/TO/newrelic.ini
export NEW_RELIC_CONFIG_FILE
newrelic-admin run-program gunicorn YOUR_COMMAND_OPTIONS
プリロードアプリケーション
Gunicornのプロセス管理機能の一環として、アプリケーションのプリロードを有効にすることができます。この機能を有効にすると、WSGIスクリプトファイルやモジュールが親のマスタープロセスにプリロードされます。ワーカープロセスは、このマスタープロセスからフォークされます。
これは、WSGIスクリプトやモジュールがロードされたときに、各ワーカープロセスで実行されるはずのバックグラウンドスレッドを作成する場合、ワーカープロセスがフォークされたときにそのバックグラウンドスレッドが殺されてしまうという問題を引き起こす可能性があります。
Pythonエージェントは、バックグラウンドスレッドを使用して、定期的にデータコレクタにデータを返します。通常の状況では、このスレッドは最初の Web リクエストを受信したときにのみ作成されます。これは通常ワーカープロセスで行われるため、プリロードを使用しても問題はありません。
しかし、バックグラウンドタスクとして特定の関数の呼び出しを追跡する計測機能を追加し、WSGIスクリプトファイルやモジュールの読み込み時にそれらの関数が呼び出された場合、エージェントのバックグラウンドスレッドがマスターの親プロセスで開始されます。その後、ワーカープロセスがフォークされる際にバックグラウンドスレッドが殺されるため、実際のウェブアプリケーションではデータが報告されません。
プリロードを使用する場合は、コードをプリロードするためだけに使用し、タスクを実行するために実際のコードの実行をトリガーしないように制限することを目指すべきです。WSGIスクリプトファイルやモジュールがロードされたときの処理は、Gunicornの post_fork
フックを使ってワーカープロセスに任せるべきです。
同様の理由で、Gunicorn の on_starting
、 on_reload
、 when_ready
、 pre_fork
、 pre_exec
のフックでタスクを実行するコードを実行することは避けるべきです。