全部產品
Search
文件中心

Application Real-Time Monitoring Service:將Dify應用接入ARMS應用監控

更新時間:Aug 27, 2026

本文介紹將Dify應用接入ARMS應用監控的操作流程。

組件介紹

  1. workflow 應用(LLM 應用):使用者通過 Dify 可視化介面構建的 LLM 應用本身,通常以工作流程(Workflow) 或對話應用(Chatbot) 的形式存在。它定義了應用的邏輯流程、提示詞(Prompt)、模型選擇、變數處理、條件分支、工具調用等。

  2. dify-api(執行引擎 API):Dify 的核心後端服務,負責接收前端請求、系統管理使用者/應用資料、調度工作流程執行、調用大模型、協調外掛程式調用,並返回最終結果。

  3. dify-plugin-daemon(外掛程式引擎):Dify的外掛程式引擎,用於安全、隔離地執行使用者自訂或官方提供的外掛程式(Plugin)。

  4. 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管控組件接入

  1. 根據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,並進行以下修改:

      1. 啟動指令碼開頭添加如下命令,卸載衝突的外掛程式,下載並安裝 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
      2. 指令碼最後啟動部分添加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-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 requestRequest 數趨勢折線圖

  • 模型調用排行(Top5)Request 數使用者排行(Top5)

  • 會話數趨勢折線圖

調用鏈詳情樣本:鏈路中會採集LLM調用,召回,工具調用等節點的詳細資料。

調用鏈詳情頁面左側為 Trace 瀑布圖,各 span 標註類型(TASK、TOOL、LLM、RETRIEVER)、耗時及 token 數;頂部匯總 Trace ID、總耗時、應用數、介面數和 Total tokens。單擊某個 span 後,右側詳情面板展示該 span 的元資訊(應用程式名稱介面名主機名稱spanId、起止時間等),LLM 類型 span 還展示輸入 Prompt 和 Output Messages 內容。

步驟三:Dify外掛程式引擎接入

  1. 修改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"

  2. 配置環境變數:

    • 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"
  3. 部署並查看 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=HTTPcomponent.nameendpoint=/plugin/tenant_id/dispatch/llm/inv... 等屬性。

  4. 查看 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、重新編譯鏡像後配置環境變數開啟。

  1. 修改Dockerfile檔案重新編譯對應鏡像,修改./build/build_[amd64|arm64].sh檔案。

    1. 添加instgo下載命令。下載命令樣本如下,其他地區和架構的下載命令請參見下載 instgo

      wget "http://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/instgo/instgo-linux-amd64" -O instgo
      chmod 777 instgo
    2. 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
      
  2. 配置環境變數。

    • 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

      應用程式名稱

  3. 部署並查看 sandbox 監控,在應用列表頁面進入dify-sandbox應用,監控詳情如下:image

    調用鏈詳情:

    該 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> 替換為希望限制的字元長度大小整數值。