Este tópico descreve como integrar aplicações Dify ao Monitoramento de Aplicações do ARMS.
Visão geral dos componentes
Aplicação de workflow (aplicação LLM): Aplicação de Large Language Model (LLM) construída na interface visual do Dify. Geralmente existe como um workflow ou chatbot e define a lógica da aplicação, prompts, seleção de modelos, tratamento de variáveis, ramificações condicionais e chamadas de ferramentas.
dify-api (API do Motor de Execução): service de backend principal do Dify. Recebe requisições do front-end, gerencia dados de usuários e aplicações, agenda execuções de workflows, chama LLMs, coordena chamadas de plugins e retorna os resultados finais.
dify-plugin-daemon (Motor de Plugins): Motor de plugins do Dify usado para executar plugins oficiais ou definidos pelo usuário em um ambiente seguro e isolado.
nginx (gateway de entrada): Gateway de entrada do Dify para roteamento de tráfego.
Os componentes do Dify evoluem rapidamente, e os métodos de monitoramento variam entre as diferentes versões. A tabela a seguir detalha os métodos de integração para os componentes em cada versão.
|
Versão |
Integração de workflow |
Integração do dify-api |
Integração do dify-plugin-daemon |
Integração do Nginx |
|
Anterior à 1.6.0 |
Use o agente Python do ARMS. (Integre o agente ao componente dify-api.) |
Use o agente Python do ARMS. |
Use o agente Golang do ARMS. |
Use OpenTelemetry. |
|
1.6.0 ou posterior, anterior à 1.11.2 |
Reporte dados usando o recurso Dify application observability integration. |
Use o agente Python do ARMS. |
Use o agente Golang do ARMS. |
Use OpenTelemetry. |
|
1.11.2 ou posterior |
Use o agente Python do ARMS. (Integre o agente ao componente dify-api. Versões mais recentes possuem essa capacidade nativa.) |
Use o agente Python do ARMS. |
Use o agente Golang do ARMS. |
Use OpenTelemetry. |
|
1.13.0 ou posterior |
Consulte Configurar OTel para Dify. Configure as variáveis de ambiente correspondentes no componente dify-worker. Para obter o endpoint do OTel, consulte Prerequisites. |
Use o agente Python do ARMS. |
Use o agente Golang do ARMS. |
Se você usar o Dify por meio do componente ack-dify no Container Service for Kubernetes (ACK), faça a integração com um clique atualizando o Helm chart. Atualize o componente ack-dify na página Applications do seu cluster ACK:
No painel Helm Chart Update Release, localize a seção de configuração arms na configuração de parâmetros (Values) da versão alvo e defina enabled como true.
Alternativamente, configure as definições relevantes ao criar o componente ack-dify para ativar o Monitoramento de Aplicações do ARMS:
No editor YAML da configuração de parâmetros, defina enabled como true na seção de configuração arms.
Pré-requisitos
ack-onepilot versão 5.1.2 ou posterior
Agente Python versão 2.2.0 ou posterior
Procedimento
Etapa 1: Integrar o componente dify-api
-
Escolha um dos seguintes métodos de integração com base no tipo de implantação da API do Dify:
-
Integração automática para containers Kubernetes (Recomendado): Para mais informações, consulte Install the Python agent for applications in an ACK cluster by using ack-onepilot. Adicione os seguintes rótulos ao Deployment do seu 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. -
Obtenha o script de inicialização entrypoint.sh e faça as seguintes modificações:
-
Adicione os seguintes comandos no início do script de inicialização para desinstalar plugins conflitantes e instalar o agente 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 -
Adicione o comando de inicialização
aliyun-instrumentao final do 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 as variáveis de ambiente.
Parâmetro
Valor de exemplo
Descrição
GEVENT_ENABLE
true
O Dify usa gevent. Defina esta variável como true.
ARMS_APP_NAME
dify-api
Nome da aplicação.
ARMS_REGION_ID
cn-heyuan
A região. Altere este valor para sua região alvo.
ARMS_LICENSE_KEY
xxx
A License Key.
APSARA_APM_APP_TYPE
microservice
Identifica a aplicação como um microsserviço.
-
2. Visualize os dados de monitoramento do componente dify-api. Na lista de aplicações, visualize a aplicação dify-api.
O trace exibe as chamadas upstream e downstream.
Etapa 2: Integrar aplicações de workflow do Dify
Dify API: 1.6.0 to 1.11.2
Integrar uma única aplicação: Consulte Dify application observability integration para configurar sua aplicação Dify.
Integrar aplicações em lote: Consulte Batch integration for Dify LLM application monitoring.
Dify API: Up to 1.6.0 or from 1.11.2
As aplicações de workflow do Dify não exigem configuração adicional. Após integrar o componente dify-api conforme descrito na etapa anterior, os dados de trace dos workflows são reportados e correlacionados automaticamente.
Dify API: 1.13.0 or later
Consulte Configurar OTel para Dify. Configure as variáveis de ambiente correspondentes no componente dify-worker. Para obter o endpoint do OTel, consulte Prerequisites.
Visualizar dados de monitoramento de aplicações de workflow
Exemplo de detalhes da aplicação:
A página de detalhes da aplicação oferece abas que incluem Overview, Performance Analysis, Token Analysis, LLM Operations, Provided Services, Dependent Services, Trace Analysis, Exception Analysis e Session Analysis. A página Overview exibe as seguintes métricas de monitoramento:
Cartões de estatísticas: Model Call Count, Token Usage, Trace Count, Span Count, Session Count, User Count com variações diárias
Gráfico de pizza Operation Type Distribution incluindo os tipos TASK, TOOL, CHAIN, LLM, RETRIEVER
Gráficos de linha para Avg LLM call per request e Request Count Trend
Model Call Ranking (Top 5) e Request Count User Ranking (Top 5)
Gráfico de linha Session Count Trend
Exemplo de detalhes do trace: O trace coleta informações detalhadas sobre nós, como chamadas de LLM, recuperação e chamadas de ferramentas.
A página de detalhes do trace mostra um gráfico Trace waterfall à esquerda, com cada span anotado com tipo (TASK, TOOL, LLM, RETRIEVER), duração e contagem de tokens. A seção superior resume Trace ID, duração total, contagem de aplicações, contagem de interfaces e Total tokens. Ao clicar em um span, o painel de detalhes à direita exibe os metadados do span (Application Name, Interface Name, Hostname, spanId, hora de início/fim, etc.). Spans do tipo LLM também exibem o conteúdo do Prompt de entrada e das Mensagens de saída.
Etapa 3: Integrar o dify-plugin-daemon
-
Modifique o Dockerfile e reconstrua a imagem. O exemplo a seguir mostra modificações no 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"]NotaA opção
INSTGO_EXTRA_RULESativa o monitoramento automático do runtime do plugin. Caso não deseje que o agente do plugin seja iniciado quando o plugin-daemon for executado, removaINSTGO_EXTRA_RULES="dify_python"do arquivo de build. -
Configure as variáveis de ambiente:
-
Ambiente ECS
Parâmetro
Valor de exemplo
Descrição
ARMS_LICENSE_KEY
xxx@xxx
A License Key.
ARMS_REGION_ID
cn-heyuan
A região.
ARMS_ENABLE
true
Ativa ou desativa o agente.
ARMS_APP_NAME
dify-plugin-daemon
Nome da aplicação.
-
Ambiente containerizado com ack-onepilot: No arquivo de configuração YAML da aplicação dify-plugin-daemon, adicione os seguintes rótulos em spec.template.metadata.
labels: aliyun.com/app-language: golang armsPilotAutoEnable: 'on' armsPilotCreateAppName: "dify-daemon-plugin"
-
-
Implante e visualize os dados de monitoramento do dify-plugin-daemon. Na página Application List, acesse a aplicação dify-plugin-daemon.
Após a integração bem-sucedida, visualize os seguintes dados de monitoramento na página Application Overview do console ARMS:
Cartões de métricas resumidas: Request Count, Error Count, Average Latency, Instance Count com variações diárias/semanais
Gráficos de séries temporais: Request Count/1m, Error Count/1m, Latency/1m (incluindo P99, P90, P75, Average), CPU Usage Peak
Rankings Top 5: Request Count ranking, Error Count ranking, Average Latency ranking, CPU Usage Peak Instance ranking
As abas de navegação superior incluem Application Overview, Application Topology, Provided Services, Dependent Services, Trace Analysis, Instance Monitoring, Application Diagnostics, Scenario Analysis, Event Analysis, Application Configuration.
Detalhes do trace:
Selecione
insight-agent-plugin-daemonno filtro serviceName para visualizar o trace distribuído completo das chamadas de requisição LLM do plugin. O gráfico Trace waterfall mostra múltiplos spans, incluindo:Requisição de entrada GET
connect (conexões redis/sqlalchemy)
SELECT dify (consultas ao banco de dados)
/v1/sandbox/run (POST 200, execução sandbox, com chamadas multicamada httpx/go)
UPDATE dify (atualizações no banco de dados)
As durações dos spans variam de 131µs a 34,95ms. O painel de detalhes do Span à direita mostra hostname, hora de início/fim, status e Attributes, incluindo
net.protocol.name=HTTP,component.name,endpoint=/plugin/tenant_id/dispatch/llm/inv.... Visualize os dados de monitoramento do plugin. Após a anexação do agente, o plugin-daemon inicia automaticamente o agente para o runtime do plugin. Cada runtime de plugin corresponde a uma aplicação observável com o nome
{plugin_daemon_name}_plugin_{plugin_name}_{plugin_version}. Por exemplo, se o nome da aplicação do plugin-daemon forlocal-dify-plugin-daemone a versão0.0.53do plugintongyiestiver instalada, uma aplicação chamadalocal-dify-plugin-daemon_plugin_tongyi_0.0.53será criada automaticamente.
(Opcional) Etapa 4: Monitorar o sandbox
O Sandbox é o motor de sandbox de código do Dify para executar códigos Python e Node.js a partir de um workflow. O agente Go suporta o monitoramento do sandbox. Para ativá-lo, modifique o Dockerfile, reconstrua a imagem e configure as variáveis de ambiente para habilitar o monitoramento.
-
Modifique o Dockerfile e reconstrua a imagem correspondente. Edite o arquivo ./build/build_[amd64|arm64].sh.
-
Adicione o comando para baixar o instgo. Abaixo está um comando de exemplo. Para comandos de download de outras regiões e arquiteturas, consulte Download instgo.
wget "http://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/instgo/instgo-linux-amd64" -O instgo chmod 777 instgo -
Adicione o comando
instgoantes do comandogo build. Segue um exemplo para 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 as variáveis de ambiente.
-
Integração via containers Kubernetes: No arquivo de configuração YAML da aplicação dify-plugin-daemon, adicione os seguintes rótulos em spec.template.metadata.
labels: aliyun.com/app-language: golang armsPilotAutoEnable: 'on' armsPilotCreateAppName: "dify-daemon-plugin" -
Integração manual:
Parâmetro
Valor de exemplo
Descrição
ARMS_LICENSE_KEY
xxx
A License Key.
ARMS_REGION_ID
cn-heyuan
A região.
ARMS_ENABLE
true
Ativa ou desativa o agente.
ARMS_APP_NAME
dify-plugin-daemon
Nome da aplicação.
-
-
Implante e visualize os dados de monitoramento do sandbox. Na página Application List, acesse a aplicação dify-sandbox. Os detalhes do monitoramento são os seguintes:

Detalhes do trace:
Este Trace tem uma duração total de 8,7s, envolvendo 5 aplicações e 1039 interfaces. A página indica Exception Detected. As chamadas de componentes incluem redis 575 vezes, sqlalchemy 337 vezes, httpx 14 vezes, etc. O caminho principal no gráfico Span waterfall mostra consultas
SELECT difyseguidas por chamadas multicamada/v1/sandbox/run(POST httpx 35,96ms → SERVER go 28,39ms → chamadas INTERNAL go multinível). Os detalhes do span mostram o nome da aplicação insight-agent-sandbox, interface/v1/sandbox/run, hostnamesandbox-7489d68cd5-xcqv8, com código de status normal.
(Opcional) Etapa 5: Monitorar o gateway de entrada Nginx
O Nginx atua como gateway de entrada para o Dify. Alguns problemas relacionados a timeouts ou uploads de arquivos para a base de conhecimento, plugins ou workflows podem estar ligados à configuração do Nginx. Reporte dados usando OpenTelemetry, conforme descrito em Trace Nginx by using OpenTelemetry.
Configuração
Coleta de conteúdo de entrada e saída
Padrão: True.
Efeito quando desativado: Quando um usuário envia uma consulta, o agente coleta apenas o tamanho de campos como entrada e saída para modelos, ferramentas e base de conhecimento, mas não o conteúdo desses campos.
Configuração: Defina a variável de ambiente OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=False.
Divisão de aplicações LLM
Padrão: False.
Efeito quando ativado: Os dados reportados são divididos em subaplicações LLM. Cada aplicação LLM, como um workflow, Agent ou Chat App do Dify, corresponde a uma aplicação ARMS separada.
Configuração: Defina a variável de ambiente PROFILER_GENAI_SPLITAPP_ENABLE=True.
Regiões suportadas: China (Heyuan) e Singapore.
Limite de comprimento do conteúdo da mensagem
Padrão: 4K caracteres.
Efeito quando ativado: Limita o comprimento do conteúdo de cada mensagem LLM, como os campos de mensagem de entrada/saída. O agente trunca o conteúdo da mensagem que exceder o comprimento de caracteres especificado.
Plugins suportados: Esta configuração aplica-se apenas ao Dify e LangChain.
Configuração: Se a versão do seu agente for 1.8.3 ou posterior, defina a variável de ambiente OTEL_INSTRUMENTATION_GENAI_MESSAGE_CONTENT_MAX_LENGTH=<integer_value>. Substitua <integer_value> por um número inteiro que especifique o comprimento máximo de caracteres.
Limite de comprimento do valor do atributo Span
Padrão: Sem limite.
Efeito quando ativado: Limita o comprimento dos valores de atributos Span reportados, como gen_ai.agent.description. O agente trunca os valores de atributos que excederem o comprimento de caracteres especificado.
Plugins suportados: Esta configuração aplica-se a todos os plugins que suportam OpenTelemetry, como LangChain, DashScope e Dify.
Configuração: Defina a variável de ambiente OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT=<integer_value>. Substitua <integer_value> por um número inteiro que especifique o comprimento máximo de caracteres.