Wire AxonPushSpanExporter into a TypeScript/Node project's OpenTelemetry TracerProvider
Forward OpenTelemetry spans from a Node.js service into AxonPush via AxonPushSpanExporter.
AxonPushSpanExporter attached to the project's TracerProvider through a BatchSpanProcessorapp.span event with full traceId, spanId, attributes, events, and links preserved@opentelemetry/api and @opentelemetry/sdk-trace-base are optional peer dependencies. Install them alongside @axonpush/sdk:
bun add @axonpush/sdk @opentelemetry/api @opentelemetry/sdk-trace-base @opentelemetry/sdk-trace-node
# or pnpm / yarn / npm equivalents
import { AxonPush } from "@axonpush/sdk";
import { AxonPushSpanExporter } from "@axonpush/sdk/integrations/otel";
import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base";
import { Resource } from "@opentelemetry/resources";
import { SemanticResourceAttributes } from "@opentelemetry/semantic-conventions";
const axonpush = new AxonPush({
apiKey: process.env.AXONPUSH_API_KEY!,
tenantId: process.env.AXONPUSH_TENANT_ID!,
baseUrl: process.env.AXONPUSH_BASE_URL,
});
const provider = new NodeTracerProvider({
resource: new Resource({ [SemanticResourceAttributes.SERVICE_NAME]: "my-service" }),
});
provider.addSpanProcessor(
new BatchSpanProcessor(
new AxonPushSpanExporter({
client: axonpush,
channelId: Number(process.env.AXONPUSH_CHANNEL_ID),
serviceName: "my-service",
}),
),
);
provider.register();
Use this path when the project already registers a TracerProvider (e.g. via provider.register() or @opentelemetry/sdk-node). Attach to the existing provider rather than creating a second one.
import { trace } from "@opentelemetry/api";
import { BatchSpanProcessor, BasicTracerProvider } from "@opentelemetry/sdk-trace-base";
import { AxonPushSpanExporter } from "@axonpush/sdk/integrations/otel";
const provider = trace.getTracerProvider() as unknown as BasicTracerProvider;
provider.addSpanProcessor(
new BatchSpanProcessor(
new AxonPushSpanExporter({
client: axonpush,
channelId: Number(process.env.AXONPUSH_CHANNEL_ID),
serviceName: "my-service",
}),
),
);
@axonpush/sdk @opentelemetry/api @opentelemetry/sdk-trace-base @opentelemetry/sdk-trace-node using the project's package managerAXONPUSH_API_KEY, AXONPUSH_TENANT_ID, AXONPUSH_BASE_URL, AXONPUSH_CHANNEL_ID to .envTracerProvider already exists in the project (search for provider.register(), NodeTracerProvider(, NodeSDK(, or auto-instrumentation setup)AxonPushSpanExporter to it via BatchSpanProcessorservice.nameBatchSpanProcessor, never SimpleSpanProcessor, in productionnew AxonPush({ failOpen: true }) is the default. If AxonPush is unreachable the exporter silently drops spans — no application impact.