Noções Básicas de Observabilidade
8 exemplos para você começar com Observabilidade para backends Node.js - 6 básicos e 2 intermediários.
Busque em todas as páginas da documentação
8 exemplos para você começar com Observabilidade para backends Node.js - 6 básicos e 2 intermediários.
npm install @opentelemetry/api @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-nodeFixe o Node 24.18.0 e carregue o SDK OTel antes de outras importações nos pontos de entrada de produção.
Logs, métricas e traces descrevem o mesmo incidente de ângulos diferentes.
// Log (Pino)
logger.info({ requestId, statusCode: 200, durationMs: 45 }, "request_complete");
// Métrica (contador)
requestCounter.add(1, { method: "GET", route: "/users", status: "200" });
// Trace (atributo de span)
span.setAttribute("http.status_code", 200);Relacionado: Métricas que Importam - método RED
Liveness e readiness servem a diferentes sondas do orquestrador.
app.get("/health", (_req, res) => res.json({ ok: true }));
app.get("/ready", async (_req, res) => {
const dbOk = await db.ping();
res.status(dbOk ? 200 : 503).json({ ready: dbOk });
});/health - processo ativo (liveness). Sem verificações de dependência./ready - pode servir tráfego (readiness). Falha quando o DB está indisponível.error a cada sonda do kube - amostre ou use métricas.Relacionado: Noções Básicas de Resiliência - falhe rápido ao iniciar
Taxa (Rate), Erros (Errors), Duração (Duration) - métricas mínimas de serviço HTTP.
import { metrics } from "@opentelemetry/api";
const meter = metrics.getMeter("orders-api");
const requestDuration = meter.createHistogram("http.server.duration", { unit: "ms" });
const requestCount = meter.createCounter("http.server.requests");
function recordRequest(method: string, route: string, status: number, ms: number) {
requestCount.add(1, { method, route, status: String(status) });
requestDuration.record(ms, { method, route, status: String(status) });
}http.server.requests.status=5xx.Relacionado: SLOs e Orçamentos de Erro - SLO a partir de histogramas
Correlacione logs a traces em UIs de APM.
import { trace } from "@opentelemetry/api";
const span = trace.getActiveSpan();
const traceId = span?.spanContext().traceId;
logger.info({ trace_id: traceId, event: "payment_captured" }, "payment ok");trace_id.trace_id) entre os serviços.mixin do Pino pode injetar o trace_id automaticamente.Relacionado: IDs de Correlação de Requisição - requestId vs trace_id
Métricas não são apenas HTTP - rastreie eventos de domínio.
const ordersCreated = meter.createCounter("orders.created");
ordersCreated.add(1, { plan: "pro", region: "eu" });userId em cada métrica.Relacionado: Noções Básicas de Logging - nomenclatura de campos de evento
A auto-instrumentação perde os limites da sua lógica de negócios.
import { trace } from "@opentelemetry/api";
const tracer = trace.getTracer("billing");
async function capturePayment(orderId: string) {
return tracer.startActiveSpan("capturePayment", async (span) => {
span.setAttribute("order.id", orderId);
try {
return await stripeCapture(orderId);
} catch (err) {
span.recordException(err as Error);
span.setStatus({ code: 2 });
throw err;
} finally {
span.end();
}
});
}capturePayment), não nos detalhes internos da função.recordException anexa o erro ao trace para rastreamento de erros em APM.finally - evite spans vazados em retornos antecipados.Relacionado: OpenTelemetry Node SDK - configuração do SDK
Carregue a instrumentação antes das importações do Express/Fastify.
// src/instrumentation.ts - importe primeiro em main.ts
import { NodeSDK } from "@opentelemetry/sdk-node";
import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
const sdk = new NodeSDK({
traceExporter: new OTLPTraceExporter({
url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT ?? "http://localhost:4318/v1/traces",
}),
instrumentations: [getNodeAutoInstrumentations()],
});
sdk.start();instrumentation.ts deve carregar antes de import express no arquivo de entrada.fetch e drivers de banco de dados comuns.Relacionado: OpenTelemetry Node SDK - configuração completa
Notifique sobre queima de SLO, não sobre cada stack trace.
# Regra de alerta pseudo
alert: HighErrorRate
expr: rate(http_server_requests{status=~"5.."}[5m]) / rate(http_server_requests[5m]) > 0.05
for: 10mERROR única de um reinício de pod.Relacionado: Melhores Práticas de Observabilidade - regras de alerta
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (Active LTS), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026