From f48de819d19d9d6b12cca75aaf2bc1b79ac8db00 Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Wed, 13 Nov 2019 17:50:53 -0800 Subject: [PATCH 1/2] docs: add multi exporter example --- examples/basic-tracer-node/multi_exporter.js | 55 ++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 examples/basic-tracer-node/multi_exporter.js 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(); +} From fa36e9c2e5b53d8380fee47178da5e70d4e96af8 Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Wed, 13 Nov 2019 18:03:04 -0800 Subject: [PATCH 2/2] chore: add script and update readme --- examples/basic-tracer-node/README.md | 11 +++++++++++ examples/basic-tracer-node/package.json | 3 ++- 2 files changed, 13 insertions(+), 1 deletion(-) 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/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",