Este documento muestra cómo instrumentar su aplicación de Dify.
Descripción general de los componentes
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.
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.
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.
nginx (puerta de enlace de entrada): La puerta de enlace de entrada de Dify para distribuir el tráfico entrante.
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
-
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:
-
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 -
Agregue el comando
aliyun-instrumenten 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
Para instrumentar una sola aplicación, consulte Enable observability for a Dify application y configure los ajustes de su aplicación de Dify.
Para instrumentar varias aplicaciones de forma masiva, consulte Bulk integration for Dify LLM application monitoring.
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
-
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"]NotaLa opción
INSTGO_EXTRA_RULEShabilita el monitoreo automático del entorno de ejecución del plugin. Para evitar que el agente del plugin se inicie junto con plugin-daemon, elimineINSTGO_EXTRA_RULES="dify_python"del archivo de compilación. -
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"
-
-
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.nameyendpoint) para el span seleccionado. -
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_schemasyinvoke_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.
-
Modifique el archivo build/build_[amd64|arm64].sh y recompile la imagen correspondiente.
-
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 -
Agregue el comando
instgoantes dego 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
-
-
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.
-
-
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/runcon 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 difyhasta/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/runy el hostnamesandbox-7489d68cd5-xcqv8, con un código de estado normal. La sección Attributes muestra campos comonet.protocol.name,component.namey 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.