SDK de Node para OpenTelemetry
Instrumenta servicios Node.js 24 con el SDK de Node para OpenTelemetry: instrumenta automáticamente HTTP y controladores de bases de datos, exporta trazas OTLP y añade spans manuales para la lógica de negocio.
Busca en todas las páginas de la documentación
Instrumenta servicios Node.js 24 con el SDK de Node para OpenTelemetry: instrumenta automáticamente HTTP y controladores de bases de datos, exporta trazas OTLP y añade spans manuales para la lógica de negocio.
Tarjeta de receta de referencia rápida: lista para copiar y pegar.
// src/instrumentation.ts
import { NodeSDK } from "@opentelemetry/sdk-node";
import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
import { Resource } from "@opentelemetry/resources";
import { ATTR_SERVICE_NAME } from "@opentelemetry/semantic-conventions";
const sdk = new NodeSDK({
resource: new Resource({ [ATTR_SERVICE_NAME]: "orders-api" }),
traceExporter: new OTLPTraceExporter(),
instrumentations: [getNodeAutoInstrumentations()],
});
sdk.start();// src/main.ts
import "./instrumentation.js";
import { startServer } from "./server.js";
startServer();Cuándo usarlo:
console.time en producción.// instrumentation.ts
import { NodeSDK } from "@opentelemetry/sdk-node";
import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http";
import { PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics";
import { Resource } from "@opentelemetry/resources";
import {
ATTR_SERVICE_NAME,
ATTR_SERVICE_VERSION,
} from "@opentelemetry/semantic-conventions";
const sdk = new NodeSDK({
resource: new Resource({
[ATTR_SERVICE_NAME]: process.env.OTEL_SERVICE_NAME ?? "orders-api",
[ATTR_SERVICE_VERSION]: process.env.APP_VERSION ?? "0.0.0",
}),
traceExporter: new OTLPTraceExporter({
url: process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,
}),
metricReader: new PeriodicExportingMetricReader({
exporter: new OTLPMetricExporter({
url: process.env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT,
}),
exportIntervalMillis: 60_000,
}),
instrumentations: [
getNodeAutoInstrumentations({
"@opentelemetry/instrumentation-fs": { enabled: false },
}),
],
});
sdk.start();
process.on("SIGTERM", () => sdk.shutdown());// server.ts
import express from "express";
import { trace } from "@opentelemetry/api";
const app = express();
const tracer = trace.getTracer("orders");
app.get("/orders/:id", async (req, res) => {
await tracer.startActiveSpan("loadOrder", async (span) => {
span.setAttribute("order.id", req.params.id);
const order = await db.findOrder(req.params.id);
res.json(order);
});
});
app.listen(3000);Lo que esto demuestra:
sdk.shutdown() elegante en SIGTERM vacía los spans pendientes.@opentelemetry/api.http, https, fetch, pg, ioredis, etc. en el momento de la importación.traceparent de W3C propaga el contexto a las llamadas HTTP posteriores.| Variable | Propósito |
|---|---|
OTEL_SERVICE_NAME | Atributo de recurso service.name |
OTEL_EXPORTER_OTLP_ENDPOINT | URL base de OTLP |
OTEL_TRACES_SAMPLER | parentbased_traceidratio etc. |
OTEL_NODE_RESOURCE_DETECTORS | cloud, container, host |
// CORRECTO
import "./instrumentation";
import express from "express";
// INCORRECTO - spans HTTP perdidos
import express from "express";
import "./instrumentation";import "./instrumentation" en la primera línea de main.ts.node --import ./src/instrumentation.ts src/main.ts.OTEL_TRACES_SAMPLER=parentbased_traceidratio
OTEL_TRACES_SAMPLER_ARG=0.1userId en cada span dispara el costo. Solución: solo atributos de baja cardinalidad.readFile. Solución: deshabilita @opentelemetry/instrumentation-fs.sdk.shutdown() en el manejador de terminación.OTEL_TRACES_EXPORTER=none localmente o ejecuta Jaeger docker.| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| SDK de OTel Node | Neutral al proveedor, multi-señal | Un agente de un solo proveedor sin configuración es suficiente |
| Datadog dd-trace | Todo en Datadog APM | Quieres portabilidad OTLP |
| Agente de New Relic | Stack solo de NR | OTLP multi-backend |
| Solo registros manuales | Herramienta interna pequeña | APIs de SLA de producción |
@opentelemetry/sdk-node, @opentelemetry/auto-instrumentations-node, exportadores OTLP, @opentelemetry/api para spans manuales.
Sí. La instrumentación automática de HTTP cubre el servidor subyacente de Fastify. Carga la instrumentación antes de la importación de Fastify.
El SDK de logs de OTel está evolucionando. La mayoría de los equipos usan Pino stdout + inyección de trace_id para la correlación de logs y trazas.
Instrumentación de la comunidad o spans manuales alrededor de las consultas. Habilita @opentelemetry/instrumentation-pg para controladores SQL puros.
Ejecuta el colector con el receptor OTLP en 4318. Apunta OTEL_EXPORTER_OTLP_ENDPOINT allí.
opentelemetry-instrumentation-nestjs-core o spans manuales en interceptores. Aún así, carga el SDK primero en main.ts.
Típicamente un bajo porcentaje de un solo dígito con muestreo. Perfila con y sin en staging a pico de RPS.
service.name separado (por ejemplo, orders-worker). Inicia el SDK en la entrada del worker de la misma manera que HTTP.
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 16 jul 2026