Todos los productos
Search
Centro de documentos

AgentLoop:Instrumentar una aplicación de Dify

Última actualización: Sep 06, 2026

Este documento muestra cómo instrumentar su aplicación de Dify.

Descripción general de los componentes

  1. Aplicación de flujo de trabajo (aplicación LLM): Una aplicación LLM construida con la interfaz visual de Dify, que por lo general existe como un flujo de trabajo o un chatbot. Define la lógica de la aplicación, los prompts, la selección del modelo, el manejo de variables, las bifurcaciones condicionales y las llamadas a herramientas.

  2. dify-api (API del motor de ejecución): El servicio de backend principal de Dify. Recibe las solicitudes del frontend, gestiona los datos, programa las ejecuciones del flujo de trabajo, invoca modelos de lenguaje grandes, coordina las llamadas a plugins y devuelve los resultados.

  3. dify-plugin-daemon (motor de plugins): El motor de plugins de Dify que ejecuta de forma segura plugins oficiales o definidos por el usuario en un entorno aislado.

  4. nginx (puerta de enlace de entrada): La puerta de enlace de entrada de Dify para distribuir el tráfico entrante.

Importante
  • Si utiliza Dify mediante el componente ack-dify en Container Service for Kubernetes (ACK), se recomienda llevar a cabo una integración con un solo clic al actualizar el Helm chart. Actualice el componente ack-dify en la página Applications de su clúster de ACK.

En la configuración de parámetros de la página update release, busque el campo arms y establezca enabled en true.

Como alternativa, habilite el monitoreo de la aplicación al configurar los ajustes cuando cree el componente ack-dify.

En el paso Parameter Configuration del editor YAML, establezca arms.enabled en true, appName en "dify" y applicationType en "Dify". Después, haga clic en OK para completar la creación.

Requisitos previos

  • ack-onepilot 5.1.2 o posterior.

  • Python agent 2.2.0 o posterior.

Procedimiento

Paso 1: Instrumentar dify-api

  1. Elija un método según el despliegue de su API de Dify:

    • (Recomendado) Instrumentación automática para contenedores de K8s: Siga las instrucciones de Install the Python agent by using the ack-onepilot component for ACK and ACS para agregar las siguientes etiquetas al Deployment de su API de Dify:

      labels:
        apsara.apm/application-type: Dify
        aliyun.com/app-language: python # Required for Python applications.
        armsPilotAutoEnable: 'on'
        armsPilotCreateAppName: "deployment-name"    # The display name of the application in ARMS.
    • Obtenga el script de inicio entrypoint.sh y aplique los siguientes cambios:

      1. Agregue los siguientes comandos al inicio del script para desinstalar los plugins en conflicto e instalar el agente de Python.

        python3 -m ensurepip --upgrade# Uninstall conflicting OTel plugins.
        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# Install the Python agent.
        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. Agregue el comando aliyun-instrument en la sección de inicio al final del script.

        # Start with 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
    • Configure las variables de entorno.

      Parámetro

      Valor

      Descripción

      GEVENT_ENABLE

      true

      Dify usa gevent. Esta variable debe establecerse en true.

      ARMS_APP_NAME

      dify-api

      El nombre de la aplicación.

      ARMS_REGION_ID

      cn-heyuan

      El ID de su región.

      ARMS_LICENSE_KEY

      xxx

      Su License Key.

      APSARA_APM_APP_TYPE

      microservice

      Identifica la aplicación como un microservicio.

2. Para consultar los datos de monitoreo del componente dify-api, busque la aplicación dify-api en la lista Application Monitoring. La página Application Overview muestra la siguiente información de monitoreo:

  • Tarjetas de métricas resumidas: solicitudes, errores, latencia promedio, instancias y variaciones respecto al día anterior

  • Gráficas de series temporales: Requests/1m, Errors/1m y tasa de error, Latency/1m, utilización de CPU

  • Clasificaciones de los 5 principales: cantidad de solicitudes, cantidad de errores, latencia promedio

La traza muestra información sobre las llamadas ascendentes y descendentes.

La página de detalles de la traza muestra el TraceID, la duración total, la cantidad de aplicaciones y la cantidad de spans en la parte superior. La sección central contiene una gráfica de Gantt con la línea temporal de los spans que indica la distribución de duración de cada uno. El árbol de llamadas en la esquina inferior izquierda presenta la ruta completa de llamada desde la entrada de la puerta de enlace /console/api hasta los endpoints de la API de Dify y las consultas a la base de datos en una estructura jerárquica. El panel de detalles del span a la derecha muestra atributos como el nombre de la aplicación, el endpoint, la dirección IP, el spanId, el parentSpanId y el código de estado.

Paso 2: Instrumentar el flujo de trabajo de Dify

1.6.0 < versión de dify-api < 1.11.2

Versión de dify-api <= 1.6.0 o versión >= 1.11.2

La aplicación de flujo de trabajo de Dify no requiere configuración adicional. Si instrumentó el componente dify-api en el paso anterior, los datos de traza del flujo de trabajo se recopilan y correlacionan automáticamente.

Versión de dify-api >= 1.13.0

Consulte Configurar OTel para Dify y establezca las variables de entorno obligatorias en el componente dify-worker. Para obtener el endpoint de OTel, consulte Prerequisites.

Consultar los datos de monitoreo del flujo de trabajo

La página de detalles de la aplicación contiene las siguientes pestañas: Overview, Performance Analysis, Token Analysis, LLM Operations, Provided Services, Dependent Services, Trace Analysis, Exception Analysis y Session Analysis. La pestaña Overview muestra la siguiente información de monitoreo:

  • Tarjetas de métricas clave: Model Calls, Token Usage (con comparación respecto al día anterior), Traces, Spans, Sessions y Users

  • Gráfica circular de distribución por tipo de operación (TASK, TOOL, CHAIN, LLM, RETRIEVER)

  • Gráficas de líneas para el promedio de llamadas LLM por solicitud, la tendencia de cantidad de solicitudes y la tendencia de cantidad de sesiones

  • Gráfica de barras Model Call Ranking (Top 5) y tabla Request Count User Ranking (Top 5)

Ejemplo de detalles de traza: Los detalles de la traza incluyen información de nodos, como llamadas LLM, recuperación e invocación de herramientas.

La página de detalles de la traza muestra una gráfica de cascada a la izquierda que presenta los nodos de paso (los tipos incluyen CHAIN, TOOL, TASK, LLM y RETRIEVER), cada uno con una barra de tiempo en la gráfica de Gantt. El panel derecho muestra información detallada del nodo seleccionado, incluido el nombre de la aplicación, el endpoint, el hostname, el spanId, el parentSpanId y el código de estado. La sección Additional Information en la parte inferior le permite consultar el contenido de los mensajes de entrada y salida del nodo, como la entrada JSON para el análisis de alertas y los resultados del análisis de causa raíz.

Paso 3: Instrumentar dify-plugin-daemon

  1. Modifique el Dockerfile y recompile la imagen correspondiente. A continuación se muestra un ejemplo de un archivo local.dockerfile modificado:

    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"]
    Nota

    La opción INSTGO_EXTRA_RULES habilita el monitoreo automático del entorno de ejecución del plugin. Para evitar que el agente del plugin se inicie junto con plugin-daemon, elimine INSTGO_EXTRA_RULES="dify_python" del archivo de compilación.

  2. Configure las variables de entorno:

    • Para entornos de ECS:

      Parámetro

      Valor

      Descripción

      ARMS_LICENSE_KEY

      xxx@xxx

      Su License Key.

      ARMS_REGION_ID

      cn-heyuan

      El ID de su región.

      ARMS_ENABLE

      true

      Habilita o deshabilita el agente.

      ARMS_APP_NAME

      dify-plugin-daemon

      El nombre de la aplicación.

    • Para entornos containerizados con ack-onepilot: En la configuración YAML de la aplicación dify-plugin-daemon, agregue las siguientes etiquetas bajo spec.template.metadata.

      labels:
        aliyun.com/app-language: golang
        armsPilotAutoEnable: 'on'
        armsPilotCreateAppName: "dify-daemon-plugin"
  3. Despliegue y consulte los datos de monitoreo de dify-plugin-daemon. En la página de lista de aplicaciones, vaya a la aplicación dify-plugin-daemon. La página de descripción general de la aplicación muestra la siguiente información de monitoreo:

    • Tarjetas de métricas: Requests, Errors, Average Latency e Instances, con variaciones respecto al día anterior y a la semana anterior

    • Gráficas de tendencias: gráfica de barras Requests/1m, gráfica de líneas Errors/1m, gráfica de líneas Latency/1m (con los percentiles P99, P90 y P75) y gráfica de anillo Peak CPU Utilization

    • Paneles de clasificación de los 5 principales: Request Count, Error Count, Average Latency y Peak CPU Utilization by Instance

    La gráfica de cascada de la traza muestra los detalles de la cadena de llamadas de insight-agent-plugin-daemon. Los spans clave incluyen:

    • GET (python/redis, 1.95 ms)

    • connect (python/sqlalchemy)

    • SELECT dify (sqlalchemy, 34.95 ms)

    • Llamadas de varias capas de /v1/sandbox/run (POST httpx → SERVER go net_http_server → INTERNAL, aproximadamente 28–30 ms)

    • UPDATE dify (sqlalchemy, 2.38 ms)

    El panel de detalles a la derecha muestra el hostname, la hora de inicio, la hora de finalización, el spanId, el parentSpanId, el código de estado y una lista Attributes (como net.protocol.name, component.name y endpoint) para el span seleccionado.

  4. Consulte los datos de monitoreo de los plugins. Después de instalar el agente, plugin-daemon inicia automáticamente el agente para el entorno de ejecución del plugin. Cada entorno de ejecución de plugin corresponde a una aplicación observable independiente, nombrada con el formato {plugin_daemon_name}_plugin_{plugin_name}_{plugin_version}. Por ejemplo, si su aplicación plugin-daemon se llama local-dify-plugin-daemon y usted instaló la versión 0.0.53 del plugin tongyi, se crea automáticamente una aplicación llamada local-dify-plugin-daemon_plugin_tongyi_0.0.53. La página de descripción general del monitoreo de plugins muestra la siguiente información:

    • Pestañas superiores: Application Overview, Application Topology, Provided Services, Dependent Services, Trace Analysis, Instance Monitoring, Scenario Analysis y Application Configuration

    • Tarjetas de métricas clave: solicitudes, errores, latencia promedio e instancias (con variaciones respecto al día anterior y a la semana anterior)

    • Gráficas de series temporales: tendencias de cantidad de solicitudes, cantidad de errores, latencia y utilización máxima de CPU

    • Clasificaciones de los 5 principales: cantidad de solicitudes, cantidad de errores y latencia promedio, que muestran las llamadas a nivel de endpoint del plugin (como invoke_llm, get_ai_model_schemas y invoke_rerank)

(Opcional) Paso 4: Monitorear el sandbox de código

El sandbox de código es el motor de ejecución de código de Dify que ejecuta código de Python o Node.js dentro de un flujo de trabajo. Use el agente de Go para monitorear el sandbox. Para ello, modifique el Dockerfile, recompile la imagen y configure las variables de entorno.

  1. Modifique el archivo build/build_[amd64|arm64].sh y recompile la imagen correspondiente.

    1. Agregue el comando para descargar instgo. A continuación se muestra un ejemplo. Para ver los comandos de descarga de otras regiones y arquitecturas, consulte Download instgo.

      wget "http://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/instgo/instgo-linux-amd64" -O instgo
      chmod 777 instgo
    2. Agregue el comando instgo antes de go build. A continuación se muestra un ejemplo para la arquitectura 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. Configure las variables de entorno.

    • Para despliegues en contenedores de K8s: En la configuración YAML de la aplicación dify-plugin-daemon, agregue las siguientes etiquetas bajo spec.template.metadata.

      labels:
        aliyun.com/app-language: golang
        armsPilotAutoEnable: 'on'
        armsPilotCreateAppName: "dify-daemon-plugin"
      
    • Para la integración manual:

      Parámetro

      Valor

      Descripción

      ARMS_LICENSE_KEY

      xxx

      Su License Key.

      ARMS_REGION_ID

      cn-heyuan

      El ID de su región.

      ARMS_ENABLE

      true

      Habilita o deshabilita el agente.

      ARMS_APP_NAME

      dify-plugin-daemon

      El nombre de la aplicación.

  3. Despliegue y consulte los datos de monitoreo del sandbox. En la página de lista de aplicaciones, vaya a la aplicación dify-sandbox. La pestaña Application Overview muestra las siguientes métricas resumidas:

    • Requests: 3,051.00 (1.60 % respecto al día anterior)

    • Errors: 0.00 (0 % respecto al día anterior)

    • Average Latency: 47.7 ms (1.36 % respecto al día anterior)

    • Instances: 9 (0 % respecto a la semana anterior)

    Las gráficas de series temporales muestran Requests/1m, Errors/1m, Latency/1m (con las curvas P99, P90 y P75) y la utilización de CPU. La clasificación Top 5 Provided Services muestra la ruta principal de solicitudes como /v1/sandbox/run con 3,051 solicitudes, 0 errores y una latencia promedio de 47.7 ms.

    La página de detalles de traza de ARMS muestra una traza con una duración total de 8.7 segundos, que abarca 5 aplicaciones y 1,039 endpoints, con anomalías detectadas. Las etiquetas de componentes incluyen redis (575), sqlalchemy (337), net_http_server (16) y httpx (14). La gráfica de cascada de spans muestra la cadena de llamadas de varias capas desde SELECT dify hasta /v1/sandbox/run POST 200, lo que ilustra la ruta completa de la llamada de Dify al sandbox. El panel de detalles del span muestra el nombre de la aplicación insight-agent-sandbox, el endpoint /v1/sandbox/run y el hostname sandbox-7489d68cd5-xcqv8, con un código de estado normal. La sección Attributes muestra campos como net.protocol.name, component.name y otra información detallada.

(Opcional) Paso 5: Monitorear la puerta de enlace de entrada Nginx

Nginx es la puerta de enlace de entrada de Dify. Los problemas de configuración de Nginx pueden provocar tiempos de espera agotados y fallas en la carga de archivos para la base de conocimientos, los plugins y los flujos de trabajo. Para monitorear Nginx, consulte Trace Nginx with OpenTelemetry y utilice el método de OpenTelemetry para reportar los datos.

Configuración

Recopilación de contenido de entrada y salida

Valor predeterminado: True (habilitado de forma predeterminada).

Efecto al deshabilitarlo: Para las consultas de usuario y los campos detallados como la entrada y salida de modelos, herramientas y la base de conocimientos, solo se recopila su tamaño, no su contenido.

Cómo configurarlo: Establezca la variable de entorno OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=False.

Dividir aplicaciones LLM

Valor predeterminado: False (deshabilitado de forma predeterminada).

Efecto al habilitarlo: Los datos reportados se dividen en subaplicaciones LLM. Cada aplicación LLM, como un flujo de trabajo, un agente o un chatbot de Dify, corresponde a una aplicación independiente en ARMS.

Cómo configurarlo: Establezca la variable de entorno PROFILER_GENAI_SPLITAPP_ENABLE=True.

Regiones compatibles: China (Heyuan), Singapore.

Límite de longitud del contenido del mensaje

Valor predeterminado: 4,000 caracteres.

Efecto al habilitarlo: Limita la longitud de cada campo de contenido del mensaje LLM, como input u output. El contenido del mensaje que supera la longitud especificada se trunca.

Plugins aplicables: Actualmente, esta configuración solo es compatible con Dify y LangChain.

Cómo configurarlo: Si la versión de su agente es 1.8.3 o posterior, establezca la variable de entorno OTEL_INSTRUMENTATION_GENAI_MESSAGE_CONTENT_MAX_LENGTH=<integer_value>. Reemplace <integer_value> con el límite de caracteres deseado.

Límite de longitud del valor del atributo de span

Valor predeterminado: Sin límite.

Efecto al habilitarlo: Limita la longitud de los valores de atributo de span reportados, como gen_ai.agent.description. Los valores de atributo que superan la longitud especificada se truncan.

Plugins aplicables: Esta configuración aplica a todos los plugins compatibles con OpenTelemetry, como LangChain, DashScope y Dify.

Cómo configurarlo: Establezca la variable de entorno OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT=<integer_value>. Reemplace <integer_value> con el límite de caracteres deseado.