OpenTelemetry for Node.js: Distributed Tracing in 15 Minutes
When a request is slow, where is the time going? Without tracing, you're guessing. OTel gives you a complete map of every operation with timing for each.
Auto-Instrumentation Setup
npm install @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node
// tracing.ts — load FIRST, before any other imports
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({
resource: new Resource({ [SEMRESATTRS_SERVICE_NAME]: 'api-server' }),
traceExporter: new OTLPTraceExporter({ url: process.env.OTEL_ENDPOINT }),
instrumentations: [getNodeAutoInstrumentations()],
});
sdk.start();
{ "scripts": { "start": "node --require ./tracing.js dist/server.js" } }
Automatically traces: HTTP requests, pg/mysql2/prisma queries, Redis, gRPC.
Custom Spans
const tracer = trace.getTracer('api-server');
async function processOrder(orderId: string) {
return tracer.startActiveSpan('processOrder', async (span) => {
span.setAttribute('order.id', orderId);
try {
const result = await doWork();
span.setStatus({ code: SpanStatusCode.OK });
return result;
} catch (err) {
span.recordException(err as Error);
span.setStatus({ code: SpanStatusCode.ERROR });
throw err;
} finally {
span.end();
}
});
}
Free Backends
- Jaeger (self-hosted): great for development
- Grafana Tempo: integrates with Grafana dashboards
- Honeycomb: best query experience, generous free tier
OTel setup, structured logging, and monitoring patterns are production-ready in the AI SaaS Starter Kit.
Top comments (0)