接入Dify应用

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

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

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

步骤二:安装探针接入助手(ack-onepilot)

  1. 登录容器服务管理控制台,在集群列表页面单击目标集群名称。

  2. 在左侧导航栏单击组件管理,然后在右上角通过关键字搜索ack-onepilot

    重要

    ack-onepilot版本需在5.1.0或以上,该版本的ack-onepilot组件在后续为应用开启监控时将会自动为您执行Python探针包的下载与注入动作,您无需手动修改启动命令即可获得完全无侵入的Python应用监控接入体验。5.1.0版本ack-onepilot组件正在灰度中,如需使用请联系钉钉答疑群(群号:35568145)协助开通。

  3. ack-onepilot卡片上单击安装

    说明

    ack-onepilot组件默认支持1000pod规模,集群pod每超过1000个,ack-onepilot资源对应的CPU请增加0.5核、内存请增加512 MB。

  4. 在弹出的页面中可以配置相关的参数,建议使用默认值,单击确认

    说明

    安装完成后,您可以在组件管理页面升级、配置或卸载ack-onepilot组件。

步骤三:授予访问权限

ACK托管集群

如果ACK托管集群中不存在ARMS Addon Token,请执行以下操作手动为集群授予ARMS资源的访问权限。如果已经存在ARMS Addon Token,请跳转至步骤六

查看集群是否存在ARMS Addon Token。

  1. 登录容器服务管理控制台,在集群列表页面,单击目标集群名称进入集群详情页。

  2. 在左侧导航栏选择配置管理 > 保密字典,然后在顶部选择命名空间kube-system,查看addon.arms.token是否存在。

说明

集群存在ARMS Addon Token时,ARMS会进行免密授权。Kubernetes托管版集群默认存在ARMS Addon Token,但对于部分早期创建的Kubernetes托管版集群,可能会存在没有ARMS Addon Token的情况,因此,对于Kubernetes托管版集群,建议首先检查ARMS Addon Token是否存在。若不存在,需进行手动授权。

手动添加权限策略。

  1. 登录容器服务管理控制台,在集群列表页面单击目标集群名称。

  2. 集群信息 > 基本信息页签的集群资源区域,单击Worker RAM角色右侧的链接。

  3. 权限管理页签单击新增授权

  4. 新增授权面板添加以下两个权限策略,然后单击确认新增授权

    • AliyunTracingAnalysisFullAccess:可观测链路 OpenTelemetry 版的完整权限。

    • AliyunARMSFullAccess:ARMS的完整权限。

专有版集群/注册集群

如果需要监控ACK专有版集群ACK One注册集群应用,请确认对应的阿里云账号已包含AliyunARMSFullAccessAliyunSTSAssumeRoleAccess权限。添加权限的操作,请参见RAM用户授权

安装ack-onepilot组件后,还需要在ack-onepilot中填写有ARMS权限的阿里云账号AK/SK。

方式一:Helm中直接填写AK/SK

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏选择应用 > Helm页面,单击ack-onepilot组件右侧的更新

  3. accessKeyaccessKeySecret替换为当前账号的AccessKey,然后单击确定

    说明

    获取AccessKey的操作,请参见创建AccessKey

    为降低AccessKey泄露的风险,阿里云账号(主账号)的AccessKey Secret只在创建时显示,后续不支持查看,请妥善保管。

    image

  4. 重启应用Deployment。

方式二:通过K8s Secret引入AK/SK

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏选择配置管理 > 保密字典

  3. 选择ack-onepilot命名空间,然后创建Secret,添加AK/SK信息。

    说明

    获取AccessKey的操作,请参见创建AccessKey

    为降低AccessKey泄露的风险,阿里云账号(主账号)的AccessKey Secret只在创建时显示,后续不支持查看,请妥善保管。

    image

  4. 在左侧导航栏选择工作负载 > 无状态,单击ack-onepilot组件(一般在ack-onepilot命名空间下,名称为ack-onepilot-ack-onepilot)。

  5. ack-onepilot-ack-onepilot页面右上角单击编辑,然后在环境变量区域添加ONE_PILOT_ACCESSKEYONE_PILOT_ACCESSKEY_SECRET,通过保密字典引用的方式替换为Secret中保存的值,单击确定

    image

ASK/ECI集群

如果需监控ACK Serverless集群或对接了ECI的集群应用,请在云资源访问授权页面完成授权,然后重启ack-onepilot组件下的所有Pod。

(可选)步骤四:修改dify启动脚本

重要

对于5.1.0及以上版本的ack-onepilot组件,在后续为应用开启监控时将会自动为您执行Python探针包的下载与注入动作,您无需手动修改启动命令即可获得完全无侵入的Python应用监控接入体验。

  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. 单击确定,保存配置项。

步骤五:为Dify应用开启监控

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 无状态页面的ack-dify-api应用右侧选择image > YAML 编辑

  4. YAML文件中将以下labels添加到spec.template.metadata层级下。

    labels:
      aliyun.com/app-language: python # Python应用必填,标明此应用是Python应用。
      armsPilotAutoEnable: 'on'
      armsPilotCreateAppName: "deployment-name"    # 应用在控制台的展示名称。
      armsPilotAppWorkspace: "workspace"    # 替换为当前workspace名称。
    重要

    5.1.0及以上版本的ack-onepilot组件将会自动为您执行Python探针包的下载与注入动作。如果您不希望使用Python的完全无侵入注入能力,可以通过以下label关闭:

    labels:
      armsAutoInstrumentationEnable: "off"  #关闭Python应用的完全无侵入注入能力

    image

  5. 单击更新

步骤六:编辑 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属性值的长度,超过指定字符长度的属性值将会被截断。

    说明

    Python探针包的自动下载以及注入动作将会通过一个初始化容器来执行,初始化容器的执行在默认的资源设定下可能会占用约10s的时间,该初始化容器默认会消耗0.5c 250MB的资源(初始化结束后即释放)。您可以通过以下环境变量来调整初始化容器的资源配额以调整初始化容器的执行速度:

    • PYTHON_INIT_RESOURCE_REQUESTS_CPU:Python应用初始化容器的CPU Request值,示例值:500m。

    • PYTHON_INIT_RESOURCE_REQUESTS_MEM:Python应用初始化容器的内存 Request值,示例值:250Mi。

    • PYTHON_INIT_RESOURCE_LIMIT_CPU:Python应用初始化容器的CPU Limit值,示例值:1000m。

    • PYTHON_INIT_RESOURCE_LIMIT_MEM:Python应用初始化容器的CPU Limit值,示例值:500Mi。

  3. (可选)如果您未使用ack-onepilot组件的完全无侵入注入能力,还需配置以下内容。

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

      image.png

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

      • 存储卷类型:配置项

      • 配置项名称:bootstrap

      • 挂载源:dify-bootstrap

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

      image.png

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

查看监控数据

  1. 登录云监控2.0控制台,在左侧导航栏选择应用中心 > 大模型可观测

  2. 模型应用页面单击目标应用名称,然后查看对应的模型应用详情。更多信息,请参见大模型可观测

    重要

    需确认Dify应用已有数据。

  3. 您也可以在应用中心 > 运维监控 > 应用监控应用列表页面查看对应的监控详情。更多信息,请参见应用监控