このページでは、アプリケーション環境を準備して AppDynamics Python エージェントをインストールする方法について説明します。 

はじめに

  1. Python対応環境 でご使用の環境がサポートされているか確認。
  2. エージェントをインストールするマシンで、Python パッケージのインデックスにアクセスできることを確認。
  3. 監視するWSGIベースのアプリケーションを準備。
  4. アプリケーションが実行しているマシンに、エージェントソフトウェアのインストール権限を持つユーザーとしてアクセスし、アプリケーションを再起動できることを確認。これらの特権を持つユーザーアカウントがあることを確認。
  5. uWSGI を使用している場合は、uWSGI 構成ファイルで enable-threads=1 を設定。エージェントにはマルチスレッドが必要です。
    Python エージェントと、「apt-get」などの OS パッケージマネージャによってインストールされた uWSGI のバージョンとの間には互換性がないことが知られています。このため、この問題を回避するために AppDynamics では pip から uWSGI をインストールすることが推奨されています。

  6. モニタするアプリケーションが仮想環境で実行されている場合は、仮想環境をアクティブにします。たとえば、次のソースコマンドで仮想環境をアクティブ化します。

    source /<path_to_virtual_environment>/bin/activate

    仮想環境のアクティブ化は、アプリケーションがグローバルPython環境で実行されている場合は不要。

エージェントのインストール

Pythonアプリケーションを実行しているマシンに、適切なユーザー認証情報を使用して次のようにログインします。

  • 仮想環境の場合、ユーザはその仮想環境の所有者である必要があります。 
  • グローバル Python 環境の場合は、インストールコマンドをルートで実行する必要があります。 

次の項で説明するインストール方法のいずれかを使用して、エージェントをインストールできます。

pip のインストール

最新バージョンのエージェントをインストールまたはアップグレードするには、 pip install コマンドを次のように実行します。

プラットフォーム [英語]

コマンド

Linux
pip install -U appdynamics
CODE
Alpine Linux
apk add libstdc++
pip install -U appdynamics-alpine
CODE

複数のパッケージがある場合は、pip list コマンドまたはパッケージ一覧(https://pypi.python.org/pypi)を使用してエージェントを検索し、その出力から appdynamics  を見つけます。次に出力例を示します。

AppDynamics Installation on PYPI

運用デプロイメントでは、AppDynamicsはテスト/ステージング環境で最初に展開することなく、バージョンが依存しないようにフリーズすることを推奨しています。特定のバージョンの AppDynamics Python エージェントをインストール(またはアップグレード)するコマンドは以下のとおりです。

pip install -U appdynamics==<released_agent_version>

次に例を示します。

pip install -U appdynamics==22.1.0.0

このコマンドを実行するたび、常に同じバージョンのエージェントがインストールされます。

AppDynamics ダウンロードポータルからのインストール

  1. ポータルから PythonAgent*.tar.bz2 ファイル(ターゲットプラットフォームに基づく)をダウンロードし、コンテンツをフォルダに解凍します。
    次のコマンドを実行して、最新の pip が wheel のインストールをサポートしていることを確認します。

    pip install --upgrade pip
    CODE
  2. 次のコマンドを実行して、wheel 形式をインストールします。

    プラットフォーム [英語]

    コマンド

    Linux
    pip install -f <untar_folder> appdynamics
    CODE
    Alpine Linux
    pip install -f <untar_folder> appdynamics-alpine
    CODE

エージェントの構成

エージェントとコントローラとの通信に必要なAppDynamics設定を指定する構成ファイルを指定します。このファイルは Python ConfigParser 形式である必要があります。Pythonアプリケーションのユーザーは、構成ファイルの読み取りアクセス権限が必要です。

構成ファイルの行はスペースで始まらないことにご注意ください。#で始まる行はコメントであり、エージェントにより無視されます。

以下は最低限必要な設定を行ったシンプルな構成ファイルの例です。

[agent]
app = <app_name>
tier = <tier_name>
node = <node_name>

[controller]
host = <controller_host>
port = <controller_port>
ssl = true
account = <your AppDynamics controller account name>
accesskey = <your AppDynamics controller account access key>

構成の次の点に注意してください。

  1. ssl 設定により、エージェントが SSL でコントローラに接続するかどうかが決まります。SaaS コントローラにはこの設定が必須です。 
  2. account 値は、SaaS アカウントまたはマルチテナントのオンプレミスコントローラを使用している場合に必要です。シングル テナント コントローラの場合は、デフォルトで customer1 に設定されます。
  3. すべてのコントローラでアクセスキーが必要です。アカウント名とアクセスキーを調べるには、AppDynamics UI の右上隅にある をクリックし、次に [License] をクリックします。
  4. sslhttp-proxy または wsgi_module など、その他の設定がご使用の環境で必要となる場合があります。設定の完全なリストについては、「Pythonエージェント設定」を参照してください。

pyagent run を使用してアプリケーションをインストゥルメント化する場合は、構成ファイルパスをパラメータとして pyagent run コマンドに渡します。その他の展開では、uWSGI with EmperorApache with mod_wsgi のサンプルに示すように、APPD_CONFIG_FILE 環境変数を設定します。

Alpine Linux プラットフォームの場合:

AppDynamics では、init プロセスを使用することを推奨しています。init プロセスを指定すると、ゾンビプロセスの取得などの init システムの機能が、作成されたコンテナ内で実行されるようになります。docker run コマンドの引数として --init を使用できます。

次に例を示します。

docker run -idt --privileged --init --name <container-name> <container-id> sh
CODE

Docker ファイルのエントリポイントとして、tini を使用できます。

Sample command

RUN apk add --no-cache tini
# Tini is now available at /sbin/tini
ENTRYPOINT ["/sbin/tini", "--"]
CODE

アプリケーションのインストゥルメンテーション

使用するインストゥルメンテーション手順は、次の展開オプションからどのようにアプリケーションを展開するかによって異なります。

Python環境に関係なく、PasteDeployを使用してアプリケーションを構築した場合は、PasteDeploy構成を変更してPythonエージェントをインストールできます。PasteDeployを参照してください。

pyagent run

WSGI サーバの呼び出し方法を制御できる場合は、pyagent run を使用してアプリケーションをインストゥルメント化できます。このコマンドで、Python エージェント対応の WSGI サーバを実行します。コマンドを指定して実行するためのプロセス ランチャまたはマネージャを使用する場合は、一般的にこの方法が可能です。たとえば、Supervisor、uWSGI without Emperor、init.d スクリプトなどで管理されるフレームワークがあります。

pyagent run コマンドを使用するには、既存のアプリケーションの実行コマンドの前に pyagent run コマンド追加し、「Configure the Agent」で説明されている AppDynamics 構成ファイルをパラメータとして渡します

いかなる場合も PYTHONPATH を上書きしないでください。上書きすると、pyagent run コマンドがエージェントをロードしなくなりますPYTHONコマンドに追加する必要がある場合は、pythonpath構成変数を使用します。たとえば、次のコマンドを使用すると上書きではなく、/foo または /barPYTHONPATH に追加します。

PYTHONPATH へ追加する正しい方法

pythonpath = /foo
pythonpath = /bar 
CODE

次の構文を使用して PYTHONPATH に値を追加しないでください。PYTHONPATH へ追加する誤った方法

env = PYTHONPATH=/foo:/bar 
CODE

supervisorctlの使用

supervisorctl を使用する場合は、Supervisor 構成を更新した後で supervisorctl reload コマンドを使用して Python エージェントをロードする必要があります。supervisorctl restart コマンドを使用した場合、Supervisor はその構成ファイルを再読み込みしません。

エージェントが読み込まれたことを確認するには、Pythonエージェントログファイルを検索します。デフォルトの場所は /tmp/appd/logs/<app_name>-<node_name>.log です。たとえば、エージェント構成ファイルに指定したアプリケーション名が「myapp 」でノード名が「mynode 」であり、ログファイルの場所を変更していない場合は、ログファイルは /tmp/appd/logs/myapp-mynode になります。

ログファイルが存在する場合は、エージェントがロードされています。ログファイルが存在しない場合はエージェントは読み込まれていません。この場合、supervisorctl reload を使用して Supervisor 構成を再読み込みしてください。

 

DjangoおよびFlask

ご使用のフレームワークが Django または Flask の場合は、pyagent run を実行コマンドの先頭に追加してください。たとえば、 現在のrunコマンドが次のようである場合:

gunicorn -w 8 -b '0.0.0.0:9000' example.app:application

次のように置き換えます。

pyagent run -c <path_to_appdynamics_config_file> -- gunicorn -w 8 -b '0.0.0.0:9000' example.app:application

その他のPure Python WSGIベースのフレームワーク

DjangoまたはFlaskではないWSGIベースのフレームワークをご使用の場合は、以下のようにします。

  1. AppDynamics 構成ファイルで、WSGI アプリケーションを指定するには、APPD_WSGI_MODULE ディレクティブを設定して、アプリケーションモジュールを指すようにします。Pythonエージェント設定 を参照してください。
  2. 実行コマンドの先頭に pyagent run を追加
  3. AppDynamicsが生成したアプリケーションを実行。

たとえば、実行コマンドが次のような場合、

gunicorn -w 8 -b '0.0.0.0:9000' example.app:application

以下の2つのコマンドと置き換えます。

pyagent run -c /path/to/appdynamics.cfg -- gunicorn -w 8 -b '0.0.0.0:9000'
appdynamics.scripts.wsgi:application

uWSGI Emperor

ご使用の環境が uWSGI Emperor の場合は、WSGI 構成ファイルを変更して手動でプロキシを起動する必要があります。 

uWSGI EmperorはuWSGIサーバーに特化したプロセスマネージャです。uWSGI Emeperor では管理対象の uWSGI プロセスの起動方法を制御できないため、pyagent run コマンドで使用できません。

WSGI構成ファイルの場所はデプロイメント方法により異なります。Emperor の展開の詳細については、http://uwsgi-docs.readthedocs.org/en/latest/Emperor.html を参照してください。

uWSGI Emperor のアプリケーションをインストゥルメント化するには
  1. Configure the Agent」に記載された方法で構成ファイルを作成。 
  2. uWSGI構成ファイルを変更。構成がモジュールディレクティブを使用するか wsgi-file ディレクトリを使用するかにより、次のいずれかを実行。
    Module Directive

    uWSGI 構成内に次のようなモジュールディレクティブがある場合は、

    module = yourcompany.sample:app

    モジュール設定を変更し、APPD_WSGI_MODULEAPPD_CONFIG_FILE 設定を追加して、次のように構成を変更(構成ファイルが /etc/appdynamics.cfg に保存されていると仮定)。

    env = APPD_CONFIG_FILE=/etc/appdynamics.cfg
    env = APPD_WSGI_MODULE=yourcompany.sample:app
    module = appdynamics.scripts.wsgi:application

    WSGI-File Directive

    uWSGI 構成内に wsgi-file ディレクティブがある場合は、

    wsgi-file = /var/www/yourcompany/sample.py
    callable = app

    構成を次のように変更(構成ファイルが /etc/appdynamics.cfg に保存されていると仮定)。

    env = APPD_CONFIG_FILE=/etc/appdynamics.cfg
    env = APPD_WSGI_SCRIPT_ALIAS=/var/www/yourcompany/sample.py
    env = APPD_WSGI_CALLABLE_OBJECT=app
    module = appdynamics.scripts.wsgi
  3. インストゥルメンテーションを行ったアプリケーションでトラフィックを実行する前に、以下を実行してプロキシを手動で起動します。

    pyagent proxy start

mod_wsgiを使用したApache

Python エージェント ベータは、単一 WSGI ファイルを指す WSGIScriptAlias を使用する mod_wsgi 構成のみをサポートしています。 たとえば、以下のタイプの構成がサポートされています。

WSGIScriptAlias /books /var/www/acme/bookstore/app.wsgi

スクリプトのエイリアスがディレクトリを指していたり、スクリプトが WSGIScriptAliasMatch ディレクティブを使用している場合は、python@appdynamics.com に問い合わせて Python エージェントをご使用の環境に展開する方法について相談してください。

前述のような構成がサポートされている mod_wsgi を使用する Apache 環境の場合は、その mod_wsgi 構成ファイルを変更してプロキシを手動で起動する必要があります。

mod_wsgi を使用する Apache のアプリケーションをインストゥルメント化するには

  1. Configure the Agent」に記載された方法で構成ファイルを作成。 
  2. mod_wsgi 構成ファイルを変更。
    mod_wsgi 構成ファイルに次のようなエントリがある場合は、

    WSGIScriptAlias /books /var/www/acme/bookstore/app.wsgi
    WSGICallableObject application

    エントリを次のように変更(構成ファイルが /etc/appdynamics.cfg に保存されていると仮定)。

    SetEnv APPD_CONFIG_FILE /etc/appdynamics.cfg
    SetEnv APPD_WSGI_MODULE acme.bookstore:app
    WSGIScriptAlias /books /<path_to_virtualenv>/lib/python2.7/site-packages/appdynamics/scripts/wsgi.py


  3. インストゥルメント化されたアプリケーションを使用してトラフィックを実行する前に、次を実行してプロキシを手動で起動。

    pyagent proxy start

PasteDeploy

AppDynamicsが提供するコンポジットファクトリを使用してPasteDeploy構成を変更し、PasteDeployで構築されたPythonアプリケーションをインストゥルメント化することができます。この機能は、他のデプロイメントオプションで記述されたアプリケーションがPasteDeployを使用して構築されている場合、インストゥルメンテーションに使用することができます。

AppDynamics のコンポジットファクトリの名前は、egg:appdynamics#instrument です。これにはアプリケーションから元のアプリケーションを指す「target」というパラメータと、APPD_settings へのフルパスが必要です。

PasteDeployで構築されたアプリケーションをインストゥルメント化するには

  1. AppDynamicsプロキシを手動で起動。

    pyagent proxy start
  2. PasteDeploy 構成ファイルで、既存のコンポジットの名前を一意の名前に変更します。
    たとえば、「metadata」 というアプリケーションの既存のコンポジット構成については、

    [composite:metadata]
    use = egg:Paste#urlmap
    /: meta

    以下の名前に変更。

    [composite:_orig_metadata]
    use = egg:Paste#urlmap
    /: meta


  3. 次のように、「metadata」アプリケーション用の新しいコンポジットセクションを、今名前変更した元のものの上に作成します。

    1. 名前を変更した古いアプリケーションの名前を、新しいコンポジットアプリケーションに命名します。

    2. AppDynamics コンポジットファクトリ(egg:appdynamics#instrument)を使用するように構成。

    3. ターゲットを名前変更したアプリケーションに設定。 

    4. AppDynamics 構成ファイルの環境変数 APPD_CONFIG_FILE を、ご使用の構成ファイルへのパスに設定。 {{2}}は特定の属性を識別し、 {{3}} はこの属性に割り当てる新規の値を指定します。

      [composite:metadata]
      use = egg:appdynamics#instrument
      target = orig_metadata
      APPD_CONFIG_FILE = /etc/appdynamics.cfg

      その他のAPPD_ 構成変数を設定することも可能。例:APPD_LOGS_DIR=/var/log/appdynamics

  4. アプリケーションを再起動。