diff --git a/packages/opentelemetry-api/src/context/context.ts b/packages/opentelemetry-api/src/context/context.ts index 4dc2b4c47c..86e7aabec3 100644 --- a/packages/opentelemetry-api/src/context/context.ts +++ b/packages/opentelemetry-api/src/context/context.ts @@ -15,7 +15,8 @@ */ import { Context, createContextKey } from '@opentelemetry/context-base'; -import { Baggage, NoopSpan, Span, SpanContext } from '../'; +import { Baggage, Span, SpanContext } from '../'; +import { NoopSpan } from '../trace/NoopSpan'; /** * span key diff --git a/packages/opentelemetry-api/src/index.ts b/packages/opentelemetry-api/src/index.ts index 4c6b64ffd6..b3cbbd0f0f 100644 --- a/packages/opentelemetry-api/src/index.ts +++ b/packages/opentelemetry-api/src/index.ts @@ -26,7 +26,6 @@ export * from './trace/Event'; export * from './trace/link_context'; export * from './trace/link'; export * from './trace/NoopLogger'; -export * from './trace/NoopSpan'; export * from './trace/NoopTracer'; export * from './trace/NoopTracerProvider'; export * from './trace/ProxyTracer'; diff --git a/packages/opentelemetry-api/src/trace/NoopSpan.ts b/packages/opentelemetry-api/src/trace/NoopSpan.ts index 85406098e1..40f238d3ad 100644 --- a/packages/opentelemetry-api/src/trace/NoopSpan.ts +++ b/packages/opentelemetry-api/src/trace/NoopSpan.ts @@ -73,5 +73,3 @@ export class NoopSpan implements Span { // By default does nothing recordException(_exception: Exception, _time?: TimeInput): void {} } - -export const NOOP_SPAN = new NoopSpan(); diff --git a/packages/opentelemetry-api/src/trace/NoopTracer.ts b/packages/opentelemetry-api/src/trace/NoopTracer.ts index bb25bcbe1d..683a7e5ab2 100644 --- a/packages/opentelemetry-api/src/trace/NoopTracer.ts +++ b/packages/opentelemetry-api/src/trace/NoopTracer.ts @@ -16,7 +16,7 @@ import { Span, SpanOptions, Tracer, SpanContext } from '..'; import { Context } from '@opentelemetry/context-base'; -import { NoopSpan, NOOP_SPAN } from './NoopSpan'; +import { NoopSpan } from './NoopSpan'; import { isSpanContextValid } from './spancontext-utils'; import { getSpanContext } from '../context/context'; @@ -28,7 +28,7 @@ export class NoopTracer implements Tracer { startSpan(name: string, options?: SpanOptions, context?: Context): Span { const root = Boolean(options?.root); if (root) { - return NOOP_SPAN; + return new NoopSpan(); } const parentFromContext = context && getSpanContext(context); @@ -39,7 +39,7 @@ export class NoopTracer implements Tracer { ) { return new NoopSpan(parentFromContext); } else { - return NOOP_SPAN; + return new NoopSpan(); } } } diff --git a/packages/opentelemetry-api/test/api/api.test.ts b/packages/opentelemetry-api/test/api/api.test.ts index b3e7728095..609077f93e 100644 --- a/packages/opentelemetry-api/test/api/api.test.ts +++ b/packages/opentelemetry-api/test/api/api.test.ts @@ -17,7 +17,6 @@ import * as assert from 'assert'; import api, { TraceFlags, - NoopSpan, NoopTracerProvider, NoopTracer, SpanOptions, @@ -33,6 +32,7 @@ import api, { defaultTextMapSetter, defaultTextMapGetter, } from '../../src'; +import { NoopSpan } from '../../src/trace/NoopSpan'; describe('API', () => { it('should expose a tracer provider via getTracerProvider', () => { diff --git a/packages/opentelemetry-api/test/noop-implementations/noop-span.test.ts b/packages/opentelemetry-api/test/noop-implementations/noop-span.test.ts index f05beae0b7..d2974fca7e 100644 --- a/packages/opentelemetry-api/test/noop-implementations/noop-span.test.ts +++ b/packages/opentelemetry-api/test/noop-implementations/noop-span.test.ts @@ -19,9 +19,9 @@ import { SpanStatusCode, INVALID_SPANID, INVALID_TRACEID, - NoopSpan, TraceFlags, } from '../../src'; +import { NoopSpan } from '../../src/trace/NoopSpan'; describe('NoopSpan', () => { it('do not crash', () => { diff --git a/packages/opentelemetry-api/test/noop-implementations/noop-tracer.test.ts b/packages/opentelemetry-api/test/noop-implementations/noop-tracer.test.ts index 3730968323..661ff34dbc 100644 --- a/packages/opentelemetry-api/test/noop-implementations/noop-tracer.test.ts +++ b/packages/opentelemetry-api/test/noop-implementations/noop-tracer.test.ts @@ -17,28 +17,26 @@ import * as assert from 'assert'; import { NoopTracer, - NOOP_SPAN, SpanContext, SpanKind, TraceFlags, context, setSpanContext, } from '../../src'; +import { NoopSpan } from '../../src/trace/NoopSpan'; describe('NoopTracer', () => { it('should not crash', () => { const tracer = new NoopTracer(); - assert.deepStrictEqual(tracer.startSpan('span-name'), NOOP_SPAN); - assert.deepStrictEqual( - tracer.startSpan('span-name1', { kind: SpanKind.CLIENT }), - NOOP_SPAN + assert.ok(tracer.startSpan('span-name') instanceof NoopSpan); + assert.ok( + tracer.startSpan('span-name1', { kind: SpanKind.CLIENT }) instanceof + NoopSpan ); - assert.deepStrictEqual( - tracer.startSpan('span-name2', { - kind: SpanKind.CLIENT, - }), - NOOP_SPAN + assert.ok( + tracer.startSpan('span-name2', { kind: SpanKind.CLIENT }) instanceof + NoopSpan ); }); diff --git a/packages/opentelemetry-api/test/proxy-implementations/proxy-tracer.test.ts b/packages/opentelemetry-api/test/proxy-implementations/proxy-tracer.test.ts index 9170f3e44a..c6e2756ca5 100644 --- a/packages/opentelemetry-api/test/proxy-implementations/proxy-tracer.test.ts +++ b/packages/opentelemetry-api/test/proxy-implementations/proxy-tracer.test.ts @@ -17,8 +17,6 @@ import * as assert from 'assert'; import * as sinon from 'sinon'; import { - NoopSpan, - NOOP_SPAN, ProxyTracerProvider, SpanKind, TracerProvider, @@ -29,6 +27,7 @@ import { ROOT_CONTEXT, SpanOptions, } from '../../src'; +import { NoopSpan } from '../../src/trace/NoopSpan'; describe('ProxyTracer', () => { let provider: ProxyTracerProvider; @@ -52,16 +51,14 @@ describe('ProxyTracer', () => { it('startSpan should return Noop Spans', () => { const tracer = provider.getTracer('test'); - assert.deepStrictEqual(tracer.startSpan('span-name'), NOOP_SPAN); - assert.deepStrictEqual( - tracer.startSpan('span-name1', { kind: SpanKind.CLIENT }), - NOOP_SPAN + assert.ok(tracer.startSpan('span-name') instanceof NoopSpan); + assert.ok( + tracer.startSpan('span-name1', { kind: SpanKind.CLIENT }) instanceof + NoopSpan ); - assert.deepStrictEqual( - tracer.startSpan('span-name2', { - kind: SpanKind.CLIENT, - }), - NOOP_SPAN + assert.ok( + tracer.startSpan('span-name2', { kind: SpanKind.CLIENT }) instanceof + NoopSpan ); }); }); diff --git a/packages/opentelemetry-instrumentation-http/src/http.ts b/packages/opentelemetry-instrumentation-http/src/http.ts index f04d7de7e2..ca61b947e9 100644 --- a/packages/opentelemetry-instrumentation-http/src/http.ts +++ b/packages/opentelemetry-instrumentation-http/src/http.ts @@ -25,7 +25,7 @@ import { ROOT_CONTEXT, getSpan, suppressInstrumentation, - NoopSpan, + NOOP_TRACER, } from '@opentelemetry/api'; import type * as http from 'http'; import type * as https from 'https'; @@ -587,7 +587,7 @@ export class HttpInstrumentation extends InstrumentationBase { if (requireParent === true && currentSpan === undefined) { // TODO: Refactor this when a solution is found in // https://github.com/open-telemetry/opentelemetry-specification/issues/530 - span = new NoopSpan(); + span = NOOP_TRACER.startSpan(name, options); } else if (requireParent === true && currentSpan?.context().isRemote) { span = currentSpan; } else { diff --git a/packages/opentelemetry-instrumentation-http/test/functionals/http-disable.test.ts b/packages/opentelemetry-instrumentation-http/test/functionals/http-disable.test.ts index 1fff7ea5a0..722922b26f 100644 --- a/packages/opentelemetry-instrumentation-http/test/functionals/http-disable.test.ts +++ b/packages/opentelemetry-instrumentation-http/test/functionals/http-disable.test.ts @@ -57,7 +57,7 @@ describe('HttpInstrumentation', () => { }); beforeEach(() => { - NOOP_TRACER.startSpan = sinon.spy(); + sinon.spy(NOOP_TRACER, 'startSpan'); }); afterEach(() => { diff --git a/packages/opentelemetry-instrumentation-http/test/functionals/https-disable.test.ts b/packages/opentelemetry-instrumentation-http/test/functionals/https-disable.test.ts index 795b304de6..254c6eda18 100644 --- a/packages/opentelemetry-instrumentation-http/test/functionals/https-disable.test.ts +++ b/packages/opentelemetry-instrumentation-http/test/functionals/https-disable.test.ts @@ -66,7 +66,7 @@ describe('HttpsInstrumentation', () => { }); beforeEach(() => { - NOOP_TRACER.startSpan = sinon.spy(); + sinon.spy(NOOP_TRACER, 'startSpan'); }); afterEach(() => { diff --git a/packages/opentelemetry-node/test/NodeTracerProvider.test.ts b/packages/opentelemetry-node/test/NodeTracerProvider.test.ts index aeb43ed3c1..2ebf4b7574 100644 --- a/packages/opentelemetry-node/test/NodeTracerProvider.test.ts +++ b/packages/opentelemetry-node/test/NodeTracerProvider.test.ts @@ -21,7 +21,6 @@ import { setSpan, setSpanContext, getSpan, - NoopSpan, } from '@opentelemetry/api'; import { AlwaysOnSampler, AlwaysOffSampler } from '@opentelemetry/core'; import { AsyncHooksContextManager } from '@opentelemetry/context-async-hooks'; @@ -121,7 +120,6 @@ describe('NodeTracerProvider', () => { logger: new NoopLogger(), }); const span = provider.getTracer('default').startSpan('my-span'); - assert.ok(span instanceof NoopSpan); assert.strictEqual(span.context().traceFlags, TraceFlags.NONE); assert.strictEqual(span.isRecording(), false); }); diff --git a/packages/opentelemetry-plugin-http/src/http.ts b/packages/opentelemetry-plugin-http/src/http.ts index 665c155bee..1efeb33dc1 100644 --- a/packages/opentelemetry-plugin-http/src/http.ts +++ b/packages/opentelemetry-plugin-http/src/http.ts @@ -25,7 +25,7 @@ import { ROOT_CONTEXT, getSpan, suppressInstrumentation, - NoopSpan, + NOOP_TRACER, } from '@opentelemetry/api'; import { BasePlugin } from '@opentelemetry/core'; import type { @@ -446,7 +446,7 @@ export class HttpPlugin extends BasePlugin { if (requireParent === true && currentSpan === undefined) { // TODO: Refactor this when a solution is found in // https://github.com/open-telemetry/opentelemetry-specification/issues/530 - span = new NoopSpan(); + span = NOOP_TRACER.startSpan(name, options); } else if (requireParent === true && currentSpan?.context().isRemote) { span = currentSpan; } else { diff --git a/packages/opentelemetry-plugin-http/test/functionals/http-disable.test.ts b/packages/opentelemetry-plugin-http/test/functionals/http-disable.test.ts index 9ed917b509..55b057dbc6 100644 --- a/packages/opentelemetry-plugin-http/test/functionals/http-disable.test.ts +++ b/packages/opentelemetry-plugin-http/test/functionals/http-disable.test.ts @@ -51,7 +51,7 @@ describe('HttpPlugin', () => { }); beforeEach(() => { - NOOP_TRACER.startSpan = sinon.spy(); + sinon.spy(NOOP_TRACER, 'startSpan'); }); afterEach(() => { diff --git a/packages/opentelemetry-tracing/src/Tracer.ts b/packages/opentelemetry-tracing/src/Tracer.ts index d4f80344b9..d35162fcc2 100644 --- a/packages/opentelemetry-tracing/src/Tracer.ts +++ b/packages/opentelemetry-tracing/src/Tracer.ts @@ -67,7 +67,7 @@ export class Tracer implements api.Tracer { ): api.Span { if (api.isInstrumentationSuppressed(context)) { this.logger.debug('Instrumentation suppressed, returning Noop Span'); - return api.NOOP_SPAN; + return api.NOOP_TRACER.startSpan(name, options, context); } const parentContext = getParent(options, context); @@ -103,7 +103,11 @@ export class Tracer implements api.Tracer { const spanContext = { traceId, spanId, traceFlags, traceState }; if (samplingResult.decision === api.SamplingDecision.NOT_RECORD) { this.logger.debug('Recording is off, starting no recording span'); - return new api.NoopSpan(spanContext); + return api.NOOP_TRACER.startSpan( + name, + options, + api.setSpanContext(context, spanContext) + ); } const span = new Span( diff --git a/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts b/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts index 7c43d868ac..b688f11ced 100644 --- a/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts +++ b/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts @@ -20,7 +20,6 @@ import { TraceFlags, ROOT_CONTEXT, NoopLogger, - NoopSpan, setSpan, setSpanContext, getSpan, @@ -258,13 +257,13 @@ describe('BasicTracerProvider', () => { assert.deepStrictEqual(context.traceState, undefined); }); - it('should return a no recording span when never sampling', () => { + it('should return a non recording span when never sampling', () => { const tracer = new BasicTracerProvider({ sampler: new AlwaysOffSampler(), logger: new NoopLogger(), }).getTracer('default'); const span = tracer.startSpan('my-span'); - assert.ok(span instanceof NoopSpan); + assert.ok(!span.isRecording()); const context = span.context(); assert.ok(context.traceId.match(/[a-f0-9]{32}/)); assert.ok(context.spanId.match(/[a-f0-9]{16}/)); diff --git a/packages/opentelemetry-tracing/test/Tracer.test.ts b/packages/opentelemetry-tracing/test/Tracer.test.ts index 288a823742..9f90c387d8 100644 --- a/packages/opentelemetry-tracing/test/Tracer.test.ts +++ b/packages/opentelemetry-tracing/test/Tracer.test.ts @@ -16,10 +16,8 @@ import * as assert from 'assert'; import { - NoopSpan, Sampler, SamplingDecision, - NOOP_SPAN, TraceFlags, ROOT_CONTEXT, suppressInstrumentation, @@ -79,7 +77,7 @@ describe('Tracer', () => { tracerProvider ); const span = tracer.startSpan('span1'); - assert.ok(span instanceof NoopSpan); + assert.ok(!span.isRecording()); span.end(); }); @@ -90,7 +88,7 @@ describe('Tracer', () => { tracerProvider ); const span = tracer.startSpan('span2'); - assert.ok(!(span instanceof NoopSpan)); + assert.ok(span.isRecording()); span.end(); }); @@ -130,7 +128,7 @@ describe('Tracer', () => { const span = tracer.startSpan('span3', undefined, context); - assert.equal(span, NOOP_SPAN); + assert.ok(!span.isRecording()); span.end(); done();