diff --git a/experimental/packages/otlp-transformer/package.json b/experimental/packages/otlp-transformer/package.json index 7570d15051..04ee4c802e 100644 --- a/experimental/packages/otlp-transformer/package.json +++ b/experimental/packages/otlp-transformer/package.json @@ -21,6 +21,7 @@ "tdd": "npm run test -- --watch-extensions ts --watch", "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts'", "test:browser": "karma start --single-run", + "test:bench": "node test/performance/benchmark/index.js | tee .benchmark-results.txt", "prewatch": "node ../../../scripts/version-update.js", "watch": "tsc --build -w tsconfig.json tsconfig.esm.json tsconfig.esnext.json", "peer-api-check": "node ../../../scripts/peer-api-check.js", diff --git a/experimental/packages/otlp-transformer/test/performance/benchmark/index.js b/experimental/packages/otlp-transformer/test/performance/benchmark/index.js new file mode 100644 index 0000000000..e110bbe784 --- /dev/null +++ b/experimental/packages/otlp-transformer/test/performance/benchmark/index.js @@ -0,0 +1,61 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const Benchmark = require('benchmark'); +const { createExportTraceServiceRequest } = require('../../../build/src'); +const { BasicTracerProvider } = require('@opentelemetry/sdk-trace-base'); + +const tracerProvider = new BasicTracerProvider(); +const tracer = tracerProvider.getTracer('test') + +const suite = new Benchmark.Suite(); + +const span = createSpan(); +const spans = []; +for (let i = 0; i < 100; i++) { + spans.push(createSpan()); +} + +suite.on('cycle', event => { + console.log(String(event.target)); +}); + +suite.add('transform 1 span', function() { + createExportTraceServiceRequest([span]); +}); + +suite.add('transform 100 spans', function() { + createExportTraceServiceRequest(spans); +}); + +suite.run(); + +function createSpan() { + const span = tracer.startSpan('span'); + span.setAttribute('aaaaaaaaaaaaaaaaaaaa', 'aaaaaaaaaaaaaaaaaaaa'); + span.setAttribute('bbbbbbbbbbbbbbbbbbbb', 'bbbbbbbbbbbbbbbbbbbb'); + span.setAttribute('cccccccccccccccccccc', 'cccccccccccccccccccc'); + span.setAttribute('dddddddddddddddddddd', 'dddddddddddddddddddd'); + span.setAttribute('eeeeeeeeeeeeeeeeeeee', 'eeeeeeeeeeeeeeeeeeee'); + span.setAttribute('ffffffffffffffffffff', 'ffffffffffffffffffff'); + span.setAttribute('gggggggggggggggggggg', 'gggggggggggggggggggg'); + span.setAttribute('hhhhhhhhhhhhhhhhhhhh', 'hhhhhhhhhhhhhhhhhhhh'); + span.setAttribute('iiiiiiiiiiiiiiiiiiii', 'iiiiiiiiiiiiiiiiiiii'); + span.setAttribute('jjjjjjjjjjjjjjjjjjjj', 'jjjjjjjjjjjjjjjjjjjj'); + span.end(); + + return span; +} diff --git a/packages/opentelemetry-sdk-trace-base/test/performance/benchmark/BatchSpanProcessor.js b/packages/opentelemetry-sdk-trace-base/test/performance/benchmark/BatchSpanProcessor.js new file mode 100644 index 0000000000..ccdb82d481 --- /dev/null +++ b/packages/opentelemetry-sdk-trace-base/test/performance/benchmark/BatchSpanProcessor.js @@ -0,0 +1,64 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const Benchmark = require('benchmark'); +const { BasicTracerProvider, BatchSpanProcessor } = require('../../../build/src'); +const { ExportResultCode } = require('@opentelemetry/core'); + +class NoopExporter { + export(spans, resultCallback) { + setTimeout(() => resultCallback({ code: ExportResultCode.SUCCESS }), 0); + } + + shutdown() { + return this.forceFlush(); + } + + forceFlush() { + return Promise.resolve(); + } +} + +function createSpan() { + const span = tracer.startSpan('span'); + span.setAttribute('aaaaaaaaaaaaaaaaaaaa', 'aaaaaaaaaaaaaaaaaaaa'); + span.setAttribute('bbbbbbbbbbbbbbbbbbbb', 'aaaaaaaaaaaaaaaaaaaa'); + span.setAttribute('cccccccccccccccccccc', 'aaaaaaaaaaaaaaaaaaaa'); + span.setAttribute('dddddddddddddddddddd', 'aaaaaaaaaaaaaaaaaaaa'); + span.setAttribute('eeeeeeeeeeeeeeeeeeee', 'aaaaaaaaaaaaaaaaaaaa'); + span.setAttribute('ffffffffffffffffffff', 'aaaaaaaaaaaaaaaaaaaa'); + span.setAttribute('gggggggggggggggggggg', 'aaaaaaaaaaaaaaaaaaaa'); + span.setAttribute('hhhhhhhhhhhhhhhhhhhh', 'aaaaaaaaaaaaaaaaaaaa'); + span.setAttribute('iiiiiiiiiiiiiiiiiiii', 'aaaaaaaaaaaaaaaaaaaa'); + span.setAttribute('jjjjjjjjjjjjjjjjjjjj', 'aaaaaaaaaaaaaaaaaaaa'); + span.end(); +} + +const tracerProvider = new BasicTracerProvider(); +tracerProvider.addSpanProcessor(new BatchSpanProcessor(new NoopExporter())); +const tracer = tracerProvider.getTracer('test') + +const suite = new Benchmark.Suite('BatchSpanProcessor'); + +suite.on('cycle', event => { + console.log(String(event.target)); +}); + +suite.add('BatchSpanProcessor process span', function() { + createSpan(); +}); + +suite.run(); diff --git a/packages/opentelemetry-sdk-trace-base/test/performance/benchmark/index.js b/packages/opentelemetry-sdk-trace-base/test/performance/benchmark/index.js index 83558ea01f..1307732495 100644 --- a/packages/opentelemetry-sdk-trace-base/test/performance/benchmark/index.js +++ b/packages/opentelemetry-sdk-trace-base/test/performance/benchmark/index.js @@ -15,3 +15,4 @@ */ require('./span'); +require('./BatchSpanProcessor'); diff --git a/packages/opentelemetry-sdk-trace-base/test/performance/benchmark/span.js b/packages/opentelemetry-sdk-trace-base/test/performance/benchmark/span.js index ac978a6140..851123c392 100644 --- a/packages/opentelemetry-sdk-trace-base/test/performance/benchmark/span.js +++ b/packages/opentelemetry-sdk-trace-base/test/performance/benchmark/span.js @@ -38,6 +38,7 @@ suite.add('create spans (10 attributes)', function() { span.setAttribute('hhhhhhhhhhhhhhhhhhhh', 'aaaaaaaaaaaaaaaaaaaa'); span.setAttribute('iiiiiiiiiiiiiiiiiiii', 'aaaaaaaaaaaaaaaaaaaa'); span.setAttribute('jjjjjjjjjjjjjjjjjjjj', 'aaaaaaaaaaaaaaaaaaaa'); + span.end(); }); suite.run();