Este documento explica como instrumentar sua aplicação Dify.
Visão geral dos componentes
Aplicação de workflow (aplicação LLM): aplicação LLM construída com a interface visual do Dify, geralmente estruturada como workflow ou chatbot. 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 frontend, gerencia dados, agenda execuções de workflows, invoca modelos de linguagem grandes, coordena chamadas de plugins e retorna resultados.
dify-plugin-daemon (motor de plugins): motor de plugins do Dify que executa plugins oficiais ou definidos pelo usuário em um ambiente isolado e seguro.
nginx (gateway de entrada): gateway de entrada do Dify responsável por distribuir o tráfego recebido.
Se você utiliza o Dify por meio do componente ack-dify no Container Service for Kubernetes (ACK), recomendamos integrar com um clique ao atualizar o Helm chart. Atualize o componente ack-dify na página Applications do seu cluster ACK.
Na configuração de parâmetros da página de atualização de release, localize o campo arms e defina enabled como true.
Alternativamente, ative o monitoramento da aplicação ao configurar as opções durante a criação do componente ack-dify.
Na etapa Parameter Configuration do editor YAML, defina arms.enabled como true, appName como "dify" e applicationType como "Dify". Em seguida, clique em OK para concluir a criação.
Pré-requisitos
ack-onepilot 5.1.2 ou superior.
Python agent 2.2.0 ou superior.
Procedimento
Etapa 1: Instrumentar o dify-api
-
Escolha um método conforme a implantação da sua API Dify:
-
(Recomendado) Instrumentação automática para containers K8s: siga as instruções em Install the Python agent by using the ack-onepilot component for ACK and ACS para adicionar os seguintes rótulos ao Deployment da sua API 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. -
Obtenha o script de inicialização entrypoint.sh e aplique as seguintes alterações:
-
Adicione os comandos abaixo no início do script para desinstalar plugins conflitantes e instale o Python agent.
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 -
Inclua o comando
aliyun-instrumentna seção de inicialização, ao 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
Descrição
GEVENT_ENABLE
true
O Dify utiliza gevent. Defina esta variável como
true.ARMS_APP_NAME
dify-api
Nome da aplicação.
ARMS_REGION_ID
cn-heyuan
ID da sua região.
ARMS_LICENSE_KEY
xxx
Sua License Key.
APSARA_APM_APP_TYPE
microservice
Identifica a aplicação como microsserviço.
-
2. Para visualizar os dados de monitoramento do componente dify-api, localize a aplicação dify-api na lista de Application Monitoring. A página Application Overview exibe os seguintes dados:
Cartões de métricas resumidas: requisições, erros, latência média, instâncias e variações em relação ao dia anterior
Gráficos de séries temporais: Requests/1m, Errors/1m e taxa de erro, Latency/1m, utilização de CPU
Rankings Top 5: contagem de requisições, contagem de erros, latência média
O trace apresenta informações sobre chamadas upstream e downstream.
A página de detalhes do trace mostra o TraceID, duração total, quantidade de aplicações e número de spans na parte superior. A seção central contém um gráfico de Gantt com a linha do tempo dos spans, ilustrando a distribuição de duração de cada um. A árvore de chamadas no canto inferior esquerdo exibe o caminho completo, desde a entrada do gateway /console/api até os endpoints da API Dify e consultas ao banco de dados, em estrutura hierárquica. O painel de detalhes do span à direita apresenta atributos como nome da aplicação, endpoint, endereço IP, spanId, parentSpanId e código de status.
Etapa 2: Instrumentar o workflow do Dify
1.6.0 < versão do dify-api < 1.11.2
Para instrumentar uma única aplicação, consulte Enable observability for a Dify application e configure as definições da sua aplicação Dify.
Para instrumentar várias aplicações em massa, consulte Bulk integration for Dify LLM application monitoring.
Versão do dify-api <= 1.6.0 ou versão >= 1.11.2
A aplicação de workflow do Dify não exige configuração adicional. Caso tenha instrumentado o componente dify-api na etapa anterior, os dados de trace do workflow serão coletados e correlacionados automaticamente.
Versão do dify-api >= 1.13.0
Consulte Configurar OTel para Dify e defina as variáveis de ambiente necessárias no componente dify-worker. Para obter o endpoint OTel, consulte Prerequisites.
Visualizar dados de monitoramento do workflow
A página de detalhes da aplicação contém as seguintes abas: Overview, Performance Analysis, Token Analysis, LLM Operations, Provided Services, Dependent Services, Trace Analysis, Exception Analysis e Session Analysis. A aba Overview exibe os seguintes dados:
Cartões de métricas principais: Model Calls, Token Usage (com comparação diária), Traces, Spans, Sessions e Users
Gráfico de pizza com a distribuição de tipos de operação (TASK, TOOL, CHAIN, LLM, RETRIEVER)
Gráficos de linhas para média de chamadas LLM por requisição, tendência de contagem de requisições e tendência de contagem de sessões
Gráfico de barras Model Call Ranking (Top 5) e tabela Request Count User Ranking (Top 5)
Exemplo de detalhes do trace: os detalhes incluem informações de nós, como chamadas LLM, recuperação de dados e invocação de ferramentas.
A página de detalhes do trace exibe um gráfico cascata à esquerda, mostrando nós de etapas (tipos incluem CHAIN, TOOL, TASK, LLM e RETRIEVER), cada um com uma barra de tempo no gráfico de Gantt. O painel à direita apresenta informações detalhadas sobre o nó selecionado, incluindo nome da aplicação, endpoint, hostname, spanId, parentSpanId e código de status. A seção Additional Information, na parte inferior, permite visualizar o conteúdo das mensagens de entrada e saída do nó, como entrada JSON para análise de alertas e resultados de análise de causa raiz.
Etapa 3: Instrumentar o dify-plugin-daemon
-
Modifique o Dockerfile e recrie a imagem correspondente. O código abaixo mostra um exemplo de 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"]NotaA opção
INSTGO_EXTRA_RULESativa o monitoramento automático do runtime do plugin. Para impedir que o agent do plugin seja iniciado junto com o plugin-daemon, removaINSTGO_EXTRA_RULES="dify_python"do arquivo de build. -
Configure as variáveis de ambiente:
-
Para ambientes ECS:
Parâmetro
Valor
Descrição
ARMS_LICENSE_KEY
xxx@xxx
Sua License Key.
ARMS_REGION_ID
cn-heyuan
ID da sua região.
ARMS_ENABLE
true
Ativa ou desativa o agent.
ARMS_APP_NAME
dify-plugin-daemon
Nome da aplicação.
-
Para ambientes containerizados com ack-onepilot: na 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 de lista de aplicações, acesse a aplicação dify-plugin-daemon. A página de visão geral da aplicação exibe as seguintes informações:
Cartões de métricas: Requests, Errors, Average Latency e Instances, com variações diárias e semanais
Gráficos de tendência: gráfico de barras Requests/1m, gráfico de linhas Errors/1m, gráfico de linhas Latency/1m (com percentis P99, P90 e P75) e gráfico de anel Peak CPU Utilization
Painéis de ranking Top 5: Request Count, Error Count, Average Latency e Peak CPU Utilization by Instance
O gráfico cascata do trace mostra os detalhes da cadeia de chamadas do
insight-agent-plugin-daemon. Os principais spans incluem:GET (python/redis, 1,95 ms)
connect (python/sqlalchemy)
SELECT dify (sqlalchemy, 34,95 ms)
Chamadas em múltiplas camadas de
/v1/sandbox/run(POST httpx → SERVER go net_http_server → INTERNAL, aproximadamente 28–30 ms)UPDATE dify (sqlalchemy, 2,38 ms)
O painel de detalhes à direita exibe hostname, hora de início, hora de término, spanId, parentSpanId, código de status e uma lista de Attributes (como
net.protocol.name,component.nameeendpoint) para o span selecionado. -
Visualize os dados de monitoramento dos plugins. Após instale o agent, o plugin-daemon inicia automaticamente o agent para o runtime do plugin. Cada runtime de plugin corresponde a uma aplicação observável separada, nomeada no formato {plugin_daemon_name}_plugin_{plugin_name}_{plugin_version}. Por exemplo, se sua aplicação plugin-daemon se chama local-dify-plugin-daemon e você instalou a versão 0.0.53 do plugin tongyi, uma aplicação chamada local-dify-plugin-daemon_plugin_tongyi_0.0.53 será criada automaticamente. A página de visão geral do monitoramento de plugins exibe as seguintes informações:
Abas superiores: Application Overview, Application Topology, Provided Services, Dependent Services, Trace Analysis, Instance Monitoring, Scenario Analysis e Application Configuration
Cartões de métricas principais: requisições, erros, latência média e instâncias (com variações diárias e semanais)
Gráficos de séries temporais: tendências para contagem de requisições, contagem de erros, latência e pico de utilização de CPU
Rankings Top 5: contagem de requisições, contagem de erros e latência média, exibindo chamadas no nível de endpoint do plugin (como
invoke_llm,get_ai_model_schemaseinvoke_rerank)
(Opcional) Etapa 4: Monitorar o sandbox de código
O sandbox de código é o motor de execução de código do Dify, que execute códigos Python/Node.js dentro de um workflow. Use o Go agent para monitorar o sandbox. Para isso, modifique o Dockerfile, recrie a imagem e configure as variáveis de ambiente.
-
Modifique o arquivo build/build_[amd64|arm64].sh e recrie a imagem correspondente.
-
Adicione o comando para baixe o instgo. O código abaixo mostra um 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 -
Insira o comando
instgoantes dego build. O código abaixo mostra um exemplo para a arquitetura 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.
-
Para implantações em containers K8s: na 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" -
Para integração manual:
Parâmetro
Valor
Descrição
ARMS_LICENSE_KEY
xxx
Sua License Key.
ARMS_REGION_ID
cn-heyuan
ID da sua região.
ARMS_ENABLE
true
Ativa ou desativa o agent.
ARMS_APP_NAME
dify-plugin-daemon
Nome da aplicação.
-
-
Implante e visualize os dados de monitoramento do sandbox. Na página de lista de aplicações, acesse a aplicação dify-sandbox. A aba Application Overview exibe as seguintes métricas resumidas:
Requests: 3.051,00 (1,60% em relação ao dia anterior)
Errors: 0,00 (0% em relação ao dia anterior)
Average Latency: 47,7 ms (1,36% em relação ao dia anterior)
Instances: 9 (0% em relação à semana anterior)
Os gráficos de séries temporais mostram Requests/1m, Errors/1m, Latency/1m (com curvas P99, P90 e P75) e utilização de CPU. O ranking Top 5 Provided Services indica o caminho principal de requisições como
/v1/sandbox/run, com 3.051 requisições, 0 erros e latência média de 47,7 ms.A página de detalhes de trace do ARMS mostra um trace com duração total de 8,7 segundos, abrangendo 5 aplicações e 1.039 endpoints, com anomalias detectadas. As tags de componentes incluem redis (575), sqlalchemy (337), net_http_server (16) e httpx (14). O gráfico cascata de spans ilustra a cadeia de chamadas em múltiplas camadas, desde
SELECT difyaté/v1/sandbox/run POST 200, demonstrando o caminho completo da chamada do Dify ao sandbox. O painel de detalhes do span exibe o nome da aplicação insight-agent-sandbox, endpoint/v1/sandbox/run, hostnamesandbox-7489d68cd5-xcqv8, com código de status normal. A seção Attributes apresenta campos comonet.protocol.name,component.namee outras informações detalhadas.
(Opcional) Etapa 5: Monitorar o gateway de entrada Nginx
O Nginx atua como gateway de entrada do Dify. Problemas na configuração do Nginx podem causar timeouts e falhas no upload de arquivos para a base de conhecimento, plugins e workflows. Para monitorar o Nginx, consulte Trace Nginx with OpenTelemetry e utilize o método OpenTelemetry para reportar dados.
Configuração
Coleta de conteúdo de entrada/saída
Padrão: True (ativado por padrão).
Efeito ao desativar: para consultas de usuários e campos detalhados como entrada e saída de modelos, ferramentas e base de conhecimento, apenas o tamanho é coletado, não o conteúdo.
Como configure: defina a variável de ambiente OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=False.
Dividir aplicações LLM
Padrão: False (desativado por padrão).
Efeito ao ativar: os dados reportados são divididos em subaplicações LLM. Cada aplicação LLM, como um workflow, agente ou chatbot do Dify, corresponde a uma aplicação separada no ARMS.
Como configure: defina a variável de ambiente PROFILER_GENAI_SPLITAPP_ENABLE=True.
Regiões suportadas: China (Heyuan), Singapore.
Limite de comprimento do conteúdo da mensagem
Padrão: 4.000 caracteres.
Efeito ao ativar: limita o comprimento de cada campo de conteúdo de mensagem LLM, como input ou output. O conteúdo da mensagem que exceder o limite especificado será truncado.
Plugins aplicáveis: esta configuração é suportada atualmente apenas por Dify e LangChain.
Como configure: se a versão do seu agent for 1.8.3 ou superior, defina a variável de ambiente OTEL_INSTRUMENTATION_GENAI_MESSAGE_CONTENT_MAX_LENGTH=<integer_value>. Substitua <integer_value> pelo limite de caracteres desejado.
Limite de comprimento do valor de atributo do span
Padrão: sem limite.
Efeito ao ativar: limita o comprimento dos valores de atributos de span reportados, como gen_ai.agent.description. Valores de atributos que excederem o limite especificado serão truncados.
Plugins aplicáveis: esta configuração se aplica a todos os plugins compatíveis com OpenTelemetry, como LangChain, DashScope e Dify.
Como configure: defina a variável de ambiente OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT=<integer_value>. Substitua <integer_value> pelo limite de caracteres desejado.