OpenTelemetry Node SDK
Instrumente serviços Node.js 24 com o OpenTelemetry Node SDK - auto-instrumente drivers HTTP e de banco de dados, exporte traces OTLP e adicione spans manuais para lógica de negócios.
Busque em todas as páginas da documentação
Instrumente serviços Node.js 24 com o OpenTelemetry Node SDK - auto-instrumente drivers HTTP e de banco de dados, exporte traces OTLP e adicione spans manuais para lógica de negócios.
Cartão de receita de referência rápida - pronto para copiar e colar.
// 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();Quando usar isso:
console.time ad-hoc em produção.// 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);O que isso demonstra:
sdk.shutdown() gracioso em SIGTERM descarrega spans pendentes.@opentelemetry/api global.http, https, fetch, pg, ioredis, etc. no momento do require.traceparent propaga o contexto para chamadas HTTP downstream.| Variável | Propósito |
|---|---|
OTEL_SERVICE_NAME | Atributo de recurso service.name |
OTEL_EXPORTER_OTLP_ENDPOINT | URL base OTLP |
OTEL_TRACES_SAMPLER | parentbased_traceidratio etc. |
OTEL_NODE_RESOURCE_DETECTORS | cloud, container, host |
// CORRETO
import "./instrumentation";
import express from "express";
// ERRADO - faltam spans HTTP
import express from "express";
import "./instrumentation";import "./instrumentation" primeira linha em main.ts.node --import ./src/instrumentation.ts src/main.ts.OTEL_TRACES_SAMPLER=parentbased_traceidratio
OTEL_TRACES_SAMPLER_ARG=0.1userId em cada span explode o custo. Correção: apenas atributos de baixa cardinalidade.readFile. Correção: desabilitar @opentelemetry/instrumentation-fs.sdk.shutdown() no manipulador de terminação.OTEL_TRACES_EXPORTER=none localmente ou execute Jaeger docker.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| OTel Node SDK | Neutro em relação ao fornecedor, multi-sinal | Agente de fornecedor único sem configuração é suficiente |
| Datadog dd-trace | Totalmente no Datadog APM | Deseja portabilidade OTLP |
| Agente New Relic | Pilha apenas NR | OTLP multi-backend |
| Apenas logs manuais | Ferramenta interna pequena | APIs de SLA de produção |
@opentelemetry/sdk-node, @opentelemetry/auto-instrumentations-node, exportadores OTLP, @opentelemetry/api para spans manuais.
Sim. A auto-instrumentação HTTP cobre o servidor subjacente do Fastify. Carregue a instrumentação antes do import do Fastify.
O SDK de logs OTel está evoluindo. A maioria das equipes usa Pino stdout + injeção de trace_id para correlação de log-trace.
Instrumentação da comunidade ou spans manuais em torno de consultas. Habilite @opentelemetry/instrumentation-pg para drivers SQL brutos.
Execute o collector com o receptor OTLP em 4318. Aponte OTEL_EXPORTER_OTLP_ENDPOINT para lá.
opentelemetry-instrumentation-nestjs-core ou spans manuais em interceptadores. Ainda carregue o SDK primeiro em main.ts.
Geralmente baixa porcentagem de um dígito com amostragem. Perfis com e sem em staging no RPS máximo.
service.name separado (por exemplo, orders-worker). Inicie o SDK no ponto de entrada do worker da mesma forma que o HTTP.
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (LTS Ativo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026