このトピックでは、Dify アプリケーションを ARMS アプリケーションモニタリングと統合する方法を概説します。
コンポーネントの概要
ワークフローアプリケーション (LLM アプリケーション): Dify のビジュアルインターフェースで構築する大規模言語モデル (LLM) アプリケーションです。通常、ワークフローまたはチャットボットです。アプリケーションのロジック、プロンプト、モデル選択、変数処理、条件分岐、ツール呼び出しを定義します。
dify-api (実行エンジン API): Dify のコアバックエンドサービスです。フロントエンドのリクエストを受信し、ユーザーとアプリケーションのデータを管理し、ワークフローの実行をスケジュールし、LLM を呼び出し、プラグイン呼び出しを調整し、最終結果を返します。
dify-plugin-daemon (プラグインエンジン): Dify のプラグインエンジンで、ユーザー定義または公式のプラグインを安全で隔離された環境で実行するために使用します。
nginx (イングレスゲートウェイ): トラフィックをルーティングする Dify のイングレスゲートウェイです。
Dify のコンポーネントは急速に進化しており、監視方法はバージョンによって異なります。次の表は、各バージョンのコンポーネントの統合方法をまとめたものです。
バージョン | ワークフローの統合 | dify-api の統合 | dify-plugin-daemon の統合 | Nginx の統合 |
1.6.0 より前 | ARMS Python エージェントを使用します。(dify-api コンポーネントとエージェントを統合します) | ARMS Python エージェントを使用します。 | ARMS Golang エージェントを使用します。 | OpenTelemetry を使用します。 |
1.6.0 以降、1.11.2 より前 | Dify アプリケーションの可観測性統合機能を使用してデータをレポートします。 | ARMS Python エージェントを使用します。 | ARMS Golang エージェントを使用します。 | OpenTelemetry を使用します。 |
1.11.2 以降 | ARMS Python エージェントを使用します。(dify-api コンポーネントとエージェントを統合します。新しいバージョンにはこの機能が組み込まれています) | ARMS Python エージェントを使用します。 | ARMS Golang エージェントを使用します。 | OpenTelemetry を使用します。 |
1.13.0 以降 | Dify 向け OTel の設定をご参照のうえ、dify-worker コンポーネントで対応する環境変数を設定します。OTel エンドポイントを取得するには、「前提条件」をご参照ください。 | ARMS Python エージェントを使用します。 | ARMS Golang エージェントを使用します。 |
Container Service for Kubernetes (ACK) の ack-dify コンポーネントを通じて Dify を使用する場合は、Helm チャートを更新することでワンクリックで統合できます。ACK クラスターの [Applications] ページで ack-dify コンポーネントを更新できます。
Helm チャートの [リリースを更新] パネルで、対象バージョンのパラメーター設定 (Values) にある arms 設定セクションを見つけ、enabled を true に設定します。
または、ack-dify コンポーネントの作成時に関連する設定を行うことで、ARMS アプリケーションモニタリングを有効にすることもできます。
パラメーター設定の YAML エディターで、arms 設定セクションの enabled を true に設定します。
前提条件
ack-onepilot バージョン 5.1.2 以降
Python エージェントバージョン 2.2.0 以降
操作手順
ステップ 1: dify-api コンポーネントの統合
Dify API のデプロイメントタイプに基づいて、次のいずれかの統合方法を選択します。
Kubernetes コンテナの自動統合 (推奨): 詳細については、「ack-onepilot を使用した ACK クラスター内のアプリケーション向け Python エージェントのインストール」をご参照ください。dify-api の Deployment に次のラベルを追加します。
labels: apsara.apm/application-type: Dify aliyun.com/app-language: python armsPilotAutoEnable: 'on' armsPilotCreateAppName: "deployment-name" # ARMS でのアプリケーションの表示名。entrypoint.sh 起動スクリプトを取得し、次の変更を行います。
起動スクリプトの先頭に次のコマンドを追加して、競合するプラグインをアンインストールし、Python エージェントをインストールします。
python3 -m ensurepip --upgrade # 競合する OTel プラグインをアンインストール pip3 uninstall -y opentelemetry-instrumentation-celery \ opentelemetry-instrumentation-flask \ opentelemetry-instrumentation-redis \ opentelemetry-instrumentation-requests \ opentelemetry-instrumentation-logging \ opentelemetry-instrumentation-wsgi \ opentelemetry-instrumentation-fastapi \ opentelemetry-instrumentation-asgi \ opentelemetry-instrumentation-sqlalchemy # Python エージェントをインストール pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && pip3 config set install.trusted-host mirrors.aliyun.com pip3 install aliyun-bootstrap && aliyun-bootstrap -a installスクリプトの末尾に
aliyun-instrument起動コマンドを追加します。# aliyun-instrument で起動 exec aliyun-instrument gunicorn \ --bind "${DIFY_BIND_ADDRESS:-0.0.0.0}:${DIFY_PORT:-5001}" \ --workers ${SERVER_WORKER_AMOUNT:-1} \ --worker-class ${SERVER_WORKER_CLASS:-gevent} \ --worker-connections ${SERVER_WORKER_CONNECTIONS:-10} \ --timeout ${GUNICORN_TIMEOUT:-200} \ app:app
環境変数を設定します。
パラメータ
値の例
説明
GEVENT_ENABLE
true
Dify は gevent を使用します。この変数は true に設定する必要があります。
ARMS_APP_NAME
dify-api
アプリケーション名。
ARMS_REGION_ID
cn-heyuan
リージョン。対象のリージョンに変更してください。
ARMS_LICENSE_KEY
xxx
ライセンスキー。
APSARA_APM_APP_TYPE
microservice
アプリケーションをマイクロサービスとして識別します。
2. dify-api コンポーネントの監視データを表示します。アプリケーションリストで、dify-api アプリケーションを確認できます。
トレースには、アップストリームおよびダウンストリームの呼び出しが表示されます。
ステップ 2: Dify ワークフローアプリケーションの統合
Dify API: 1.6.0 ~ 1.11.2
単一アプリケーションの統合: Dify アプリケーションの可観測性統合を参照して、Dify アプリケーションを設定します。
アプリケーションの一括統合: 「Dify LLM アプリケーションモニタリングの一括統合」をご参照ください。
Dify API: 1.6.0 より前、または 1.11.2 以降
Dify ワークフローアプリケーションには追加の設定は必要ありません。前のステップで説明したように dify-api コンポーネントを統合すると、ワークフローからのトレースデータが自動的にレポートされ、関連付けられます。
Dify API: 1.13.0 以降
Dify 向け OTel の設定をご参照のうえ、dify-worker コンポーネントで対応する環境変数を設定します。OTel エンドポイントを取得するには、「前提条件」をご参照ください。
ワークフローアプリケーションの監視データの表示
アプリケーション詳細の例:
アプリケーション詳細ページには、[概要]、[パフォーマンス分析]、[トークン分析]、[LLM オペレーション]、[提供サービス]、[依存サービス]、[トレース分析]、[例外分析]、[セッション分析] などのタブがあります。[概要] ページには、次のモニタリングメトリックが表示されます。
統計カード: [モデル呼び出し数]、[トークン使用量]、[トレース数]、[スパン数]、[セッション数]、[ユーザー数] (前日比の変動を含む)
TASK、TOOL、CHAIN、LLM、RETRIEVER タイプを含む[操作タイプの分布]の円グラフ
[リクエストあたりの平均 LLM 呼び出し] と [リクエスト数の推移] の折れ線グラフ
[モデル呼び出しランキング (上位 5)] と [リクエスト数ユーザーランキング (上位 5)]
[セッション数の推移] 折れ線グラフ
トレース詳細の例: トレースは、LLM 呼び出し、リトリーバル、ツール呼び出しなどのノードに関する詳細情報を収集します。
トレース詳細ページには、左側にトレースウォーターフォールチャートが表示され、各スパンにはタイプ (TASK、TOOL、LLM、RETRIEVER)、期間、トークン数が表示されます。上部セクションには、トレース ID、合計期間、アプリケーション数、インターフェイス数、合計トークンが表示されます。スパンをクリックすると、右側の詳細パネルにスパンのメタデータ ([アプリケーション名]、[インターフェイス名]、[ホスト名]、[spanId]、開始/終了時刻など) が表示されます。LLM タイプのスパンには、入力プロンプトと出力メッセージの内容も表示されます。
ステップ 3: dify-plugin-daemon の統合
Dockerfile を変更し、イメージを再ビルドします。次の例は、local.dockerfile の変更を示しています。
FROM golang:1.23-alpine AS builder ARG VERSION=unknown # プロジェクトをコピー COPY . /app # 作業ディレクトリを設定 WORKDIR /app # ネットワークの問題がある場合は goproxy を使用 # ENV GOPROXY=https://goproxy.cn,direct # arms instgo をダウンロード RUN wget "http://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/instgo/instgo-linux-amd64" -O instgo RUN chmod 777 instgo # instgo でビルド RUN INSTGO_EXTRA_RULES="dify_python" ./instgo go build \ -ldflags "\ -X 'github.com/langgenius/dify-plugin-daemon/internal/manifest.VersionX=${VERSION}' \ -X 'github.com/langgenius/dify-plugin-daemon/internal/manifest.BuildTimeX=$(date -u +%Y-%m-%dT%H:%M:%S%z)'" \ -o /app/main cmd/server/main.go # entrypoint.sh をコピー COPY entrypoint.sh /app/entrypoint.sh RUN chmod +x /app/entrypoint.sh FROM ubuntu:24.04 WORKDIR /app # ビルド引数を確認 ARG PLATFORM=local # PLATFORM が local の場合は python3.12 をインストール RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y curl python3.12 python3.12-venv python3.12-dev python3-pip ffmpeg build-essential \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* \ && update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.12 1; # tiktoken を事前読み込み ENV TIKTOKEN_CACHE_DIR=/app/.tiktoken # 環境セットアップを高速化するため dify_plugin をインストール、uv をテストし tiktoken を事前読み込み RUN mv /usr/lib/python3.12/EXTERNALLY-MANAGED /usr/lib/python3.12/EXTERNALLY-MANAGED.bk \ && python3 -m pip install uv \ && uv pip install --system dify_plugin \ && python3 -c "from uv._find_uv import find_uv_bin;print(find_uv_bin());" \ && python3 -c "import tiktoken; encodings = ['o200k_base', 'cl100k_base', 'p50k_base', 'r50k_base', 'p50k_edit', 'gpt2']; [tiktoken.get_encoding(encoding).special_tokens_set for encoding in encodings]" ENV UV_PATH=/usr/local/bin/uv ENV PLATFORM=$PLATFORM ENV GIN_MODE=release COPY --from=builder /app/main /app/entrypoint.sh /app/ # サーバーを実行、プロセスがルートプロセスにならないように sh をエントリポイントとして使用 # リソースをリサイクルするために bash を使用 CMD ["/bin/bash", "-c", "/app/entrypoint.sh"]説明INSTGO_EXTRA_RULESオプションは、プラグインランタイムの自動モニタリングを有効にします。plugin-daemon の起動時にプラグインエージェントを起動したくない場合は、ビルドファイルからINSTGO_EXTRA_RULES="dify_python"を削除します。環境変数を設定します。
ECS 環境
パラメータ
値の例
説明
ARMS_LICENSE_KEY
xxx@xxx
ライセンスキー。
ARMS_REGION_ID
cn-heyuan
リージョン。
ARMS_ENABLE
true
エージェントを有効または無効にします。
ARMS_APP_NAME
dify-plugin-daemon
アプリケーション名。
コンテナ化された ack-onepilot 環境: dify-plugin-daemon アプリケーションの YAML 設定ファイルで、spec.template.metadata に次のラベルを追加します。
labels: aliyun.com/app-language: golang armsPilotAutoEnable: 'on' armsPilotCreateAppName: "dify-daemon-plugin"
dify-plugin-daemon をデプロイし、監視データを表示します。[Application List] ページで、dify-plugin-daemon アプリケーションに移動します。
統合が成功すると、ARMS コンソールの [アプリケーション概要] ページで以下のモニタリングデータを表示できます。
サマリーメトリックカード: [リクエスト数]、[エラー数]、[平均レイテンシー]、[インスタンス数] (前日比/前週比の増減)
時系列チャート: リクエスト数/1m、エラー数/1m、レイテンシ/1m (P99、P90、P75、平均を含む)、CPU 使用率ピーク
上位 5 ランキング: リクエスト数ランキング、エラー数ランキング、平均レイテンシランキング、インスタンス別 CPU 使用率ピークランキング
上部のナビゲーションタブには、[アプリケーション概要]、[アプリケーショントポロジー]、[提供サービス]、[依存サービス]、[トレース分析]、[インスタンスモニタリング]、[アプリケーション診断]、[シナリオ分析]、[イベント分析]、[アプリケーション設定] が含まれます。
トレース詳細:
[サービス名] フィルターで
insight-agent-plugin-daemonを選択すると、プラグイン LLM リクエストコールの完全な分散トレースを表示できます。 トレースウォーターフォールチャートには、次のような複数のスパンが表示されます。GET エントリのリクエスト
接続 (redis/sqlalchemy 接続)
SELECT dify (データベースクエリ)
/v1/sandbox/run (POST 200、サンドボックス実行、httpx/go によるマルチレイヤー呼び出し)
UPDATE dify (データベース更新)
スパン期間は 131µs から 34.95ms の範囲です。右側のスパン詳細パネルには、ホスト名、開始/終了時刻、ステータス、および
net.protocol.name=HTTP、component.name、endpoint=/plugin/tenant_id/dispatch/llm/inv...などの属性が表示されます。プラグインの監視データを表示します。エージェントがアタッチされると、plugin-daemon はプラグインランタイムのエージェントを自動的に起動します。各プラグインランタイムは、
{plugin_daemon_name}_plugin_{plugin_name}_{plugin_version}という名前の観測可能なアプリケーションに対応します。たとえば、plugin-daemon のアプリケーション名がlocal-dify-plugin-daemonで、tongyiプラグインのバージョン0.0.53がインストールされている場合、local-dify-plugin-daemon_plugin_tongyi_0.0.53という名前のアプリケーションが自動的に作成されます。
(オプション) ステップ 4: サンドボックスの監視
サンドボックスは、ワークフローから Python および Node.js コードを実行するための Dify コードサンドボックスエンジンです。Go エージェントはサンドボックスの監視をサポートしています。有効にするには、Dockerfile を変更し、イメージを再ビルドし、環境変数を設定して監視を有効にする必要があります。
Dockerfile を変更し、対応するイメージを再ビルドします。./build/build_[amd64|arm64].sh ファイルを変更します。
instgo をダウンロードするコマンドを追加します。次にサンプルコマンドを示します。他のリージョンおよびアーキテクチャのダウンロードコマンドについては、「instgo のダウンロード」をご参照ください。
wget "http://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/instgo/instgo-linux-amd64" -O instgo chmod 777 instgogo buildコマンドの前にinstgoコマンドを追加します。以下に amd64 の例を示します:rm -f internal/core/runner/python/python.so rm -f internal/core/runner/nodejs/nodejs.so rm -f /tmp/sandbox-python/python.so rm -f /tmp/sandbox-nodejs/nodejs.so wget "http://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/instgo/instgo-linux-amd64" -O instgo chmod 777 instgo echo "Building Python lib" CGO_ENABLED=1 GOOS=linux GOARCH=amd64 ./instgo go build -o internal/core/runner/python/python.so -buildmode=c-shared -ldflags="-s -w" cmd/lib/python/main.go && echo "Building Nodejs lib" && CGO_ENABLED=1 GOOS=linux GOARCH=amd64 ./instgo go build -o internal/core/runner/nodejs/nodejs.so -buildmode=c-shared -ldflags="-s -w" cmd/lib/nodejs/main.go && echo "Building main" && GOOS=linux GOARCH=amd64 ./instgo go build -o main -ldflags="-s -w" cmd/server/main.go echo "Building env" GOOS=linux GOARCH=amd64 ./instgo go build -o env -ldflags="-s -w" cmd/dependencies/init.go
環境変数を設定します。
Kubernetes コンテナによる統合: dify-plugin-daemon アプリケーションの YAML 設定ファイルで、spec.template.metadata に次のラベルを追加します。
labels: aliyun.com/app-language: golang armsPilotAutoEnable: 'on' armsPilotCreateAppName: "dify-daemon-plugin"手動統合:
パラメータ
値の例
説明
ARMS_LICENSE_KEY
xxx
ライセンスキー。
ARMS_REGION_ID
cn-heyuan
リージョン。
ARMS_ENABLE
true
エージェントを有効または無効にします。
ARMS_APP_NAME
dify-plugin-daemon
アプリケーション名。
サンドボックスの監視データをデプロイして表示します。[Application List] ページで、dify-sandbox アプリケーションに移動します。監視の詳細は次のとおりです。

トレース詳細:
このトレースの合計期間は 8.7s で、5 つのアプリケーションと 1039 のインターフェイスが関与しています。ページには [例外検出] と表示されています。コンポーネント呼び出しには、redis 575 回、sqlalchemy 337 回、httpx 14 回などが含まれます。スパンウォーターフォールチャートのコアパスには、
SELECT difyクエリと、それに続く多階層の/v1/sandbox/run呼び出し (POST httpx 35.96ms → SERVER go 28.39ms → 多階層 INTERNAL go 呼び出し) が表示されます。スパン詳細には、アプリケーション名 insight-agent-sandbox、インターフェイス/v1/sandbox/run、ホスト名sandbox-7489d68cd5-xcqv8が表示され、ステータスコードは正常です。
(オプション) ステップ 5: Nginx イングレスゲートウェイの監視
Nginx は Dify のイングレスゲートウェイとして機能します。ナレッジベース、プラグイン、またはワークフローのタイムアウトやファイルアップロードに関連する一部の問題は、Nginx の設定に関連している可能性があります。OpenTelemetry を使用した Nginx のトレースの説明に従って、OpenTelemetry を使用してデータをレポートします。
設定
入出力コンテンツの収集
デフォルト: True。
無効にした場合の効果: ユーザーがクエリを送信すると、エージェントはモデル、ツール、ナレッジベースの入力や出力などのフィールドのサイズのみを収集し、これらのフィールドのコンテンツは収集しません。
設定: 環境変数 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=False を設定します。
LLM アプリケーションの分割
デフォルト: False。
有効にした場合の効果: 報告されるデータは LLM サブアプリケーションに分割されます。Dify ワークフロー、エージェント、チャットアプリなどの各 LLM アプリケーションは、個別の ARMS アプリケーションに対応します。
設定: 環境変数 PROFILER_GENAI_SPLITAPP_ENABLE=True を設定します。
サポートされているリージョン: 中国 (河源) およびシンガポール。
メッセージコンテンツの長さ制限
デフォルト: 4 K 文字。
有効にした場合の効果: 入力/出力メッセージフィールドなど、各 LLM メッセージコンテンツの長さを制限します。エージェントは、指定された文字長を超えるメッセージコンテンツを切り捨てます。
サポートされているプラグイン: この設定は Dify および LangChain にのみ適用されます。
設定: エージェントバージョンが 1.8.3 以降の場合は、環境変数 OTEL_INSTRUMENTATION_GENAI_MESSAGE_CONTENT_MAX_LENGTH=<integer_value> を設定します。<integer_value> を最大文字数を指定する整数に置き換えます。
スパン属性値の長さ制限
デフォルト: 制限なし。
有効にした場合の効果: gen_ai.agent.description など、報告されるスパン属性値の長さを制限します。エージェントは、指定された文字長を超える属性値を切り捨てます。
サポートされているプラグイン: この設定は、LangChain、DashScope、Dify など、OpenTelemetry をサポートするすべてのプラグインに適用されます。
設定: 環境変数 OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT=<integer_value> を設定します。<integer_value> を、最大文字数を指定する整数に置き換えます。