Todos los productos
Search
Centro de documentos

Application Real-Time Monitoring Service:Submit trace data from a Node.js application

Última actualización: Sep 14, 2026

Cuando los servicios de Node.js crecen más allá de un solo proceso, se requiere distributed tracing para diagnosticar la latencia y las fallas entre los límites de cada servicio. Managed Service for OpenTelemetry recopila los datos de trazas de su aplicación y proporciona topología de aplicaciones, análisis de trazas, detección de anomalías y transacciones lentas, además de análisis SQL. Esta guía aborda dos enfoques de instrumentación para aplicaciones basadas en Express: automática (sin código) y manual (a nivel de SDK).

Requisitos previos

  • Node.js 14 o posterior

    Importante

    Si su versión de Node.js es anterior a la 14, utilice Jaeger para reportar los datos de trazas. Para obtener más información, consulte Reporte de datos de aplicaciones Node.js.

  • El endpoint y el token de autenticación obtenidos desde la consola de Managed Service for OpenTelemetry

Obtención del endpoint

  1. Inicie sesión en la consola de Managed Service for OpenTelemetry.

  2. En el panel de navegación izquierdo, haga clic en Cluster Configurations. En la página que aparece, haga clic en la pestaña Access point information.

  3. En la barra de navegación superior, seleccione una región. En la sección Cluster Information, active Show Token.

  4. Establezca Client en OpenTelemetry.

  5. En la columna Related Information, copie el endpoint.

    Endpoint information

Si su aplicación se ejecuta en un entorno de producción de Alibaba Cloud, utilice el endpoint de Virtual Private Cloud (VPC). Para cualquier otro entorno, use el endpoint público.

Código de ejemplo

Descargue el proyecto de ejemplo completo desde opentelemetry-nodejs-demo.

Instrumentación automática (recomendada)

La instrumentación automática añade trazas a su aplicación sin modificar el código. El paquete de auto-instrumentación de OpenTelemetry detecta los framework compatibles durante el inicio y crea los spans automáticamente.

Cuándo usarla: Este es el punto de partida ideal para la mayoría de los casos. La instrumentación automática es compatible con Express, Fastify, Koa y más de 30 frameworks adicionales. Cambie a la instrumentación manual únicamente cuando necesite procesadores de spans personalizados, muestreo avanzado o un control detallado sobre la inicialización del SDK.

Paso 1: Instalar dependencias

cd auto-instrumentation
npm init -y
npm install express axios

Paso 2: Instalar paquetes de OpenTelemetry

npm install --save @opentelemetry/api @opentelemetry/auto-instrumentations-node

Paso 3: Crear la aplicación

A continuación se muestra un ejemplo que crea un servidor Express básico con dos rutas:

"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");
});

Paso 4: Establecer variables de entorno e iniciar la aplicación

Establezca a continuación las variables de entorno y luego inicie la aplicación:

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

Reemplace los siguientes marcadores de posición con sus valores reales:

Marcador de posición

Descripción

Ejemplo

<your-endpoint>

El endpoint HTTP obtenido en Obtención del endpoint

https://tracing-analysis-dc-hz.aliyuncs.com/...

<your-service-name>

Un nombre que identifica su aplicación en la consola

my-express-app

En la siguiente tabla se describe cada variable de entorno:

Variable

Descripción

OTEL_TRACES_EXPORTER

Protocolo de exportación. Establézcalo en otlp para usar el protocolo OpenTelemetry.

OTEL_EXPORTER_OTLP_TRACES_ENDPOINT

El endpoint HTTP que recibe los datos de trazas.

OTEL_NODE_RESOURCE_DETECTORS

Detectores de recursos que se ejecutan al inicio. env,host,os recopila metadatos del entorno, del host y del sistema operativo.

OTEL_SERVICE_NAME

El nombre del servicio que se muestra en la consola de Managed Service for OpenTelemetry.

NODE_OPTIONS

Carga el módulo de auto-instrumentación antes de que inicie la aplicación.

Para conocer los detalles de todas las variables de entorno disponibles en OpenTelemetry, consulte Configuración de instrumentación automática .

Paso 5: Generar datos de trazas

Envíe una solicitud para generar trazas:

curl localhost:7001/hello

Una vez que finaliza la solicitud, el SDK exporta los datos de trazas a Managed Service for OpenTelemetry.

Instrumentación manual

La instrumentación manual le otorga control total sobre la inicialización del SDK, lo que incluye procesadores de spans personalizados, muestreo avanzado y configuración específica de la aplicación. Este enfoque reemplaza a la instrumentación automática, por lo que no debe utilizar ambos métodos al mismo tiempo.

Importante

La instrumentación manual utiliza gRPC como protocolo de exportación, mientras que la automática emplea HTTP. Si las políticas de su firewall no admiten gRPC, utilice la instrumentación automática con HTTP o configure el exportador HTTP (@opentelemetry/exporter-trace-otlp-http) en su lugar.

Paso 1: Agregar dependencias de OpenTelemetry

Agregue a continuación las dependencias a su archivo 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"
}

Paso 2: Crear el proveedor de trazas

Importante

Importe e inicialice el proveedor de trazas al principio de su archivo de entrada, antes que cualquier otra importación de la aplicación. OpenTelemetry debe aplicar parches a las bibliotecas del framework antes de que estas se carguen. Un orden de inicialización incorrecto es la causa más común de spans faltantes.

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",
  }),
});

Paso 3: Registrar las instrumentaciones del framework

Registre las instrumentaciones de HTTP y Express para trazar automáticamente las solicitudes entrantes y salientes:

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 otros frameworks de Node.js, consulte el paquete OpenTelemetry auto-instrumentations-node , donde encontrará los complementos disponibles.

Paso 4: Configurar el exportador

Configure un exportador OTLP mediante gRPC para enviar los datos de trazas a 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();

Reemplace los siguientes marcadores de posición con sus valores reales:

Marcador de posición

Descripción

<your-endpoint>

El endpoint gRPC obtenido en Obtención del endpoint

<your-token>

El token de autenticación que se muestra después de activar Show Token

Paso 5 (opcional): Agregar eventos y atributos personalizados

Adjunte eventos y atributos al span actual para añadir contexto específico de la aplicación:

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 obtener más información sobre la API de trazas de OpenTelemetry, consulte la guía de introducción a OpenTelemetry JS .

Consulta de datos de trazas en la consola ARMS

  1. Inicie sesión en la consola de Managed Service for OpenTelemetry.

  2. En el panel de navegación izquierdo, haga clic en Applications.

  3. Haga clic en el nombre de su aplicación para consultar las trazas, la topología y los datos de rendimiento.

Solución de problemas

La aplicación no aparece en la consola

  • Compruebe que OTEL_EXPORTER_OTLP_TRACES_ENDPOINT (instrumentación automática) o el parámetro url en OTLPTraceExporter (instrumentación manual) coincida con el endpoint de la consola.

  • Verifique la conectividad de red hacia el endpoint. Si su aplicación se ejecuta fuera de Alibaba Cloud, utilice el endpoint público en lugar del endpoint VPC.

  • Asegúrese de que su aplicación haya recibido como mínimo una solicitud. OpenTelemetry almacena los spans en un búfer antes de exportarlos.

  • En el caso de la instrumentación manual, compruebe que el proveedor de trazas se inicializó antes que cualquier importación de la aplicación. Un orden de inicialización incorrecto provoca la ausencia de spans.

Habilitar el registro de depuración

Establezca el nivel de registro de OpenTelemetry en debug para inspeccionar el comportamiento del SDK:

export OTEL_LOG_LEVEL=debug

Reinicie la aplicación y revise la salida de la consola para buscar registros y errores de exportación de spans. Una exportación exitosa genera entradas de registro similares a las siguientes:

@opentelemetry/api: Registered a global for diag v1.x.x
...
items to be sent [{"traceId":"...","spanId":"...","name":"GET /hello",...}]

Si no aparecen entradas de spans, compruebe que su aplicación procesó como mínimo una solicitud y que el endpoint es accesible.

Frameworks de Node.js compatibles

OpenTelemetry proporciona complementos de auto-instrumentación para los siguientes frameworks. Para consultar la lista completa, visite el repositorio contrib de OpenTelemetry JS.

Consulte todos los frameworks compatibles

Framework

Paquete de instrumentación

amqplib

@opentelemetry/instrumentation-amqplib

aws-lambda

@opentelemetry/instrumentation-aws-lambda

aws-sdk

@opentelemetry/instrumentation-aws-sdk

bunyan

@opentelemetry/instrumentation-bunyan

cassandra-driver

@opentelemetry/instrumentation-cassandra-driver

connect

@opentelemetry/instrumentation-connect

cucumber

@opentelemetry/instrumentation-cucumber

dataloader

@opentelemetry/instrumentation-dataloader

dns

@opentelemetry/instrumentation-dns

express

@opentelemetry/instrumentation-express

fastify

@opentelemetry/instrumentation-fastify

generic-pool

@opentelemetry/instrumentation-generic-pool

graphql

@opentelemetry/instrumentation-graphql

grpc

@opentelemetry/instrumentation-grpc

hapi

@opentelemetry/instrumentation-hapi

http

@opentelemetry/instrumentation-http

ioredis

@opentelemetry/instrumentation-ioredis

knex

@opentelemetry/instrumentation-knex

koa

@opentelemetry/instrumentation-koa

lru-memoizer

@opentelemetry/instrumentation-lru-memoizer

memcached

@opentelemetry/instrumentation-memcached

mongodb

@opentelemetry/instrumentation-mongodb

mongoose

@opentelemetry/instrumentation-mongoose

mysql

@opentelemetry/instrumentation-mysql

mysql2

@opentelemetry/instrumentation-mysql2

nestjs-core

@opentelemetry/instrumentation-nestjs-core

net

@opentelemetry/instrumentation-net

pg

@opentelemetry/instrumentation-pg

pino

@opentelemetry/instrumentation-pino

redis

@opentelemetry/instrumentation-redis

restify

@opentelemetry/instrumentation-restify

socket.io

@opentelemetry/instrumentation-socket.io

winston

@opentelemetry/instrumentation-winston

Código de ejemplo completo

El siguiente código combina todos los pasos de la instrumentación manual en una única aplicación Express ejecutable. El ejemplo utiliza OTLPTraceExporter basado en gRPC para enviar los datos de trazas a 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");
});

Reemplace <your-token> y <your-endpoint> con el token y el endpoint gRPC que obtuvo en Obtención del endpoint.