OpenTelemetry Node Tracing Spans
Instrument a Node service with OpenTelemetry tracing spans, nesting child spans across async boundaries and exporting OTLP batches.
Code
import { NodeSDK } from '@opentelemetry/sdk-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { trace, context, SpanStatusCode } from '@opentelemetry/api';
const sdk = new NodeSDK({
serviceName: 'orders-service',
traceExporter: new OTLPTraceExporter({
url: process.env.OTLP_ENDPOINT ?? 'http://collector:4318/v1/traces',
}),
instrumentations: [getNodeAutoInstrumentations()],
});
await sdk.start();
const tracer = trace.getTracer('orders', '1.0.0');
async function processOrder(orderId: string): Promise<void> {
return tracer.startActiveSpan('order.process', async (span) => {
span.setAttribute('order.id', orderId);
try {
await tracer.startActiveSpan('order.validate', async (child) => {
await new Promise((r) => setTimeout(r, 10));
child.setAttribute('validation.rules', 12);
child.end();
});
await tracer.startActiveSpan('order.charge', async (child) => {
await new Promise((r) => setTimeout(r, 25));
child.recordException(new Error('card declined simulated'));
child.setStatus({ code: SpanStatusCode.ERROR });
child.end();
});
span.setStatus({ code: SpanStatusCode.OK });
} catch (err) {
span.recordException(err as Error);
span.setStatus({ code: SpanStatusCode.ERROR });
} finally {
span.end();
}
});
}
await processOrder('ord-7');
await sdk.shutdown();Report a problem with this exampleOpens a pre-filled issue on GitHub.