将Dify应用接入ARMS应用监控

ARMS支持通过Python探针对Dify应用进行可观测,Python探针是阿里云可观测产品自研的Python语言的可观测采集探针,其基于OpenTelemetry标准实现了自动化埋点能力。

步骤一:在容器集群中部署 Dify 应用

  1. 您可以参考基于Dify构建网页定制化AI问答助手文档快速搭建一个Dify应用。

  2. Dify应用所在的ACK集群安装探针接入助手(ack-onepilot)、授予 ARMS 资源的访问权限,并开启应用监控。具体操作,请参见容器服务 ACK 和容器计算服务 ACS 通过 ack-onepilot 组件安装 Python 探针

步骤二:创建配置项 dify-bootstrap

创建dify启动脚本,该脚本用于下载安装探针并启动dify应用。

  1. 获取dify脚本,并进行以下修改:

    1. 脚本开头添加探针下载和安装命令。

      python3 -m ensurepip --upgrade
      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
    2. 脚本最后启动部分添加aliyun-instrument启动命令。

      展开查看完整的示例脚本

      #!/bin/bash
      
      set -e
      python3 -m ensurepip --upgrade
      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
      
      mkdir -p logs
      
      if [[ "${MODE}" == "worker" ]]; then
      
        # Get the number of available CPU cores
        if [ "${CELERY_AUTO_SCALE,,}" = "true" ]; then
          # Set MAX_WORKERS to the number of available cores if not specified
          AVAILABLE_CORES=$(nproc)
          MAX_WORKERS=${CELERY_MAX_WORKERS:-$AVAILABLE_CORES}
          MIN_WORKERS=${CELERY_MIN_WORKERS:-1}
          CONCURRENCY_OPTION="--autoscale=${MAX_WORKERS},${MIN_WORKERS}"
        else
          CONCURRENCY_OPTION="-c ${CELERY_WORKER_AMOUNT:-1}"
        fi
      
        exec celery -A app.celery worker -P ${CELERY_WORKER_CLASS:-gevent} $CONCURRENCY_OPTION --loglevel ${LOG_LEVEL} \
          -Q ${CELERY_QUEUES:-dataset,generation,mail,ops_trace,app_deletion}
      
      else
        if [[ "${DEBUG}" == "true" ]]; then
          exec flask run --host=${DIFY_BIND_ADDRESS:-0.0.0.0} --port=${DIFY_PORT:-5001} --debug
        else
          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} \
            --timeout ${GUNICORN_TIMEOUT:-200} \
            --access-logfile logs/gunicorn_access.log \
            --error-logfile logs/gunicorn_error.log \
            --access-logformat '%(h)s|%(l)s|%(u)s|%(t)s|%(r)s|%(s)s|%(b)s|%(f)s|%(a)s|DURATION:%(L)s' \
            --log-level info \
            app:app
        fi
      fi
  2. ACK控制台添加配置项。

    1. 容器服务管理控制台集群列表页面进入目标集群。

    2. 在左侧导航栏选择配置管理 > 配置项,进入dify-system命名空间,然后单击创建

      • 配置项名称:dify-bootstrap(示例)

      • 名称:entrypoint.sh

      • :上一步创建的dify脚本

    3. 单击确定,保存配置项。

步骤三:编辑 ack-dify-api

  1. 在目标集群的工作负载 > 无状态页面进入dify-system命名空间,然后在ack-dify-api右侧操作列单击编辑image.png

  2. 环境变量区域单击新增,添加以下内容。

    类型

    变量名称

    变量

    变量说明

    自定义

    GEVENT_ENABLE

    true

    必填。

    自定义

    OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT

    true

    输入/输出内容采集。

    默认值:true,默认开启采集。

    关闭后的效果:用户query时,模型、工具、知识库的input/output等详情字段只采集字段大小,不采集字段内容。

    自定义

    PROFILER_GENAI_SPLITAPP_ENABLE

    false

    大模型应用拆分。

    默认值: false,默认不做应用拆分。

    开启后的效果:上报的数据拆分到LLM子应用,每个大模型应用(如Dify Workflow/Agent/Chat App)对应一个ARMS应用。

    自定义

    OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT

    <integer_value>

    内容长度采集限制,请将 <integer_value> 替换为希望限制的字符长度大小整数值。

    默认值:不设置,默认没有限制。

    开启后的效果:限制上报的Span属性值的长度,超过指定字符长度的属性值将会被截断。

  3. 生命周期区域,输入启动执行命令["/bin/bash","/app/api/docker/entrypoint.sh"]image.png

  4. 数据卷区域,单击增加本地存储

    • 存储卷类型:配置项

    • 配置项名称:bootstrap

    • 挂载源:dify-bootstrap

    • 容器路径:/app/api/docker

    image.png

  5. 在右上角单击更新,保存配置。

    等待探针安装完成后,即可在ARMS控制台LLM应用监控 > 应用列表页面查看监控数据

    重要

    需确认Dify应用已有数据。

(可选)步骤四:监控dify-plugin-daemon

Dify 1.0.0及以上版本引入了dify-plugin-daemon用于管理插件的生命周期和后台任务调用等,如果需要监控该组件,可通过以下方式接入:

  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
    
    RUN ./instgo set --agentVersion=2.0.2
    
    # instgo build
    RUN ./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"]
    
  2. 部署dify-plugin-daemon应用并上报监控数据。

    容器化部署

    dify-plugin-daemon应用的YAML文件中将以下labels添加到spec.template.metadata层级下。

    labels:
      aliyun.com/app-language: golang
      armsPilotAutoEnable: 'on'
      armsPilotCreateAppName: "dify-daemon-plugin"

    非容器化部署

    部署组件时请添加以下环境变量。

    ARMS_LICENSE_KEY: xxx // 账号对应的ARMS LicenseKey
    ARMS_REGION_ID: cn-heyuan // 选择填写对应的RegionID
    ARMS_ENABLE: true
    ARMS_APP_NAME: dify-plugin-daemon

    您可以通过DescribeTraceLicenseKey OpenAPI获取LicenseKey。

    2025-08-11_16-43-22

  3. 查看dify-plugin-daemon监控。

    应用列表页面进入dify-plugin-daemon应用,监控详情如下:

    image.png

    调用链详情:

    2025-08-11_18-23-04

(可选)步骤五:监控dify-sandbox

Dify 1.0.0及以上版本引入了dify-sandbox用于管理插件的生命周期和后台任务调用等,如果需要监控该组件,可通过以下方式接入:

  1. 修改./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
      ./instgo set --agentVersion=2.0.2
    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
    ./instgo set --agentVersion=2.0.2
    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. 编译镜像。

    amd64为例:

    docker build -t sandbox:0.2.9  -f docker/amd64/dockerfile .
  3. 部署dify-sandbox应用并上报监控数据。

    容器化部署

    dify-sandbox应用的YAML文件中将以下labels添加到spec.template.metadata层级下。

    labels:
      aliyun.com/app-language: golang
      armsPilotAutoEnable: 'on'
      armsPilotCreateAppName: "dify-sandbox"

    非容器化部署

    部署组件时请添加以下环境变量。

    ARMS_LICENSE_KEY: xxx //账号对应的ARMS LicenseKey
    ARMS_REGION_ID: cn-heyuan //选择填写对应的region
    ARMS_ENABLE: true
    ARMS_APP_NAME: dify-sandbox

    您可以通过DescribeTraceLicenseKey OpenAPI获取LicenseKey。

    2025-08-19_17-30-58

  4. 查看dify-sandbox监控。

    应用列表页面进入dify-sandbox应用,监控详情如下:

    image

    调用链详情:

    2025-08-19_18-25-44

相关文档

如需指定Python探针版本,请参见如何安装指定地域与版本的探针