OpenShift は、Pythonエージェントを含む様々な言語を使用したウェブアプリケーションをホスティングすることができるPaaS(Platform as a Service)ソリューションです。
アプリケーションの準備
Python エージェントをインストールする前に、利用可能な Python カートリッジのいずれかを使用して、Python Web アプリケーションが OpenShift の下にインストールされ、実行されていることを確認してください。詳細は、 OpenShift developer guides を参照してください。
APM Pythonエージェントのインストール
OpenShift は、サードパーティの Python パッケージをインストールする 2 つの異なる方法をサポートしています。ウェブアプリケーションの setup.py
に依存関係としてパッケージをリストアップするか、 pip
で使用される requirements.txt
ファイルにパッケージをリストアップすることができます。
setup.py
ファイルを使用している場合、 newrelic
を install_requires
に渡されるサードパーティモジュールのリストに追加して、エージェントをインストールします。
from setuptools import setup
setup(name='YourAppName',
version='1.0',
description='OpenShift App',
author='Your Name',
author_email='example@example.com',
url='https://www.python.org/community/sigs/current/distutils-sig',
install_requires=['Flask>=0.7.2', 'MarkupSafe', 'newrelic'],
)
pip
を使用している場合は、 requirements.txt
に次の行を追加してください。
newrelic
プロジェクトを OpenShift にプッシュすると、Python エージェントパッケージがインストールされます。Python エージェントは、Python Package Index (PyPi) の OpenShift ミラーから最新バージョンを使用します。PyPiのOpenShiftミラーの更新は遅れることがあるので、PyPiの新しいリリースがOpenShiftで利用できるようになるまで、最大で1日待つ必要があるかもしれません。
Pythonエージェントの更新
OpenShift はパッケージをキャッシュし、Python エージェントの新しいバージョンが利用可能になっても検出しません。新しいバージョンに強制的にアップグレードするには、 setup.py
または requirements.txt
ファイルのパッケージ名に対してバージョンを明示的に列挙し、アプリケーションをプッシュします。以下の構文を使用してください。
newrelic==A.B.C.D
A.B.C.D
を、インストールしたいPythonエージェントのバージョンに置き換えてください。
Pythonエージェント環境変数の使用
Python エージェントが正しいアカウントにデータを報告するためには、New Relic アカウントの ライセンスキー をエージェントに伝える必要があります。OpenShift の場合、ライセンスキーを提供する最も安全な方法は、 rhc env set
コマンドを使用して、アプリケーションの設定で環境変数を構成することです。この方法では、GIT リポジトリに機密情報を保存することがなく、また、複数の物理ホストでホストされているスケールの大きいウェブアプリケーションを使用している場合にも有効です。
rhc env set NEW_RELIC_LICENSE_KEY=YOUR_LICENSE_KEY -a YOUR_APP_NAME
ライセンスキーを指定すると同時に、Pythonエージェントにログメッセージを記録する場所を伝えます。
rhc env set NEW_RELIC_LOG=stderr -a YOUR_APP_NAME
環境変数が設定されていることを確認するには、次のように実行します。
rhc env list -a YOUR_APP_NAME
設定されていても、次にウェブアプリケーションのギアを再起動したときにのみ有効になります。
エージェントインストールのテスト
Python エージェントパッケージが正しくインストールされ、エージェントの環境変数が正しく設定されているかどうかをテストするには、アプリケーションのメインギアに ssh
を入れて実行します。
newrelic-admin validate-config - stdout
この管理用スクリプトは、お客様のアカウントにあるアプリケーション Python Agent Test の下で、接続を作成し、テストトランザクションデータを報告します。
データがUIに表示されるまでには、最大で5分かかることがあります。時間が経っても表示されない場合は、テストを実行した際の出力をキャプチャし、そのデータを使って問題を解決してください。さらにサポートが必要な場合は、 support.newrelic.com でサポートを受けてください。
Pythonエージェントの初期化
OpenShiftのPythonカートリッジは、WSGIアプリケーションを実行する2つの方法を提供しています。
- 1つ目の方法は、事前に設定されたApache/mod_wsgiのインストールを使用します。この場合、WSGIアプリケーションのエントリーポイントは、
wsgi.py
ファイルで定義する必要があります。 - 2つ目の方法は、
app.py
というスタンドアロンのPythonウェブアプリケーションスクリプトを提供することに依存しています。これは通常、組み込みのPython WSGIサーバーを起動します。WSGIアプリケーションのエントリーポイントは、app.py
ファイル内で指定されるか、wsgi.py
ファイルのような、別のPythonコードファイルからインポートされます。
いずれの方法でも、OpenShift は WSGI サーバーの起動を制御します。Python エージェントを WSGI アプリケーションに手動で統合する必要があります。WSGIサーバーの起動時に、 newrelic-admin
のラッパースクリプトを使用することはできません。
Apache/mod_wsgiアプローチを使用している場合は、 wsgi.py
ファイルの一番最初に以下のコードを追加してください。
import newrelic.agentnewrelic.agent.initialize()
wsgi.py
ファイルの中で、他のPythonモジュールのインポートの前にあることを確認してください。 initialize()
呼び出しに引数を与える必要はありません。なぜなら、ライセンスキー情報とログの保存先は、環境変数から読み込まれるからです。
app.py
から組み込まれたPython WSGIサーバーを使用している場合、 app.py
ファイルの一番上にこれらの行を配置します。たとえ、WSGIアプリケーションのエントリーポイントを wsgi.py
ファイルからインポートしている場合でも同様です。 app.py
を wsgi.py
で使用する場合は、 wsgi.py
にこれらの行を追加しないでください。
任意のWebフレームワークの内蔵開発サーバーの使用は避けてください。また、OpenShift の Python 2.6 カートリッジや古い Django のバージョンも使用しないでください。これは、これらの開発サーバーが、Python標準ライブラリの wsgiref モジュールのWSGIサーバーをベースにしていることが多いからです。 wsgiref モジュールの WSGI サーバにはバグがあり、完全な WSGI 準拠ではないため、Python エージェントが正しくないデータを報告する原因となっていました。 wsgiref モジュールのこの問題は、Python 2.7.4 でのみ修正されました。Django 1.4 より前の古いバージョンの Django の組み込み WSGI サーバにも同様の問題がありました。
WSGIアプリケーションのラップ
エージェントがWSGIアプリケーションエントリーポイントの自動ラッピングを提供するPythonウェブフレームワークを使用している場合は、これだけで済みます。自動ラッピング機能を持つPythonのWebフレームワークには、Django、Flask、Bottleなどがあります。
その他の場合は、WSGIアプリケーションのエントリーポイントを持つPythonコードファイルを修正して、WSGIアプリケーションオブジェクトをWSGIアプリケーションラッパーでラップする必要があります。これにより、アプリケーションが受け取るWebリクエストのタイミングが開始されます。
エントリーポイント | コード例 |
---|---|
エンティポイントは関数 | それをデコレーションで包む。
|
エンティポイントとは、異なるモジュールからインポートされた関数やオブジェクトのことです。 | プレデコレーションスタイルで包む
|
アプリケーション名の上書き
デフォルトでは、データは Python Application というアプリ名で記録されます。表示名を変更するには、APM のユーザーインターフェースを使用します。ただし、エージェント側では、UI での表示名の変更とは別に、この表示名を一意の不変の値として維持することを強くお勧めします。これは、1つのNew Relicアカウントで複数の異なるサイトを運営し、データを別々に報告させたい場合に必要です。
アプリケーション名を上書きするには、 rhc env set
コマンドを使用します。
rhc env set NEW_RELIC_APP_NAME='Web Site (Production)' -a yourappname
設定が更新されたことを確認するために、実行します。
rhc env list -a yourappname
そして、探してください。
NEW_RELIC_APP_NAME=Web Site (Production)
環境変数の変更は、次にWebアプリケーションのギアを再起動したときにのみ反映されます。
Pythonエージェントのデバッグ
デバッグを開始するには、Python エージェントからのログ出力を収集します。 NEW_RELIC_LOG
環境変数が stderr
に設定されている場合、Python エージェントからのログメッセージは、Python の標準的なウェブアプリケーションのログの中に取り込まれます。
OpenShiftでWebアプリケーションのログを尾行するには、次のように実行します。
rhc tail -a YOUR_APP_NAME
完全なログを得るためには、それぞれのウェブアプリケーションからログファイルをコピーバックしてください。
$OPENSHIFT_PYTHON_LOG_DIR/python.log
デフォルトでは、Pythonエージェントは info
レベルでログをとります。エージェントが別のレベルのログを必要とする場合は、手動で環境変数を追加する必要があります。例えば、ログ出力を debug
に設定するには、次のように実行します。
rhc env set NEW_RELIC_LOG_LEVEL=debug -a YOUR_APP_NAME
環境変数はすぐには反映されませんので、必ずWebアプリケーションのギアを再起動してください。
debug
ロギングは要求されたときだけ、必要な時間だけ実行してください。デバッグログは大量の出力を行い、ログファイルを肥大化させてしまいます。以下のコマンドを実行して、この設定が不要になったらすぐに削除し、Webアプリケーションのギアを再起動してください。
rhc env unset NEW_RELIC_LOG_LEVEL -a YOUR_APP_NAME
ログファイルを使用して、問題のトラブルシューティングを行ってください。さらにサポートが必要な場合は、 support.newrelic.com でサポートを受けてください。
エージェント設定ファイルの更新
OpenShift では、アカウントのライセンスキーを指定したり、ロギングの場所を定義したりするには、環境変数を使用するのが望ましい方法です。つまり、エージェントを動作させるためにエージェント設定ファイルを使用する必要はありません。しかし、エージェント設定ファイルがないと、 他のエージェント設定をカスタマイズすることができません。.
アプリケーションのサーバーサイド構成を有効にした場合、エージェント設定ファイルは必要ありません。これは、APM ユーザーインターフェースアプリケーションの Application settings から行われます。サーバーサイド構成を使用すると、エージェントのコア設定をオーバーライドできます。UIを介して設定が変更されると、各Webアプリケーションプロセス内で実行されているエージェントに通知され、変更された設定がピックアップされます。
ただし、エージェントの機能の中には、サーバーサイドの設定と互換性のないものもあります。このような場合には、Webアプリケーションと一緒にOpenShiftにプッシュアップされたエージェント設定ファイルを使用してください。
OpenShiftでエージェント構成ファイルを追加して有効にするには。
エージェント設定ファイル newrelic.ini を、OpenShift にプッシュアップするプロジェクトリポジトリのルートディレクトリに追加します。このファイルには、
[newrelic]
セクションと、設定する必要のある特定の構成設定だけが含まれているはずです。例えば、以下のようになります。[newrelic]transaction_tracer.function_trace = mydbm:connectライセンスキーやアプリ名などのコアな設定にエージェントの設定ファイルを使用しないでください、環境変数の設定が上書きされてしまいます。また、特にプロジェクトのソースコードが公開されている場合は、ライセンスキーをGITリポジトリの一部として使用しないようにしてください。
また、サーバーサイドコンフィグレーションが同時に有効になっている場合、サーバーサイドコンフィグレーションで設定可能な設定は常にローカルの設定よりも優先されますのでご注意ください。そのため、サーバーサイドコンフィグレーションを有効にしている場合は、サーバーサイドコンフィグレーションで設定できない設定にのみ使用してください。
次に,Python エージェントを初期化するコードを追加した
wsgi.py
またはapp.py
ファイルを修正します。すでに追加していたコードを変更します。import osimport newrelic.agentrepo_dir = os.environ['OPENSHIFT_REPO_DIR']config_file = os.path.join(repo_dir, 'newrelic.ini')newrelic.agent.initialize(config_file)設定ファイルをリポジトリにコミットし、その変更をOpenShiftにプッシュします。