Quando seus serviços Node.js crescem além de um único processo, diagnosticar latência e falhas entre limites de service exige rastreamento distribuído. O Managed Service for OpenTelemetry coleta dados de rastreamento da sua aplicação e fornece topologia da aplicação, análise de rastros, detecção de anomalias e transações lentas, além de análise de SQL. Este guia aborda duas abordagens de instrumentação para aplicações baseadas em Express: automática (sem código) e manual (nível de SDK).
Pré-requisitos
-
Node.js 14 ou superior
ImportanteSe a versão do seu Node.js for anterior à 14, use o Jaeger para relatar dados de rastreamento. Para mais informações, consulte Relatar dados de aplicação Node.js.
O endpoint e o token de autenticação obtidos no console do Managed Service for OpenTelemetry
Obtenha o endpoint
Faça login no console do Managed Service for OpenTelemetry.
No painel de navegação à esquerda, clique em Cluster Configurations. Na página exibida, clique em aba Access point information.
Na barra de navegação superior, selecione uma região. Na seção Cluster Information, ative Show Token.
Defina Client como OpenTelemetry.
-
Na coluna Related Information, copie o endpoint.

Se sua application executa em um ambiente de produção da Alibaba Cloud, utilize o endpoint da Virtual Private Cloud (VPC). Para todos os outros ambientes, use o endpoint público.
Código de exemplo
Baixe o projeto de exemplo completo em opentelemetry-nodejs-demo.
Instrumentação automática (recomendada)
A instrumentação automática adiciona rastreamento à sua aplicação sem exigir alterações no código. O pacote de auto-instrumentação do OpenTelemetry detecta frameworks compatíveis durante a inicialização e cria spans automaticamente.
Quando usar: Comece por aqui na maioria dos casos. A instrumentação automática é compatível com Express, Fastify, Koa e mais de 30 outros frameworks. Migre para a instrumentação manual apenas quando precisar de processadores de span personalizados, amostragem avançada ou controle refinado sobre a inicialização do SDK.
Passo 1: Instale as dependências
cd auto-instrumentation
npm init -y
npm install express axios
Passo 2: Instale os pacotes do OpenTelemetry
npm install --save @opentelemetry/api @opentelemetry/auto-instrumentations-node
Passo 3: Crie a aplicação
O exemplo abaixo cria um servidor Express básico com duas rotas:
"use strict";
const axios = require("axios").default;
const express = require("express");
const app = express();
app.get("/", async (req, res) => {
const result = await axios.get("http://localhost:7001/hello");
return res.status(201).send(result.data);
});
app.get("/hello", async (req, res) => {
console.log("hello world!")
res.json({ code: 200, msg: "success" });
});
app.use(express.json());
app.listen(7001, () => {
console.log("Listening on http://localhost:7001");
});
Passo 4: Defina variáveis de ambiente e inicie a aplicação
Configure as seguintes variáveis de ambiente e inicie a aplicação:
export OTEL_TRACES_EXPORTER="otlp"
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="<your-endpoint>"
export OTEL_NODE_RESOURCE_DETECTORS="env,host,os"
export OTEL_SERVICE_NAME="<your-service-name>"
export NODE_OPTIONS="--require @opentelemetry/auto-instrumentations-node/register"
node main.js
Substitua os placeholders abaixo pelos seus valores reais:
|
Placeholder |
Descrição |
Exemplo |
|
|
Endpoint HTTP obtido em Obtenha o endpoint |
|
|
|
Nome que identifica sua aplicação no console |
|
A tabela a seguir descreve cada variável de ambiente:
|
Variável |
Descrição |
|
|
Protocolo de exportação. Defina como |
|
|
Endpoint HTTP que recebe os dados de rastreamento. |
|
|
Detectores de recursos executados na inicialização. |
|
|
Nome do service exibido no console do Managed Service for OpenTelemetry. |
|
|
Carrega o módulo de auto-instrumentação antes do início da aplicação. |
Para detalhes sobre todas as variáveis de ambiente disponíveis no OpenTelemetry, consulte Configuração de instrumentação automática .
Passo 5: Gere dados de rastreamento
Envie uma requisição para gerar rastros:
curl localhost:7001/hello
Após a conclusão da requisição, o SDK exporta os dados de rastreamento para o Managed Service for OpenTelemetry.
Instrumentação manual
A instrumentação manual oferece controle total sobre a inicialização do SDK, incluindo processadores de span personalizados, amostragem avançada e configurações específicas da aplicação. Esta abordagem substitui a instrumentação automática — não utilize ambas simultaneamente.
A instrumentação manual utiliza gRPC como protocolo de exportação, enquanto a automática usa HTTP. Caso suas políticas de firewall não suportem gRPC, opte pela instrumentação automática com HTTP ou configure o exportador HTTP (@opentelemetry/exporter-trace-otlp-http).
Passo 1: Adicione as dependências do OpenTelemetry
Inclua as seguintes dependências no arquivo package.json:
"dependencies": {
"@opentelemetry/api": "^1.0.4",
"@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0",
"@opentelemetry/instrumentation": "^0.27.0",
"@opentelemetry/instrumentation-express": "^0.27.0",
"@opentelemetry/instrumentation-http": "^0.27.0",
"@opentelemetry/resources": "^1.0.1",
"@opentelemetry/sdk-trace-base": "^1.0.1",
"@opentelemetry/sdk-trace-node": "^1.0.1"
}
Passo 2: Crie o tracer provider
Importe e inicialize o tracer provider no topo do seu arquivo de entrada, antes de qualquer outra importação da aplicação. O OpenTelemetry precisa aplicar patches nas bibliotecas do framework antes que elas sejam carregadas. Uma ordem de inicialização incorreta é a causa mais comum de spans ausentes.
const { Resource } = require("@opentelemetry/resources");
const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node");
const {
SemanticResourceAttributes,
} = require("@opentelemetry/semantic-conventions");
const provider = new NodeTracerProvider({
resource: new Resource({
[SemanticResourceAttributes.HOST_NAME]: require("os").hostname(),
// Replace "opentelemetry-express" with your service name
[SemanticResourceAttributes.SERVICE_NAME]: "opentelemetry-express",
}),
});
Passo 3: Registre as instrumentações do framework
Registre as instrumentações de HTTP e Express para rastrear requisições de entrada e saída automaticamente:
const { registerInstrumentations } = require("@opentelemetry/instrumentation");
const { HttpInstrumentation } = require("@opentelemetry/instrumentation-http");
const {
ExpressInstrumentation,
} = require("@opentelemetry/instrumentation-express");
registerInstrumentations({
tracerProvider: provider,
instrumentations: [new HttpInstrumentation(), ExpressInstrumentation],
});
Para instrumentar outros frameworks Node.js, consulte o pacote OpenTelemetry auto-instrumentations-node e verifique os plugins disponíveis.
Passo 4: Configure o exportador
Configure um exportador OTLP via gRPC para enviar dados de rastreamento ao Managed Service for OpenTelemetry:
const metadata = new grpc.Metadata();
metadata.set("Authentication", "<your-token>");
const exporter = new OTLPTraceExporter({ url: "<your-endpoint>", metadata });
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));
provider.register();
Substitua os placeholders a seguir pelos seus valores reais:
|
Placeholder |
Descrição |
|
|
Endpoint gRPC obtido em Obtenha o endpoint |
|
|
Token de autenticação exibido após ativar Show Token |
Passo 5 (opcional): Adicione eventos e atributos personalizados
Anexe eventos e atributos ao span atual para fornecer contexto específico da aplicação:
const api = require("@opentelemetry/api");
const currentSpan = api.trace.getSpan(api.context.active());
// Add a timestamped event
currentSpan.addEvent("timestamp", { value: Date.now() });
// Add a custom attribute
currentSpan.setAttribute("tagKey-01", "tagValue-01");
Para mais informações sobre a API de rastreamento do OpenTelemetry, consulte o Guia de introdução ao OpenTelemetry JS .
Visualize dados de rastreamento no console ARMS
Faça login no console do Managed Service for OpenTelemetry.
No painel de navegação à esquerda, clique em Applications.
Clique em nome da sua aplicação para visualizar rastros, topologia e dados de desempenho.
Solução de problemas
A aplicação não aparece no console
Verifique se
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT(automático) ou o parâmetrourlemOTLPTraceExporter(manual) corresponde ao endpoint fornecido no console.Confirme a conectividade de rede com o endpoint. Se sua application roda fora da Alibaba Cloud, utilize o endpoint público em vez do endpoint VPC.
Certifique-se de que sua aplicação recebeu pelo menos uma requisição. O OpenTelemetry armazena spans em buffer antes de exportá-los.
Na instrumentação manual, confirme se o tracer provider foi inicializado antes de qualquer importação da aplicação. Ordem de inicialização incorreta resulta em spans ausentes.
Ative logs de depuração
Defina o nível de log do OpenTelemetry como debug para inspecionar o comportamento do SDK:
export OTEL_LOG_LEVEL=debug
Reinicie a aplicação e verifique a saída no console em busca de logs e erros de exportação de spans. Uma exportação bem-sucedida gera entradas de log semelhantes a:
@opentelemetry/api: Registered a global for diag v1.x.x
...
items to be sent [{"traceId":"...","spanId":"...","name":"GET /hello",...}]
Caso nenhuma entrada de span apareça, verifique se sua aplicação processou pelo menos uma requisição e se o endpoint está acessível.
Frameworks Node.js compatíveis
O OpenTelemetry fornece plugins de auto-instrumentação para os frameworks listados abaixo. Para a lista completa, consulte o repositório OpenTelemetry JS contrib.
Visualizar todos os frameworks compatíveis
|
Framework |
Pacote de instrumentação |
|
amqplib |
|
|
aws-lambda |
|
|
aws-sdk |
|
|
bunyan |
|
|
cassandra-driver |
|
|
connect |
|
|
cucumber |
|
|
dataloader |
|
|
dns |
|
|
express |
|
|
fastify |
|
|
generic-pool |
|
|
graphql |
|
|
grpc |
|
|
hapi |
|
|
http |
|
|
ioredis |
|
|
knex |
|
|
koa |
|
|
lru-memoizer |
|
|
memcached |
|
|
mongodb |
|
|
mongoose |
|
|
mysql |
|
|
mysql2 |
|
|
nestjs-core |
|
|
net |
|
|
pg |
|
|
pino |
|
|
redis |
|
|
restify |
|
|
socket.io |
|
|
winston |
Código de exemplo completo
O código abaixo combina todas as etapas de instrumentação manual em uma única aplicação Express executável. O exemplo utiliza o OTLPTraceExporter baseado em gRPC para enviar dados de rastreamento ao Managed Service for OpenTelemetry.
"use strict";
const { Resource } = require("@opentelemetry/resources");
const {
OTLPTraceExporter,
} = require("@opentelemetry/exporter-trace-otlp-grpc");
const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node");
const { SimpleSpanProcessor } = require("@opentelemetry/sdk-trace-base");
const {
ExpressInstrumentation,
} = require("@opentelemetry/instrumentation-express");
const { registerInstrumentations } = require("@opentelemetry/instrumentation");
const { HttpInstrumentation } = require("@opentelemetry/instrumentation-http");
const {
SemanticResourceAttributes,
} = require("@opentelemetry/semantic-conventions");
const grpc = require("@grpc/grpc-js");
// 1. Create a tracer provider with service metadata
const provider = new NodeTracerProvider({
resource: new Resource({
[SemanticResourceAttributes.HOST_NAME]: require("os").hostname(),
[SemanticResourceAttributes.SERVICE_NAME]: "opentelemetry-express",
}),
});
// 2. Register HTTP and Express instrumentations
registerInstrumentations({
tracerProvider: provider,
instrumentations: [new HttpInstrumentation(), ExpressInstrumentation],
});
// 3. Configure the gRPC exporter with authentication
const metadata = new grpc.Metadata();
metadata.set("Authentication", "<your-token>");
const exporter = new OTLPTraceExporter({ url: "<your-endpoint>", metadata });
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));
provider.register();
// 4. Application code (must come after provider registration)
const api = require("@opentelemetry/api");
const axios = require("axios").default;
const express = require("express");
const app = express();
app.get("/", async (req, res) => {
const result = await axios.get("http://localhost:7001/api");
return res.status(201).send(result.data);
});
app.get("/api", async (req, res) => {
const currentSpan = api.trace.getSpan(api.context.active());
currentSpan.addEvent("timestamp", { value: Date.now() });
currentSpan.setAttribute("tagKey-01", "tagValue-01");
res.json({ code: 200, msg: "success" });
});
app.use(express.json());
app.listen(7001, () => {
console.log("Listening on http://localhost:7001");
});
Substitua <your-token> e <your-endpoint> pelo token e endpoint gRPC obtidos em Obtenha o endpoint.