Pythonエージェント設定
Python エージェントの動作設定は、構成ファイルを使用するか、アプリケーション環境内に環境変数を設定して構成します。このページでは、Python エージェントの設定を示します。
構成ファイルについては、「エージェントの構成」を参照してください。
[instrumentation]
| ディレクティブ | 説明 | 例 | デフォルト | 環境変数 |
|---|---|---|---|---|
enable-openai | OpenAI インストゥルメンテーションを有効または無効にします。 | true または false | false | APPDYNAMICS_ENABLE_OPENAI |
enable-bedrock | AWS Bedrock インストゥルメンテーションを有効または無効にします。 | true または false | false | APPDYNAMICS_ENABLE_BEDROCK |
enable-langchain | LangChain インストゥルメンテーションを有効または無効にします。 | true または false | false | APPDYNAMICS_ENABLE_LANGCHAIN |
enable-genai-data-capture | スナップショット exit コールの詳細で、OpenAI および Vecotrostore の要求と応答をキャプチャすることを有効または無効にします。 | true または false | false | ENABLE_GENAI_DATA_CAPTURE |
[agent]
| ディレクティブ | 説明 | 例 | デフォルト | 環境変数 |
|---|---|---|---|---|
app |
アプリケーション名 | MyApp |
必須 | APPDYNAMICS_AGENT_APPLICATION_NAME |
tier |
ティア名 | web-fe |
必須 | APPDYNAMICS_AGENT_TIER_NAME |
node |
ノード名 | web-fe1 |
必須 | APPDYNAMICS_AGENT_NODE_NAME |
dir |
AppDynamicsエージェントに関するファイルのベースディレクトリ | /mysite/appd/agent/python/ |
/tmp/appd/ |
APPDYNAMICS_AGENT_BASE_DIR |
nodereuse |
ノード名を再利用 | true または false |
オプション | APPDYNAMICS_AGENT_REUSE_NODE_NAME |
nodereuseprefix |
ノード名プレフィックスを再利用 | My Node Name |
オプション | APPDYNAMICS_AGENT_REUSE_NODE_NAME_PREFIX |
uniquehostid |
アプリケーション エージェントの一意のホスト ID | オプション | APPDYNAMICS_AGENT_UNIQUE_HOST_ID |
[agent:proxy]
| ディレクティブ | 説明 | 例 | デフォルト |
|---|---|---|---|
curve-enabled |
APPDYNAMICS_CURVE_ENABLED |
オン | オフ |
curve-zap-enabled |
APPDYNAMICS_CURVE_ZAP_ENABLED |
オン | オフ |
curve-public-dir |
APPDYNAMICS_CURVE_PUBLIC_KEY_DIR |
/tmp/certificates | /tmp/appd/certs/public |
curve-secret-dir |
APPDYNAMICS_CURVE_SECRET_KEY_DIR |
/tmp/secret-certificates | /tmp/appd/certs/secret |
curve-agent-public-file |
APPDYNAMICS_CURVE_AGENT_PUBLIC_KEY_FILE |
/tmp/certs/agent.key | /tmp/appd/certs/public/<node_name>.key |
curve-agent-secret-file |
APPDYNAMICS_CURVE_AGENT_SECRET_KEY_FILE |
/tmp/certs/agent.key_secret | /tmp/appd/certs/secret/<node_name>.key_secret |
curve-proxy-public-file |
APPDYNAMICS_CURVE_PROXY_PUBLIC_KEY_FILE |
/tmp/certs/proxy.key | /tmp/appd/certs/public/proxy.key |
curve-proxy-secret-file |
APPDYNAMICS_CURVE_PROXY_SECRET_KEY_FILE |
/tmp/certs/proxy.key_secret | /tmp/appd/certs/secret/proxy.key_secret |
[wsgi]
| ディレクティブ | 説明 | 例 | デフォルト | 環境変数 |
|---|---|---|---|---|
script |
WSGIスクリプトファイルへのパス | /var/www/acme/bookstore.py |
n/a | APPDYNAMICS_WSGI_SCRIPT_ALIAS |
callable |
スクリプト/モジュールで呼出可能なWSGIの名前 | app |
application |
APPDYNAMICS_WSGI_CALLABLE_OBJECT |
module |
アプリケーションモジュールの完全修飾名 | acme.bookstore:app |
n/a | APPDYNAMICS_WSGI_MODULE |
script および module ディレクティブが両方とも指定されている場合は、module ディレクティブが優先されます。
module 値は、モジュールの完全修飾名や、その後にモジュールで呼び出しできる WSGI の名前をコロンでつなげたものにすることが可能です。後者の形式では、module ディレクティブが callable ディレクティブよりも優先されます。
module ディレクティブの詳細形式と callable ディレクティブでは両方ともシンボル名またはシンボル名の後に空の括弧ペアを付けたものを指定できます。後者の形式では、callable はディレクティブで指定した callable をコールした結果と解釈されます。この後者の形式は、Django で使用できます。例:
module = django.core.handlers.wsgi:WSGIHandler()
[log]
| ディレクティブ | 説明 | 例 | デフォルト | 環境変数 |
|---|---|---|---|---|
dir |
プロキシとエージェントのログを書き込むディレクトリ | /var/log/appdynamics |
/tmp/appd/logs |
APPDYNAMICS_LOGS_DIR |
level |
ログを記録するレベル(warning、info、または debug のいずれか) | debug |
warning |
APPDYNAMICS_LOGGING_LEVEL |
debugging |
Onの場合にDEBUGレベルのログをstderrとログファイルに書き込む | on |
off |
APPDYNAMICS_DEBUG_LOG |
[tags]
タグとは、アプリケーション、階層、ノードなどのエンティティに関連付けられている、キーと値のペアです。これらのタグは、コントローラ UI でアプリケーションリソースを見つけるために役立つメタデータとして機能します。適切なカスタムタグを使用してエンティティに関連する問題にタグ付けすることで、エンティティに関連する問題の平均検出時間(MTTD)を短縮できます。コントローラにタグをインポートする方法については、「カスタムタグ API」を参照してください。
Python エージェントの構成時にカスタムタグを定義できます。「エージェントの構成」を参照してください。これらのタグはコントローラ UI に送信され、タグベースのフィルタリングとタグベースの列を使用してデータをフィルタリングするのに役立ちます。タグ付け設定を変更した場合は、エージェントを再起動する必要があります。
例:
[tags]
tag1 = value1
tag2 = value2
tag3 = value3
[controller]
このセクションでは、AppDynamics コントローラの構成について説明します。
| ディレクティブ | 説明 | 例 | デフォルト | 環境変数 |
|---|---|---|---|---|
host |
コントローラホスト | mycontroller.example.org |
必須 | APPDYNAMICS_CONTROLLER_HOST_NAME |
port |
コントローラポート | 9000 |
8090(HTTP オンプレミス) HTTPS では 443、この場合 SSL の設定が必要 |
APPDYNAMICS_CONTROLLER_PORT |
| ssl | コントローラと通信する場合に SSL を使用するかどうか、on または off |
on |
off |
APPDYNAMICS_CONTROLLER_SSL_ENABLED |
account |
AppDynamics コントローラのアカウント | user1 |
シングルテナント コントローラのデフォルトは customer1。 |
APPDYNAMICS_AGENT_ACCOUNT_NAME |
accesskey |
AppDynamics コントローラ アカウント アクセス キー | XC6v2n8m2$543 |
必須。アカウント名とアクセスキーを調べるには、AppDynamics UI の右上隅にある |
APPDYNAMICS_AGENT_ACCOUNT_ACCESS_KEY |
certfile |
コントローラ証明書 注:
|
/tmp/ssl/cacerts | オプション | APPDYNAMICS_CONTROLLER_SSL_CERTFILE |
[controller:http-proxy]
HTTP プロキシを使用してコントローラと通信する必要がある場合は、このセクションを使用して HTTP プロキシを設定します。
| ディレクティブ | 説明 | 例 | デフォルト | 環境変数 |
|---|---|---|---|---|
host |
HTTPプロキシホスト | proxy.example.org |
n/a | APPDYNAMICS_HTTP_PROXY_HOST |
port |
HTTPプロキシポート | 8090 |
80 |
APPDYNAMICS_HTTP_PROXY_PORT |
user |
HTTPプロキシユーザー | proxyuser |
n/a | APPDYNAMICS_HTTP_PROXY_USER |
password-file |
HTTPプロキシパスワードファイル | /etc/http-proxy.passwd |
n/a | APPDYNAMICS_HTTP_PROXY_PASSWORD_FILE |
[proxy]
| ディレクティブ | 説明 | 例 | デフォルト | 環境変数 |
|---|---|---|---|---|
max-heap-size |
プロキシの最大ヒープサイズ | 450 m | 300 m | APPDYNAMICS_MAX_HEAP_SIZE |
min-heap-size |
プロキシの最小ヒープサイズ | 100 m | 50 m | APPDYNAMICS_MIN_HEAP_SIZE |
max-perm-size |
最大永続世代サイズ | 150 m | 120 m | APPDYNAMICS_MAX_PERM_SIZE |
proxy-debug-port |
Java デバッガを接続するポート番号 | 8092 | なし | APPDYNAMICS_PROXY_DEBUG_PORT |
start-suspended |
Java デバッガでプロキシの起動をデバッグするかどうかを指定します。 | オン | オフ | APPDYNAMICS_START_SUSPENDED |
debug-opt |
デバッグのデバッグオプションを指定します。 | -agentlib:jdwp = transport = dt_ソケット、サーバ= y、suspend = n、 address = 8090 | なし | APPDYNAMICS_DEBUG_OPT |
agent |
エージェントタイプを指定します(PYTHON_APP_AGENT、NODEJS_APP_AGENT など)。 | NODEJS_APP_AGENT | PYTHON_AGENT | APPDYNAMICS_AGENT_TYPE |
tcp-comm-host |
エージェントとプロキシの TCP 通信が行われるホスト | 127.0.0.1 | デフォルト | APPDYNAMICS_TCP_COMM_HOST |
tcp-comm-port |
エージェントとプロキシ間の最初の通信要求が発生するポート | 8080 | なし | APPDYNAMICS_TCP_COMM_PORT |
tcp-reporting-port |
レポートの転送用ポート(エージェント専用プロパティ) | 10010 | なし | APPDYNAMICS_TCP_REPORTING_PORT |
tcp-request-port |
要求および設定の転送用ポート(エージェント専用プロパティ) | 10011 | なし | APPDYNAMICS_TCP_REQUEST_PORT |
tcp-port-range |
エージェントに要求およびレポートポートを割り当てるポート範囲(プロキシ専用プロパティ) | 10000 〜 10100 | なし | APPDYNAMICS_TCP_PORT_RANGE |
use_installed_jre |
マシンにインストールされているカスタム JRE を使用してプロキシを実行します。詳細は、runAgentJREJRE を使用したエージェントの実行 を参照してください。 | True |
なし |
APPDYNAMICS_USE_INSTALLED_JRE |
installed_jre_path |
プロキシを実行するためにインストールされた JRE のパス。 注: Python エージェントが最初に installed_jre_path をチェックします。設定されていない場合、Python エージェントは JAVA_HOME をチェックします。 |
/usr/lib/jvm/java-17-openjdk |
なし | APPDYNAMICS_INSTALLED_JRE_PATH |
tls-version |
TLS バージョン 1.2 および 1.3 をサポートします。 | TLSv1.3 |
TLSv1.2 |
APPDYNAMICS_TLS_VERSION |
[eum]
| ディレクティブ | 説明 | 例 | デフォルト | 環境変数 |
|---|---|---|---|---|
disable-cookie |
設定すると、エージェントが UEM 相関データを WSGI レスポンスヘッダーに追加しません。 | on |
off |
APPDYNAMICS_EUM_DISABLE_COOKIE |
user-agent-allowlist |
指定すると、EUM 相関データヘッダーとして追加されたユーザーエージェントのデフォルト許可リストを上書きします。代替ユーザーエージェントをカンマ区切りリストとして指定するには、この設定を使用します。すべてのユーザエージェントを許可するには、「*」を使用します。 | 'iPad, Android' |
'Mozilla, Opera, WebKit, Nokia' |
APPDYNAMICS_EUM_USER_AGENT_ALLOWLIST |
[services:snapshot]
| ディレクティブ | 説明 | 例 | デフォルト | 環境変数 |
|---|---|---|---|---|
exit-call-details-length |
トランザクションスナップショットの exit コールを記述する詳細文字列の文字数を指定。 | 200 |
100 |
APPDYNAMICS_EXIT_CALL_DETAILS_LENGTH |
[services:transaction-monitor]
| ディレクティブ | 説明 | 例 | デフォルト | 環境変数 |
|---|---|---|---|---|
bt-max-duration-ms |
ビジネストランザクションの最長時間(ミリ秒単位) | 60000 |
120000 |
APPDYNAMICS_BT_MAX_DURATION_MS |
[services:analytics]
| ディレクティブ | 説明 | 例 | デフォルト | 環境変数 |
|---|---|---|---|---|
host |
分析エージェントのホスト |
|
localhost | APPDYNAMICS_ANALYTICS_HOSTNAME |
port |
分析エージェントのポート | 9000 |
9090 |
APPDYNAMICS_ANALYTICS_PORT |
ssl |
分析エージェントとの SSL 通信を有効にするには、[on] に設定します。 | on |
off |
APPDYNAMICS_ANALYTICS_SSL_ENABLED |
ca-file |
分析エージェントの証明書に署名した CA の証明書。 注: 証明書ファイルは .pem にする必要があります。中間認証局がある場合は、ルート認証局の代わりに信頼チェーンのパスを指定します。
|
/tmp/certs/ca-cert.pem | optional |
APPDYNAMICS_ANALYTICS_CAFILE |
Python エージェントのノード再利用
ノード名を再利用
AppDynamics でノード名を再利用するには、nodereuse プロパティを true に設定する必要があります。このプロパティを true に設定する場合、ノード名を指定する必要はありませんが、nodereuseprefix を使用してノード名のプレフィックスを指定する必要があります。
このプロパティは、寿命が短い VM(仮想マシン)が多数ある環境のモニタリングに役立ちます。true に設定すると、AppDynamics は新しい VM の過去の VM のノード名を再利用します。これにより、本質的には同一プロセスのノードが異なる時間で実行される場合に、AppDynamics 内で別の名前が付いたノードが時間の経過とともに急増するのを回避できます。
AppDynamics はノード名をアプリケーション、階層、シーケンス番号を使い生成し、ノード名をプールします。たとえば、ノードがパージされる(ノードの存続期間に基づく)と、シーケンス番号が再利用されます。
System Property:nodereuse
Type:ブール型
Default:False
Required: なし
ノード名プレフィックスを再利用
ノード名を再利用するようにエージェントを構成する際に、このプロパティを使用し、コントローラがノード名を動的に生成するのに使用するプレフィックスを指定します。
System Property:nodereuseprefix
Type:文字列
Default: なし
Required:nodereuse=true の場合
以下の構成では、コントローラは「reportGen」というプレフィックスのあるノード名を生成します。並列で実行しているノードの数に応じて、ノード名には、-1 や -2 などのサフィックスが付きます。シャットダウンされ履歴ノードと見なされるノードの名前は、新しいノードにより再利用される場合があります。
nodereuse=true nodereuseprefix=reportGenTCP モードの設定
デフォルトでは、Python エージェントと Java プロキシはプロセス間通信(IPC)を使用して相互に通信します。
ただし、Transmission Control Protocol(TCP)通信を使用すると、次のような状況で役立ちます。
- Java プロキシと Python エージェントを異なるホスト オペレーティング システムで実行する場合。
- コンテナ内(Docker や Kubernetes など)。すべてのコンテナに同じ容量を搭載できますが、推奨されません。
TCP 通信を有効にするには、-tcp-comm-port を有効なポートに設定します。また、-tcp-port-range を有効なポート範囲(3000 ~ 3005)に設定します。PHP エージェントと Java プロキシは、TCP を使用して通信できるようになりました。
Java プロキシは、APPDYNAMICS_TCP_COMM_PORT を介してエージェントからの着信接続要求をリッスンします。各エージェントの通信は、次の 2 つの一意のポートを介して行われます。
- レポートポート
- リクエストポート
これらのポートは、エージェントまたはプロキシによって設定できます。
TCP モードの設定:環境変数
環境変数の ファイルバージョンについては、「Pythonエージェント設定Python エージェントの設定」を参照してください。
次の表に、TCP モード設定の環境変数を示します。
| 環境変数名 | 説明 |
|---|---|
|
APPDYNAMICS_TCP_COMM_HOST |
|
APPDYNAMICS_TCP_COMM_PORT |
|
APPDYNAMICS_TCP_PORT_RANGE (Proxy only) |
プロキシがエージェントと通信するためにポートを割り当てるポート範囲。 |
APPDYNAMICS_TCP_REPORTING_PORT (Agent only) |
|
APPDYNAMICS_TCP_REQUEST_PORT (Agent only) |
|
Kubernetes での共有プロキシを使用した Python エージェントの展開
このページでは、Kubernetes で共有 Java プロキシを使用して Python エージェントを展開する方法について説明します。次のいずれかの方法を使用して、共有 Java プロキシを展開できます。
プロキシとエージェント間の通信のために、プロキシサービスで連続したポート範囲を公開します。
プロキシポッドを を設定して静的ポッドとして実行します。
- Python エージェントを使用して実行するアプリケーションは、ポッドで実行する必要があります。Python エージェントポッドはスケーリングができます。
- 現在、このデプロイメントではプロキシごとに最大 5 つの Python エージェントがサポートされます。
- プロキシは単一の独立したポッドとして実行され、サービスを介して Python エージェントに公開されます。プロキシポッドをスケーリングまたは複製しないでください。
暗号化通信に使用する CurveZMQ の設定
デフォルトでは、Java プロキシと Python エージェント間の通信は暗号化されません。このページでは、Java プロキシと Python エージェント間の通信を設定し、CurveZMQ を使用して暗号化および認証する方法について説明します。CurveZMQ は、ZeroMQ の認証および暗号化プロトコルです。
CurveZMQ を設定するには、次の手順を実行します。
証明書の生成
曲線暗号化を有効にすると、Python エージェントと Java プロキシは自動的に CurveZMQ 証明書を生成します。CurveZMQ は、証明書を使用して Python エージェントと Java プロキシ間の通信を暗号化および認証します。証明書を手動で生成するには、次の Python スクリプトを使用します。
import appdynamics.agent
import appdynamics_bindeps.zmq.auth
# This creates a <cert_name>.key and <cert_name>.key_secret in the <certs_directory>
# public_file and secret_file will be set to the public keyfile name and secret keyfile name respectively
public_file, secret_file = appdynamics_bindeps.zmq.auth.create_certificates(certs_directory, cert_name)これらの環境変数が正しい CurveZMQ 証明書を指していることを確認する必要があります。
-
APPDYNAMICS_CURVE_AGENT_PUBLIC_KEY_FILE -
APPDYNAMICS_CURVE_AGENT_SECRET_KEY_FILE -
APPDYNAMICS_CURVE_PROXY_PUBLIC_KEY_FILE -
APPDYNAMICS_CURVE_PROXY_SECRET_KEY_FILE
「曲線環境変数」の表を参照してください。
曲線暗号化の有効化
Java プロキシと Python エージェント間の通信を有効にして暗号化するには、APPDYNAMICS_CURVE_ENABLED 変数を Yes に設定します。
曲線認証の有効化
曲線認証(ZAP または ZeroMQ 認証プロトコル)を有効にする前に、次を確認します。
- Python エージェントの公開キー(プロキシに接続)と Java プロキシの公開キーがディレクトリにある。
- Java プロキシがディレクトリにアクセスできるか、ディレクトリが Java プロキシコンテナ内にある。
APPDYNAMICS_CURVE_PUBLIC_KEY_DIR環境変数がそのディレクトリを指している。
曲線認証を有効にするには、APPDYNAMICS_CURVE_ZAP_ENABLED True に設定します。
エージェントの公開キーが APPDYNAMICS_CURVE_PUBLIC_KEY_DIR で使用可能な場合、プロキシでエージェントを認証します。
曲線環境変数
次の表で、使用可能な曲線環境変数について説明します。
| 環境変数 | 説明 |
|---|---|
|
APPDYNAMICS_CURVE_ENABLED |
曲線を有効にするかどうかを設定します。 |
|
APPDYNAMICS_CURVE_ZAP_ENABLED |
Curve ZAP(認証)を有効にするかどうかを設定します。 |
|
APPDYNAMICS_CURVE_PUBLIC_KEY_DIR |
曲線のパブリック証明書の場所。 |
|
APPDYNAMICS_CURVE_SECRET_KEY_DIR |
曲線の秘密証明書の場所。 |
|
APPDYNAMICS_CURVE_AGENT_PUBLIC_KEY_FILE |
エージェントの曲線公開キーファイル。 ファイルが存在しない場合、エージェントはファイルの作成を試行します。 |
|
APPDYNAMICS_CURVE_AGENT_SECRET_KEY_FILE |
エージェントの曲線秘密キーファイル。 ファイルが存在しない場合、エージェントはファイルの作成を試行します。 |
|
APPDYNAMICS_CURVE_PROXY_PUBLIC_KEY_FILE |
プロキシの曲線公開キーファイル。 ファイルが存在しない場合、プロキシはファイルの作成を試行します。 |
|
APPDYNAMICS_CURVE_PROXY_SECRET_KEY_FILE |
プロキシの曲線秘密キーファイル。 ファイルが存在しない場合、プロキシはファイルの作成を試行します。 |
Python エージェントのバックエンド解決
バックエンド解決は、(アイデンティティを介した)バックエンドのノードまたは階層への関連付けです。
問題
フローマップを生成する従来の方法では、exit コールの実行時にダウンストリーム層に直接接続されたアップストリーム層がコントローラ UI に表示されます。サービスプロキシがそれらの階層間に存在する場合、コントローラはサービスプロキシをバックエンドとして識別できません。
バックエンドコンポーネントを正確に識別しないと、システムにより、サービスプロキシがルーティングする可能性があるターゲットダウンストリーム層のいずれかとの単一のバックエンドの関連付けが定期的に変更されます。これにより、誤ったメトリックを持つ不正なフローマップが作成されます。
解決策
サービスプロキシはバックエンドとしてマークされ、フローマップに表示されます。このサービスプロキシにより、アップストリーム層からダウンストリーム層への要求が正確に表示されます。メトリックは正確に報告され、階層間で集計されて表示されます。
たとえば、コントローラが 192.168.1.9 という名前のバックエンドをサービスプロキシとして識別し、そのプロキシが restTier21 と restTier22 に 15 コール/分のレートでリクエストをルーティングしている場合、フローマップはメトリック(コール/分)を restTier21(8 コール/分)~ restTier22(7 コール/分)の間で正確に配布します。ダウンストリームメトリックを 15 コール/分までまとめて追加します。これは、アップストリームメトリックと同じ値です。
サービスプロキシがバックエンドとしてマークされると、再解決は停止します。
Python エージェントのバックエンド解決の仕組み
backend.detect.loadbalancer.enabledbackend.detect.urimisconfig.enabled が true の場合、バックエンド解決は機能します。
コントローラがバックエンド解決のためにサービスプロキシを識別すると、Python エージェントはサービスプロキシが検出されたという情報を取得し、適切なメトリックをコントローラに送信します。これが設計どおりに機能するには、アップストリーム エージェントのバージョンもサービスプロキシ機能をサポートしている必要があります。エージェントがアップグレードされていない場合、サービスプロキシは検出されず、このバックエンドは通常のバックエンドに戻り、コントローラは以前の動作に戻ります。
そのため、互換性のあるエージェントをバックエンド解決で使用することをお勧めします。
サービスプロキシの有効化
サービスプロキシの検出は、コントローラで backend.detect.loadbalancer.enabled backend.detect.urimisconfig.enabled を設定すると有効になります(「サービスプロキシの概要」を参照)。