diff --git a/examples/basic-tracer-node/README.md b/examples/basic-tracer-node/README.md
index 8df783472eb..d7e0feb9eac 100644
--- a/examples/basic-tracer-node/README.md
+++ b/examples/basic-tracer-node/README.md
@@ -57,6 +57,17 @@ Click on the trace to view its details.
+### Export to multiple exporters
+
+ - Run the sample
+
+ ```sh
+ $ # from this directory
+ $ npm run multi_exporter
+ ```
+
+ This will export the spans data simultaneously on `Zipkin` and `Jaeger` backend. This is handy if transitioning from one vendor/OSS project to another for the tracing backend. You might want to export to both during the transitional phase.
+
## Useful links
- For more information on OpenTelemetry, visit:
- For more information on tracing, visit:
diff --git a/examples/basic-tracer-node/multi_exporter.js b/examples/basic-tracer-node/multi_exporter.js
new file mode 100644
index 00000000000..dc4c85474b8
--- /dev/null
+++ b/examples/basic-tracer-node/multi_exporter.js
@@ -0,0 +1,55 @@
+const opentelemetry = require('@opentelemetry/core');
+const { BasicTracer, BatchSpanProcessor, SimpleSpanProcessor } = require('@opentelemetry/tracing');
+const { JaegerExporter } = require('@opentelemetry/exporter-jaeger');
+const { ZipkinExporter } = require('@opentelemetry/exporter-zipkin');
+
+const tracer = new BasicTracer();
+
+const zipkinExporter = new ZipkinExporter({serviceName: 'basic-service'});
+const jaegerExporter = new JaegerExporter({
+ serviceName: 'basic-service',
+ // The default flush interval is 5 seconds.
+ flushInterval: 2000
+})
+
+// It is recommended to use this BatchSpanProcessor for better performance
+// and optimization, especially in production.
+tracer.addSpanProcessor(new BatchSpanProcessor(zipkinExporter, {
+ bufferSize: 10 // This is added for example, default size is 100.
+}));
+
+// It is recommended to use SimpleSpanProcessor in case of Jaeger exporter as
+// it's internal client already handles the spans with batching logic.
+tracer.addSpanProcessor(new SimpleSpanProcessor(jaegerExporter));
+
+// Initialize the OpenTelemetry APIs to use the BasicTracer bindings
+opentelemetry.initGlobalTracer(tracer);
+
+// Create a span. A span must be closed.
+const span = opentelemetry.getTracer().startSpan('main');
+for (let i = 0; i < 10; i++) {
+ doWork(span);
+}
+// Be sure to end the span.
+span.end();
+
+// flush and close the connection.
+zipkinExporter.shutdown();
+jaegerExporter.shutdown();
+
+function doWork(parent) {
+ // Start another span. In this example, the main method already started a
+ // span, so that'll be the parent span, and this will be a child span.
+ const span = opentelemetry.getTracer().startSpan('doWork', {
+ parent: parent
+ });
+
+ // simulate some random work.
+ for (let i = 0; i <= Math.floor(Math.random() * 40000000); i++) { }
+
+ // Set attributes to the span.
+ span.setAttribute('key', 'value');
+
+ // Annotate our span to capture metadata about our operation
+ span.addEvent('invoking doWork').end();
+}
diff --git a/examples/basic-tracer-node/package.json b/examples/basic-tracer-node/package.json
index a8b0ec329e1..77417ab385e 100644
--- a/examples/basic-tracer-node/package.json
+++ b/examples/basic-tracer-node/package.json
@@ -6,7 +6,8 @@
"main": "index.js",
"scripts": {
"zipkin:basic": "cross-env EXPORTER=zipkin node ./index.js",
- "jaeger:basic": "cross-env EXPORTER=jaeger node ./index.js"
+ "jaeger:basic": "cross-env EXPORTER=jaeger node ./index.js",
+ "multi_exporter": "node ./multi_exporter.js"
},
"repository": {
"type": "git",