本文介紹將Dify應用接入ARMS應用監控的操作流程。
組件介紹
workflow 應用(LLM 應用):使用者通過 Dify 可視化介面構建的 LLM 應用本身,通常以工作流程(Workflow) 或對話應用(Chatbot) 的形式存在。它定義了應用的邏輯流程、提示詞(Prompt)、模型選擇、變數處理、條件分支、工具調用等。
dify-api(執行引擎 API):Dify 的核心後端服務,負責接收前端請求、系統管理使用者/應用資料、調度工作流程執行、調用大模型、協調外掛程式調用,並返回最終結果。
dify-plugin-daemon(外掛程式引擎):Dify的外掛程式引擎,用於安全、隔離地執行使用者自訂或官方提供的外掛程式(Plugin)。
nginx(入口網關):Dify的入口網關,用來進行流量的分發。
由於Dify組件本身迭代的速度非常快,對不同版本下的Dify進行監控的方式也會有所不同,以上組件在各個版本下的接入方式如下表所示:
版本 | workflow接入方式 | dify-api接入方式 | dify-plugin-daemon接入方式 | nginx接入方式 |
低於1.6.0 | 通過ARMS Python探針方式接入(dify-api組件接入Python探針即可)。 | 通過ARMS Python探針方式接入。 | 通過ARMS Golang探針方式接入。 | 通過可觀測鏈路OpenTelemetry版接入 |
不低於1.6.0,低於1.11.2 | 在Dify中通過Dify應用可觀測接入功能進行上報。 | 通過ARMS Python探針方式接入。 | 通過ARMS Golang探針方式接入。 | 通過可觀測鏈路OpenTelemetry版接入 |
不低於1.11.2 | 通過ARMS Python探針方式接入(dify-api組件接入Python探針即可,高版本預設整合了相關能力)。 | 通過ARMS Python探針方式接入。 | 通過ARMS Golang探針方式接入。 | 通過可觀測鏈路OpenTelemetry版接入 |
大於等於1.13.0 | 請參考Dify配置OTel,在dify-worker組件上配置對應的環境變數,OTel存取點的擷取可以參考準備工作。 | 通過ARMS Python探針方式接入。 | 通過ARMS Golang探針方式接入。 |
如果您是通過ACK的ack-dify組件來使用Dify,建議您直接通過更新Helm的方式進行一鍵接入,您可以在ACK叢集的應用頁面對ack-dify組件進行更新:
在 Helm Chart 更新發布面板中,在目標版本的參數配置(Values)中找到 arms 配置段,將 enabled 設定為 true。
或者在建立ack-dify組件時進行相關配置,以開啟ARMS應用監控的相關能力:
在參數配置的 YAML 編輯器中,將 arms 配置段下的 enabled 設定為 true。
前提條件
ack-onepilot 版本 >= 5.1.2
Python探針版本 >= 2.2.0
接入步驟
步驟一:Dify API管控組件接入
根據Dify API的部署類型,選擇如下兩種接入方法之一:
K8s容器自動接入(推薦):請參考Container Service ACK 和容器計算服務 ACS 通過 ack-onepilot 組件安裝 Python 探針 為Dify API的Deployment添加如下label:
labels: apsara.apm/application-type: Dify aliyun.com/app-language: python # Python應用必填,標明此應用是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.compip3 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
License Key。
APSARA_APM_APP_TYPE
microservice
將應用標識為微服務應用。
2. 查看Dify API組件監控資料,進入應用監控列表可以看到 dify-api 應用。
步驟二:Dify工作流程應用接入
1.6.0 < dify-api組件版本 < 1.11.2
單個應用接入:請參考 Dify應用可觀測接入 在對應的Dify應用進行相應的配置。
批量應用接入:請參考 Dify 大模型應用監控批量接入 進行批量接入。
dify-api組件版本 <= 1.6.0或組件版本 >= 1.11.2
此時Dify工作流程應用的接入並不需要額外進行配置,只要按上一步驟接入了dify-api組件,工作流程產生的鏈路資料會自動上報並關聯。
dify-api組件版本 >= 1.13.0
請參考Dify配置OTel,在dify-worker組件上配置對應的環境變數,OTel存取點的擷取可以參考準備工作。
查看workflow應用監控資料
應用詳情樣本:
應用詳情頁頂部提供概覽、效能分析、Token 分析、LLM 操作、提供服務、依賴服務、調用鏈分析、異常分析、會話分析等 Tab 頁簽。概覽頁展示以下監控指標:
統計卡片:模型調用次數、Token 使用、Trace 數、Span 數、會話數、使用者數及日同比變化
操作類型分布餅圖,包含 TASK、TOOL、CHAIN、LLM、RETRIEVER 等類型
Avg LLM call per request 和 Request 數趨勢折線圖
模型調用排行(Top5)和Request 數使用者排行(Top5)
會話數趨勢折線圖
調用鏈詳情樣本:鏈路中會採集LLM調用,召回,工具調用等節點的詳細資料。
調用鏈詳情頁面左側為 Trace 瀑布圖,各 span 標註類型(TASK、TOOL、LLM、RETRIEVER)、耗時及 token 數;頂部匯總 Trace ID、總耗時、應用數、介面數和 Total tokens。單擊某個 span 後,右側詳情面板展示該 span 的元資訊(應用程式名稱、介面名、主機名稱、spanId、起止時間等),LLM 類型 span 還展示輸入 Prompt 和 Output Messages 內容。
步驟三:Dify外掛程式引擎接入
修改Dockerfile檔案重新編譯對應鏡像,local.dockerfile 修改樣本:
FROM golang:1.23-alpine AS builder ARG VERSION=unknown # copy project COPY . /app # set working directory WORKDIR /app # using goproxy if you have network issues # ENV GOPROXY=https://goproxy.cn,direct # download 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 build 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 # copy entrypoint.sh COPY entrypoint.sh /app/entrypoint.sh RUN chmod +x /app/entrypoint.sh FROM ubuntu:24.04 WORKDIR /app # check build args ARG PLATFORM=local # Install python3.12 if PLATFORM is local 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; # preload tiktoken ENV TIKTOKEN_CACHE_DIR=/app/.tiktoken # Install dify_plugin to speedup the environment setup, test uv and preload 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/ # run the server, using sh as the entrypoint to avoid process being the root process # and using bash to recycle resources CMD ["/bin/bash", "-c", "/app/entrypoint.sh"]說明注意 INSTGO_EXTRA_RULES 選項會開啟 Plugin 運行時自動監測功能,如果不需要在 Plugin-Daemon 啟動時拉起對 Plugin 探針,可以去除編譯檔案中的
INSTGO_EXTRA_RULES="dify_python"配置環境變數:
ECS 環境:
變數名
樣本值
說明
ARMS_LICENSE_KEY
xxx@xxx
License Key[1]
ARMS_REGION_ID
cn-heyuan
地區
ARMS_ENABLE
true
探針開關
ARMS_APP_NAME
dify-plugin-daemon
應用程式名稱
容器化 ack-onepilot 環境:在 dify-plugin-daemon 應用的 YAML 配置中將以下 labels 添加到 spec.template.metadata 層級下。
labels: aliyun.com/app-language: golang armsPilotAutoEnable: 'on' armsPilotCreateAppName: "dify-daemon-plugin"
部署並查看 dify-plugin-daemon 監控:在應用列表頁面進入dify-plugin-daemon應用,監控詳情如下。
成功接入後,在 ARMS 控制台的應用概覽頁面可查看以下監控資料:
匯總指標卡片:請求數、錯誤數、平均耗時、執行個體數及其日同比/周同比變化
時序圖表:請求數/1m、錯誤數/1m、耗時/1m(含 P99、P90、P75、平均值)、CPU 使用率峰值
Top5 排行:請求數排行、錯誤數排行、平均耗時排行、CPU 使用率峰值執行個體排行
頁面頂部導航 Tab 頁簽包括應用概覽、應用拓撲、提供服務、依賴服務、調用鏈分析、執行個體監控、應用診斷、情境化分析、事件分析、應用配置。
調用鏈詳情:
在 serviceName 過濾器中選擇
insight-agent-plugin-daemon,可查看外掛程式調用 LLM 請求的完整分布式鏈路。Trace 瀑布圖展示多個 span,包括:GET 入口請求
connect(redis/sqlalchemy 串連)
SELECT dify(資料庫查詢)
/v1/sandbox/run(POST 200,sandbox 執行,含 httpx/go 多層調用)
UPDATE dify(資料庫更新)
各 span 耗時從 131µs 到 34.95ms 不等。右側 Span 詳情面板展示主機名稱、起止時間、狀態及 Attributes,包括
net.protocol.name=HTTP、component.name、endpoint=/plugin/tenant_id/dispatch/llm/inv...等屬性。查看 Plugin 監控:掛載探針後,Plugin-Daemon 會自動拉起外掛程式運行時的探針。每個外掛程式運行時對應一個可觀測應用,應用程式名稱為 {plugin_daemon_name}_plugin_{plugin_name}_{plugin_version}。例如,Plugin-Daemon 配置的應用程式名稱為 local-dify-plugin-daemon,安裝了 tongyi 的 version 0.0.53 外掛程式時,會自動產生應用 local-dify-plugin-daemon_plugin_tongyi_0.0.53。
(可選)步驟四:監控代碼沙箱 Sandbox
Sandbox 是 Dify 代碼沙箱引擎,負責執行 Workflow 中的 Python/Node.js 代碼。Go 探針支援監控 Sandbox,需修改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 instgo在
go 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
配置環境變數。
K8s容器方式接入:在 dify-plugin-daemon 應用的 YAML 配置中將以下 labels 添加到 spec.template.metadata 層級下。
labels: aliyun.com/app-language: golang armsPilotAutoEnable: 'on' armsPilotCreateAppName: "dify-daemon-plugin"手動接入:
變數名
樣本值
說明
ARMS_LICENSE_KEY
xxx
License Key
ARMS_REGION_ID
cn-heyuan
地區
ARMS_ENABLE
true
探針開關
ARMS_APP_NAME
dify-plugin-daemon
應用程式名稱
部署並查看 sandbox 監控,在應用列表頁面進入dify-sandbox應用,監控詳情如下:

調用鏈詳情:
該 Trace 總耗時 8.7s,涉及 5 個應用、1039 個介面,頁面提示檢測到異常。組件調用包括 redis 575 次、sqlalchemy 337 次、httpx 14 次等。Span 瀑布圖中核心鏈路為
SELECT dify查詢後發起多層/v1/sandbox/run調用(POST httpx 35.96ms → SERVER go 28.39ms → 多級 INTERNAL go 調用)。Span 詳情顯示應用程式名稱 insight-agent-sandbox,介面/v1/sandbox/run,主機名稱sandbox-7489d68cd5-xcqv8,狀態代碼正常。
(可選)步驟五:監控入口網關 Nginx
Nginx 是 Dify 的入口網關,一些逾時問題和知識庫/外掛程式/Workflow的檔案上傳問題可能和 Nginx 配置有關。請參考使用OpenTelemetry對Nginx進行鏈路追蹤直接使用 Opentelemetry 方式上報即可。
接入配置
輸入/輸出內容採集
預設值:True,預設開啟採集。
關閉後的效果:使用者query時,模型、工具、知識庫的input/output等詳情欄位只採集欄位大小,不採集欄位內容。
配置方式:設定環境變數OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=False。
大模型應用拆分
預設值: False,預設不做應用拆分。
開啟後的效果:上報的資料拆分到LLM子應用,每個大模型應用(如Dify Workflow/Agent/Chat App)對應一個ARMS應用。
配置方式:設定環境變數PROFILER_GENAI_SPLITAPP_ENABLE=True。
支援的地區:河源、新加坡。
訊息內容欄位長度限制
預設值:4K 字元。
開啟後的效果:限制LLM每條訊息內容(如input/output的訊息內容欄位)的長度,超過指定字元長度的訊息內容將會被截斷。
當前生效外掛程式:僅Dify、LangChain支援此配置。
配置方式:如果您的探針版本>=1.8.3可以通過設定環境變數OTEL_INSTRUMENTATION_GENAI_MESSAGE_CONTENT_MAX_LENGTH=<integer_value>,將 <integer_value> 替換為希望限制的字元長度大小整數值。
Span屬性值長度採集限制
預設值:不設定,預設沒有限制。
開啟後的效果:限制上報的Span屬性值(如 gen_ai.agent.description)的長度,超過指定字元長度的屬性值將會被截斷。
當前生效外掛程式:該配置適用於所有支援 OpenTelemetry 的外掛程式(如LangChain/DashScope/Dify等)。
配置方式:設定環境變數OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT=<integer_value>,將 <integer_value> 替換為希望限制的字元長度大小整數值。