Custom Exporters
Why Multiple Backends?
Multi-Exporter Setup
import { NodeSDK } from '@opentelemetry/sdk-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';
import { PrometheusExporter } from '@opentelemetry/exporter-prometheus';
import { PeriodicExportingMetricReader, ConsoleMetricExporter } from '@opentelemetry/sdk-metrics';
import { BatchSpanProcessor, ConsoleSpanExporter } from '@opentelemetry/sdk-trace-base';
const sdk = new NodeSDK({
// Multiple trace exporters
spanProcessors: [
// Primary: OTLP to Jaeger
new BatchSpanProcessor(
new OTLPTraceExporter({
url: 'http://localhost:4318/v1/traces',
})
),
// Development: Console for debugging
new BatchSpanProcessor(new ConsoleSpanExporter()),
],
// Multiple metric exporters
metricReader: new PeriodicExportingMetricReader({
exporter: new OTLPMetricExporter({
url: 'http://localhost:4318/v1/metrics',
}),
exportIntervalMillis: 60000, // Export every 60s
}),
});
// Also expose Prometheus scrape endpoint
const prometheusExporter = new PrometheusExporter({
port: 9464,
}, () => {
console.log('Prometheus endpoint: http://localhost:9464/metrics');
});
sdk.start();Cloud Provider Exporters
AWS CloudWatch (X-Ray)
Google Cloud Trace
Azure Monitor
Building a Custom Exporter
Filtering Spans Before Export
Enriching Spans Before Export
Batch Configuration
Exporter Error Handling
Multi-Environment Configuration
Production Multi-Backend Setup
Monitoring Exporter Health
Best Practices
What's Next
Last updated