Cette rubrique explique comment intégrer les applications Dify à la surveillance des applications ARMS.
Présentation des composants
Application workflow (application LLM) : Application basée sur un grand modèle de langage (LLM) que vous construisez dans l'interface visuelle de Dify. Elle se présente généralement sous la forme d'un workflow ou d'un chatbot. Elle définit la logique applicative, les prompts, la sélection du modèle, la gestion des variables, les branches conditionnelles et les appels d'outils.
dify-api (API du moteur d'exécution) : Service backend central de Dify. Il reçoit les requêtes frontend, gère les données utilisateurs et applicatives, planifie l'exécution des workflows, appelle les LLM, coordonne les appels de plugins et retourne les résultats finaux.
dify-plugin-daemon (moteur de plugins) : Moteur de plugins pour Dify. Il exécute des plugins officiels ou définis par l'utilisateur dans un environnement sécurisé et isolé.
nginx (passerelle d'entrée) : Passerelle d'entrée de Dify pour le routage du trafic.
Les composants Dify évoluent rapidement et les méthodes de surveillance varient selon les versions. Le tableau suivant détaille les méthodes d'intégration des composants pour chaque version.
|
Version |
Intégration du workflow |
Intégration de dify-api |
Intégration de dify-plugin-daemon |
Intégration Nginx |
|
Antérieure à 1.6.0 |
Utilisez l'agent Python ARMS. (Intégrez l'agent au composant dify-api.) |
Utilisez l'agent Python ARMS. |
Utilisez l'agent Golang ARMS. |
Utilisez OpenTelemetry. |
|
1.6.0 ou ultérieure, antérieure à 1.11.2 |
Signalez les données via la fonctionnalité Intégration de l'observabilité des applications Dify. |
Utilisez l'agent Python ARMS. |
Utilisez l'agent Golang ARMS. |
Utilisez OpenTelemetry. |
|
1.11.2 ou ultérieure |
Utilisez l'agent Python ARMS. (Intégrez l'agent au composant dify-api. Les versions récentes intègrent cette capacité nativement.) |
Utilisez l'agent Python ARMS. |
Utilisez l'agent Golang ARMS. |
Utilisez OpenTelemetry. |
|
1.13.0 ou ultérieure |
Consultez Configurer OTel pour Dify. Configurez les variables d'environnement correspondantes sur le composant dify-worker. Pour obtenir l'endpoint OTel, reportez-vous aux Prérequis. |
Utilisez l'agent Python ARMS. |
Utilisez l'agent Golang ARMS. |
Si vous utilisez Dify via le composant ack-dify dans Container Service for Kubernetes (ACK), profitez de l'intégration en un clic en mettant à jour le chart Helm. Mettez à jour le composant ack-dify depuis la page Applications de votre cluster ACK :
Dans le panneau Helm Chart Update Release, localisez la section de configuration arms dans la configuration des paramètres (Values) de la version cible, puis définissez enabled sur true.
Vous pouvez également configurer les paramètres pertinents lors de la création du composant ack-dify afin d'activer la surveillance des applications ARMS :
Dans l'éditeur YAML de la configuration des paramètres, définissez enabled sur true sous la section de configuration arms.
Prérequis
ack-onepilot version 5.1.2 ou ultérieure
Agent Python version 2.2.0 ou ultérieure
Procédure
Étape 1 : Intégrer le composant dify-api
-
Choisissez l'une des méthodes d'intégration suivantes selon le type de déploiement de l'API Dify :
-
Intégration automatique pour les conteneurs Kubernetes (Recommandé) : Pour plus d'informations, consultez Installer l'agent Python pour les applications d'un cluster ACK à l'aide d'ack-onepilot. Ajoutez les libellés suivants au Deployment de votre dify-api :
labels: apsara.apm/application-type: Dify aliyun.com/app-language: python armsPilotAutoEnable: 'on' armsPilotCreateAppName: "deployment-name" # The display name of the application in ARMS. -
Récupérez le script de démarrage entrypoint.sh et apportez-y les modifications suivantes :
-
Ajoutez les commandes suivantes au début du script de démarrage pour désinstaller les plugins conflictuels et installer l'agent 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 -
Ajoutez la commande de démarrage
aliyun-instrumentà la fin du 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
-
-
Configurez les variables d'environnement.
Paramètre
Valeur d'exemple
Description
GEVENT_ENABLE
true
Dify utilise gevent. Définissez cette variable sur true.
ARMS_APP_NAME
dify-api
Nom de l'application.
ARMS_REGION_ID
cn-heyuan
Région. Modifiez cette valeur pour cibler votre région.
ARMS_LICENSE_KEY
xxx
Clé de licence.
APSARA_APM_APP_TYPE
microservice
Identifie l'application comme un microservice.
-
2. Consultez les données de surveillance du composant dify-api. L'application dify-api apparaît dans la liste des applications.
La trace affiche les appels en amont et en aval.
Étape 2 : Intégrer les applications workflow Dify
API Dify : de 1.6.0 à 1.11.2
Intégrer une seule application : Reportez-vous à l'Intégration de l'observabilité des applications Dify pour configurer votre application Dify.
Intégrer des applications par lots : Consultez l'Intégration par lots pour la surveillance des applications LLM Dify.
API Dify : Jusqu'à 1.6.0 ou à partir de 1.11.2
Les applications workflow Dify ne nécessitent aucune configuration supplémentaire. Une fois le composant dify-api intégré comme décrit à l'étape précédente, les données de trace des workflows sont automatiquement signalées et corrélées.
API Dify : 1.13.0 ou ultérieure
Consultez Configurer OTel pour Dify. Configurez les variables d'environnement correspondantes sur le composant dify-worker. Pour obtenir l'endpoint OTel, reportez-vous aux Prérequis.
Consulter les données de surveillance des applications workflow
Exemple de détails d'application :
La page de détails de l'application propose plusieurs onglets, notamment Overview, Performance Analysis, Token Analysis, LLM Operations, Provided Services, Dependent Services, Trace Analysis, Exception Analysis et Session Analysis. La page Overview affiche les métriques de surveillance suivantes :
Cartes statistiques : Model Call Count, Token Usage, Trace Count, Span Count, Session Count, User Count avec les variations par rapport à la veille.
Graphique circulaire Operation Type Distribution incluant les types TASK, TOOL, CHAIN, LLM et RETRIEVER.
Graphiques linéaires pour Avg LLM call per request et Request Count Trend.
Model Call Ranking (Top 5) et Request Count User Ranking (Top 5).
Graphique linéaire Session Count Trend.
Exemple de détails de trace : La trace collecte des informations détaillées sur les nœuds tels que les appels LLM, la récupération de données et les appels d'outils.
La page de détails de la trace affiche un graphique en cascade Trace sur la gauche. Chaque span y est annoté avec son type (TASK, TOOL, LLM, RETRIEVER), sa durée et le nombre de tokens. La section supérieure résume l'ID de trace, la durée totale, le nombre d'applications, le nombre d'interfaces et le total des tokens. Lorsque vous cliquez sur un span, le panneau de détails de droite affiche ses métadonnées (Application Name, Interface Name, Hostname, spanId, heure de début et de fin, etc.). Les spans de type LLM affichent également le contenu du Prompt d'entrée et des Messages de sortie.
Étape 3 : Intégrer dify-plugin-daemon
-
Modifiez le Dockerfile et reconstruisez l'image. L'exemple suivant montre les modifications apportées à 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"]RemarqueL'option
INSTGO_EXTRA_RULESactive la surveillance automatique de l'environnement d'exécution du plugin. Si vous ne souhaitez pas que l'agent du plugin se lance au démarrage du plugin-daemon, supprimezINSTGO_EXTRA_RULES="dify_python"du fichier de construction. -
Configurez les variables d'environnement :
-
Environnement ECS
Paramètre
Valeur d'exemple
Description
ARMS_LICENSE_KEY
xxx@xxx
Clé de licence.
ARMS_REGION_ID
cn-heyuan
Région.
ARMS_ENABLE
true
Active ou désactive l'agent.
ARMS_APP_NAME
dify-plugin-daemon
Nom de l'application.
-
Environnement conteneurisé ack-onepilot : Dans le fichier de configuration YAML de l'application dify-plugin-daemon, ajoutez les libellés suivants sous spec.template.metadata.
labels: aliyun.com/app-language: golang armsPilotAutoEnable: 'on' armsPilotCreateAppName: "dify-daemon-plugin"
-
-
Déployez et consultez les données de surveillance de dify-plugin-daemon. Sur la page Application List, accédez à l'application dify-plugin-daemon.
Après une intégration réussie, vous pouvez consulter les données de surveillance suivantes sur la page Application Overview de la console ARMS :
Cartes de métriques synthétiques : Request Count, Error Count, Average Latency, Instance Count avec les variations journalières et hebdomadaires.
Graphiques temporels : Request Count/1m, Error Count/1m, Latency/1m (incluant P99, P90, P75, Average), CPU Usage Peak.
Classements Top 5 : classement Request Count, classement Error Count, classement Average Latency, classement CPU Usage Peak Instance.
Les onglets de navigation supérieurs incluent Application Overview, Application Topology, Provided Services, Dependent Services, Trace Analysis, Instance Monitoring, Application Diagnostics, Scenario Analysis, Event Analysis et Application Configuration.
Détails de la trace :
Sélectionnez
insight-agent-plugin-daemondans le filtre serviceName pour afficher la trace distribuée complète des appels de requêtes LLM du plugin. Le graphique en cascade Trace affiche plusieurs spans, notamment :Requête d'entrée GET
connect (connexions redis/sqlalchemy)
SELECT dify (requêtes base de données)
/v1/sandbox/run (POST 200, exécution sandbox, avec appels multicouches httpx/go)
UPDATE dify (mises à jour base de données)
Les durées des spans varient de 131µs à 34,95ms. Le panneau de détails Span de droite affiche le nom d'hôte, l'heure de début et de fin, le statut et les attributs, y compris
net.protocol.name=HTTP,component.nameetendpoint=/plugin/tenant_id/dispatch/llm/inv.... Consultez les données de surveillance des plugins. Une fois l'agent attaché, le plugin-daemon démarre automatiquement l'agent pour l'environnement d'exécution du plugin. Chaque environnement d'exécution de plugin correspond à une application observable nommée
{plugin_daemon_name}_plugin_{plugin_name}_{plugin_version}. Par exemple, si le nom de l'application pour le plugin-daemon estlocal-dify-plugin-daemonet que la version0.0.53du plugintongyiest installée, une application nomméelocal-dify-plugin-daemon_plugin_tongyi_0.0.53est automatiquement créée.
(Facultatif) Étape 4 : Surveiller le sandbox
Le sandbox est le moteur de sandbox de code Dify permettant d'exécuter du code Python et Node.js issu d'un workflow. L'agent Go prend en charge la surveillance du sandbox. Pour l'activer, modifiez le Dockerfile, reconstruisez l'image et configurez les variables d'environnement appropriées.
-
Modifiez le Dockerfile et reconstruisez l'image correspondante. Modifiez le fichier ./build/build_[amd64|arm64].sh.
-
Ajoutez la commande pour télécharger instgo. Voici un exemple de commande. Pour les commandes de téléchargement destinées à d'autres régions et architectures, consultez Télécharger instgo.
wget "http://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/instgo/instgo-linux-amd64" -O instgo chmod 777 instgo -
Ajoutez la commande
instgoavant la commandego build. Voici un exemple pour 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
-
-
Configurez les variables d'environnement.
-
Intégration via des conteneurs Kubernetes : Dans le fichier de configuration YAML de l'application dify-plugin-daemon, ajoutez les libellés suivants sous spec.template.metadata.
labels: aliyun.com/app-language: golang armsPilotAutoEnable: 'on' armsPilotCreateAppName: "dify-daemon-plugin" -
Intégration manuelle :
Paramètre
Valeur d'exemple
Description
ARMS_LICENSE_KEY
xxx
Clé de licence.
ARMS_REGION_ID
cn-heyuan
Région.
ARMS_ENABLE
true
Active ou désactive l'agent.
ARMS_APP_NAME
dify-plugin-daemon
Nom de l'application.
-
-
Déployez et consultez les données de surveillance du sandbox. Sur la page Application List, accédez à l'application dify-sandbox. Les détails de la surveillance sont les suivants :

Détails de la trace :
Cette trace a une durée totale de 8,7 s et implique 5 applications ainsi que 1039 interfaces. La page indique Exception Detected. Les appels de composants incluent redis (575 fois), sqlalchemy (337 fois) et httpx (14 fois). Le chemin principal dans le graphique en cascade Span montre des requêtes
SELECT difysuivies d'appels multicouches/v1/sandbox/run(POST httpx 35,96ms → SERVER go 28,39ms → appels INTERNAL go à plusieurs niveaux). Les détails du span affichent le nom de l'application insight-agent-sandbox, l'interface/v1/sandbox/runet le nom d'hôtesandbox-7489d68cd5-xcqv8, avec un code de statut normal.
(Facultatif) Étape 5 : Surveiller la passerelle d'entrée Nginx
Nginx sert de passerelle d'entrée pour Dify. Certains problèmes liés aux délais d'attente ou aux téléchargements de fichiers pour la base de connaissances, les plugins ou les workflows peuvent provenir de la configuration Nginx. Signalez les données à l'aide d'OpenTelemetry, comme décrit dans Tracer Nginx à l'aide d'OpenTelemetry.
Configuration
Collecte du contenu d'entrée et de sortie
Par défaut : True.
Effet lorsque désactivé : Lorsqu'un utilisateur envoie une requête, l'agent collecte uniquement la taille des champs tels que l'entrée et la sortie pour les modèles, les outils et la base de connaissances, mais pas leur contenu.
Configuration : Définissez la variable d'environnement OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=False.
Fractionnement des applications LLM
Par défaut : False.
Effet lorsque activé : Les données signalées sont fractionnées en sous-applications LLM. Chaque application LLM, telle qu'un workflow Dify, un Agent ou une Chat App, correspond à une application ARMS distincte.
Configuration : Définissez la variable d'environnement PROFILER_GENAI_SPLITAPP_ENABLE=True.
Régions prises en charge : Chine (Heyuan) et Singapour.
Limite de longueur du contenu des messages
Par défaut : 4K caractères.
Effet lorsque activé : Limite la longueur du contenu de chaque message LLM, tel que les champs de message d'entrée et de sortie. L'agent tronque le contenu des messages qui dépasse la longueur de caractères spécifiée.
Plugins pris en charge : Cette configuration s'applique uniquement à Dify et LangChain.
Configuration : Si votre version d'agent est 1.8.3 ou ultérieure, définissez la variable d'environnement OTEL_INSTRUMENTATION_GENAI_MESSAGE_CONTENT_MAX_LENGTH=<integer_value>. Remplacez <integer_value> par un entier spécifiant la longueur maximale de caractères.
Limite de longueur des valeurs d'attribut Span
Par défaut : Aucune limite.
Effet lorsque activé : Limite la longueur des valeurs d'attribut Span signalées, telles que gen_ai.agent.description. L'agent tronque les valeurs d'attribut qui dépassent la longueur de caractères spécifiée.
Plugins pris en charge : Cette configuration s'applique à tous les plugins prenant en charge OpenTelemetry, tels que LangChain, DashScope et Dify.
Configuration : Définissez la variable d'environnement OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT=<integer_value>. Remplacez <integer_value> par un entier spécifiant la longueur maximale de caractères.