From f9db7e59f99c7ad21f6def7cd6ebf2b64ed724a8 Mon Sep 17 00:00:00 2001 From: Clark Jacobsohn Date: Tue, 3 Aug 2021 18:07:49 -0400 Subject: [PATCH] fix: respect sampled flag in Span Processors, fix associated tests --- .../src/export/BatchSpanProcessorBase.ts | 7 +++++- .../src/export/SimpleSpanProcessor.ts | 6 ++++- .../export/BatchSpanProcessorBase.test.ts | 24 +++++++++++++++++++ .../common/export/SimpleSpanProcessor.test.ts | 12 +++++++--- 4 files changed, 44 insertions(+), 5 deletions(-) diff --git a/packages/opentelemetry-tracing/src/export/BatchSpanProcessorBase.ts b/packages/opentelemetry-tracing/src/export/BatchSpanProcessorBase.ts index 03efc430bd2..0b5f41b4157 100644 --- a/packages/opentelemetry-tracing/src/export/BatchSpanProcessorBase.ts +++ b/packages/opentelemetry-tracing/src/export/BatchSpanProcessorBase.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { context } from '@opentelemetry/api'; +import { context, TraceFlags } from '@opentelemetry/api'; import { ExportResultCode, getEnv, @@ -77,6 +77,11 @@ export abstract class BatchSpanProcessorBase implements if (this._isShutdown) { return; } + + if (span.spanContext().traceFlags !== TraceFlags.SAMPLED) { + return; + } + this._addToBuffer(span); } diff --git a/packages/opentelemetry-tracing/src/export/SimpleSpanProcessor.ts b/packages/opentelemetry-tracing/src/export/SimpleSpanProcessor.ts index c92b869bad5..be362ea3f7d 100644 --- a/packages/opentelemetry-tracing/src/export/SimpleSpanProcessor.ts +++ b/packages/opentelemetry-tracing/src/export/SimpleSpanProcessor.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { context } from '@opentelemetry/api'; +import { context, TraceFlags } from '@opentelemetry/api'; import { ExportResultCode, globalErrorHandler, @@ -50,6 +50,10 @@ export class SimpleSpanProcessor implements SpanProcessor { return; } + if (span.spanContext().traceFlags !== TraceFlags.SAMPLED) { + return; + } + // prevent downstream exporter calls from generating spans context.with(suppressTracing(context.active()), () => { this._exporter.export([span], result => { diff --git a/packages/opentelemetry-tracing/test/common/export/BatchSpanProcessorBase.test.ts b/packages/opentelemetry-tracing/test/common/export/BatchSpanProcessorBase.test.ts index 7015d035951..84548e11e38 100644 --- a/packages/opentelemetry-tracing/test/common/export/BatchSpanProcessorBase.test.ts +++ b/packages/opentelemetry-tracing/test/common/export/BatchSpanProcessorBase.test.ts @@ -16,6 +16,7 @@ import { diag } from '@opentelemetry/api'; import { + AlwaysOffSampler, AlwaysOnSampler, ExportResultCode, loggingErrorHandler, @@ -38,6 +39,15 @@ function createSampledSpan(spanName: string): Span { return span as Span; } +function createUnsampledSpan(spanName: string): Span { + const tracer = new BasicTracerProvider({ + sampler: new AlwaysOffSampler(), + }).getTracer('default'); + const span = tracer.startSpan(spanName); + span.end(); + return span as Span; +} + class BatchSpanProcessor extends BatchSpanProcessorBase { onInit() {} onShutdown() {} @@ -141,6 +151,20 @@ describe('BatchSpanProcessorBase', () => { assert.strictEqual(exporter.getFinishedSpans().length, 0); }); + it('should not export unsampled spans', async () => { + const processor = new BatchSpanProcessor(exporter, defaultBufferConfig); + const spy: sinon.SinonSpy = sinon.spy(exporter, 'export') as any; + + const span = createUnsampledSpan(`${name}_0`); + + processor.onEnd(span); + + await processor.forceFlush(); + assert.strictEqual(processor['_finishedSpans'].length, 0); + assert.strictEqual(exporter.getFinishedSpans().length, 0); + assert.strictEqual(spy.args.length, 0); + }); + it('should export the sampled spans with buffer size reached', done => { const clock = sinon.useFakeTimers(); const processor = new BatchSpanProcessor(exporter, defaultBufferConfig); diff --git a/packages/opentelemetry-tracing/test/common/export/SimpleSpanProcessor.test.ts b/packages/opentelemetry-tracing/test/common/export/SimpleSpanProcessor.test.ts index df5fa66f817..a37ee12bd65 100644 --- a/packages/opentelemetry-tracing/test/common/export/SimpleSpanProcessor.test.ts +++ b/packages/opentelemetry-tracing/test/common/export/SimpleSpanProcessor.test.ts @@ -38,8 +38,14 @@ import { TestStackContextManager } from './TestStackContextManager'; import { TestTracingSpanExporter } from './TestTracingSpanExporter'; describe('SimpleSpanProcessor', () => { - const provider = new BasicTracerProvider(); - const exporter = new InMemorySpanExporter(); + let provider: BasicTracerProvider; + let exporter: InMemorySpanExporter; + + + beforeEach(() => { + provider = new BasicTracerProvider(); + exporter = new InMemorySpanExporter(); + }); describe('constructor', () => { it('should create a SimpleSpanProcessor instance', () => { @@ -103,7 +109,7 @@ describe('SimpleSpanProcessor', () => { const spanContext: SpanContext = { traceId: 'a3cda95b652f4a1592b449d5929fda1b', spanId: '5e0c63257de34c92', - traceFlags: TraceFlags.NONE, + traceFlags: TraceFlags.SAMPLED, }; const span = new Span( provider.getTracer('default'),