feat(sdk-trace-base)!: remove `addSpanProcessor` API (#5152)

This commit is contained in:
David Luna 2024-11-14 17:10:14 +01:00 committed by GitHub
parent a833d9c443
commit b7343ef3e0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
25 changed files with 129 additions and 143 deletions

View File

@ -14,6 +14,7 @@
* refactor(resources)!: replace `ResourceAttributes` with `Attributes` [#5016](https://github.com/open-telemetry/opentelemetry-js/pull/5016) @david-luna
* feat(sdk-metrics)!: drop `View` and `Aggregation` in favor of `ViewOptions` and `AggregationOption` [#4931](https://github.com/open-telemetry/opentelemetry-js/pull/4931) @pichlermarc
* refactor(sdk-trace-base)!: remove `new Span` constructor in favor of `Tracer.startSpan` API [#5048](https://github.com/open-telemetry/opentelemetry-js/pull/5048) @david-luna
* refactor(sdk-trace-base)!: remove `BasicTracerProvider.addSpanProcessor` API in favor of constructor options. [#5134](https://github.com/open-telemetry/opentelemetry-js/pull/5134) @david-luna
### :rocket: (Enhancement)

View File

@ -11,14 +11,15 @@ import { SEMRESATTRS_SERVICE_NAME } from '@opentelemetry/semantic-conventions';
import http from 'http';
diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);
const exporter = new ConsoleSpanExporter();
const processor = new SimpleSpanProcessor(exporter);
const tracerProvider = new NodeTracerProvider({
resource: new Resource({
[SEMRESATTRS_SERVICE_NAME]: 'esm-http-ts-example',
}),
spanProcessors: [processor],
});
const exporter = new ConsoleSpanExporter();
const processor = new SimpleSpanProcessor(exporter);
tracerProvider.addSpanProcessor(processor);
tracerProvider.register();
registerInstrumentations({

View File

@ -138,8 +138,10 @@ const testCollectorExporter = (params: TestParams) => {
metadata: metadata,
});
const provider = new BasicTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(collectorExporter));
// @ts-expect-error -- we need to create a provider to test the exporter
const provider = new BasicTracerProvider({
spanProcessors: [new SimpleSpanProcessor(collectorExporter)],
});
done();
});
@ -271,8 +273,10 @@ const testCollectorExporter = (params: TestParams) => {
compression: CompressionAlgorithm.GZIP,
});
const provider = new BasicTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(collectorExporter));
// @ts-expect-error -- we need to create a provider to test the exporter
const provider = new BasicTracerProvider({
spanProcessors: [new SimpleSpanProcessor(collectorExporter)],
});
});
it('should successfully send the spans', done => {
const responseSpy = sinon.spy();

View File

@ -253,18 +253,17 @@ describe('fetch', () => {
}
fetchInstrumentation = new FetchInstrumentation(config);
webTracerProviderWithZone = new WebTracerProvider();
dummySpanExporter = new DummySpanExporter();
webTracerProviderWithZone = new WebTracerProvider({
spanProcessors: [new tracing.SimpleSpanProcessor(dummySpanExporter)],
});
registerInstrumentations({
tracerProvider: webTracerProviderWithZone,
instrumentations: [fetchInstrumentation],
});
webTracerWithZone = webTracerProviderWithZone.getTracer('fetch-test');
dummySpanExporter = new DummySpanExporter();
exportSpy = sinon.stub(dummySpanExporter, 'export');
clearResourceTimingsSpy = sinon.stub(performance, 'clearResourceTimings');
webTracerProviderWithZone.addSpanProcessor(
new tracing.SimpleSpanProcessor(dummySpanExporter)
);
// endSpan is called after the whole response body is read
// this process is scheduled at the same time the fetch promise is resolved

View File

@ -154,9 +154,10 @@ function shouldNotCreateSpans(
describe('#grpc-protobuf', () => {
let client: GrpcTesterClient;
let server: grpc.Server;
const provider = new NodeTracerProvider();
let contextManager: ContextManager;
provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));
const provider = new NodeTracerProvider({
spanProcessors: [new SimpleSpanProcessor(memoryExporter)],
});
before(() => {
propagation.setGlobalPropagator(new W3CTraceContextPropagator());

View File

@ -755,8 +755,9 @@ export const runTests = (
};
describe('enable()', () => {
const provider = new NodeTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));
const provider = new NodeTracerProvider({
spanProcessors: [new SimpleSpanProcessor(memoryExporter)],
});
beforeEach(() => {
memoryExporter.reset();
});
@ -799,8 +800,9 @@ export const runTests = (
});
describe('disable()', () => {
const provider = new NodeTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));
const provider = new NodeTracerProvider({
spanProcessors: [new SimpleSpanProcessor(memoryExporter)],
});
beforeEach(() => {
memoryExporter.reset();
});
@ -830,8 +832,9 @@ export const runTests = (
});
describe('Test filtering requests using metadata', () => {
const provider = new NodeTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));
const provider = new NodeTracerProvider({
spanProcessors: [new SimpleSpanProcessor(memoryExporter)],
});
beforeEach(() => {
memoryExporter.reset();
});
@ -859,7 +862,9 @@ export const runTests = (
});
describe('Test filtering requests using options', () => {
const provider = new NodeTracerProvider();
const provider = new NodeTracerProvider({
spanProcessors: [new SimpleSpanProcessor(memoryExporter)],
});
const checkSpans: { [key: string]: boolean } = {
unaryMethod: false,
UnaryMethod: false,
@ -868,7 +873,6 @@ export const runTests = (
ServerStreamMethod: true,
BidiStreamMethod: false,
};
provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));
beforeEach(() => {
memoryExporter.reset();
});
@ -936,8 +940,9 @@ export const runTests = (
});
describe('Test capturing metadata', () => {
const provider = new NodeTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));
const provider = new NodeTracerProvider({
spanProcessors: [new SimpleSpanProcessor(memoryExporter)],
});
const clientMetadata = new Metadata();
clientMetadata.add('client_metadata_key', 'client_metadata_value');

View File

@ -100,8 +100,9 @@ const hostname = 'localhost';
const pathname = '/test';
const serverName = 'my.server.name';
const memoryExporter = new InMemorySpanExporter();
const provider = new NodeTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));
const provider = new NodeTracerProvider({
spanProcessors: [new SimpleSpanProcessor(memoryExporter)],
});
instrumentation.setTracerProvider(provider);
function doNock(

View File

@ -55,8 +55,9 @@ describe('Packages', () => {
context.disable();
});
describe('get', () => {
const provider = new NodeTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));
const provider = new NodeTracerProvider({
spanProcessors: [new SimpleSpanProcessor(memoryExporter)],
});
instrumentation.setTracerProvider(provider);
beforeEach(() => {
memoryExporter.reset();

View File

@ -65,10 +65,11 @@ const hostname = 'localhost';
const serverName = 'my.server.name';
const pathname = '/test';
const memoryExporter = new InMemorySpanExporter();
const provider = new BasicTracerProvider();
const provider = new BasicTracerProvider({
spanProcessors: [new SimpleSpanProcessor(memoryExporter)],
});
instrumentation.setTracerProvider(provider);
const tracer = provider.getTracer('test-https');
provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));
function doNock(
hostname: string,

View File

@ -55,8 +55,9 @@ describe('Packages', () => {
context.disable();
});
describe('get', () => {
const provider = new NodeTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));
const provider = new NodeTracerProvider({
spanProcessors: [new SimpleSpanProcessor(memoryExporter)],
});
instrumentation.setTracerProvider(provider);
beforeEach(() => {
memoryExporter.reset();

View File

@ -45,9 +45,10 @@ import {
import { assertSpan } from '../../build/test/utils/assertSpan.js';
import { HttpInstrumentation } from '../../build/src/index.js';
const provider = new NodeTracerProvider();
const memoryExporter = new InMemorySpanExporter();
provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));
const provider = new NodeTracerProvider({
spanProcessors: [new SimpleSpanProcessor(memoryExporter)],
});
const instrumentation = new HttpInstrumentation();
instrumentation.setTracerProvider(provider);

View File

@ -129,8 +129,9 @@ describe('HttpInstrumentation Integration tests', () => {
});
});
const provider = new NodeTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));
const provider = new NodeTracerProvider({
spanProcessors: [new SimpleSpanProcessor(memoryExporter)],
});
instrumentation.setTracerProvider(provider);
beforeEach(() => {
memoryExporter.reset();

View File

@ -129,8 +129,9 @@ describe('HttpsInstrumentation Integration tests', () => {
done();
});
});
const provider = new NodeTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));
const provider = new NodeTracerProvider({
spanProcessors: [new SimpleSpanProcessor(memoryExporter)],
});
instrumentation.setTracerProvider(provider);
beforeEach(() => {
memoryExporter.reset();

View File

@ -41,13 +41,14 @@ describe('unmocked xhr', () => {
let testSpans: TestSpanProcessor;
let provider: WebTracerProvider;
beforeEach(() => {
provider = new WebTracerProvider();
testSpans = new TestSpanProcessor();
provider = new WebTracerProvider({
spanProcessors: [testSpans],
});
registerInstrumentations({
instrumentations: [new XMLHttpRequestInstrumentation()],
tracerProvider: provider,
});
testSpans = new TestSpanProcessor();
provider.addSpanProcessor(testSpans);
});
afterEach(() => {
// nop

View File

@ -268,21 +268,23 @@ describe('xhr', () => {
xmlHttpRequestInstrumentation = new XMLHttpRequestInstrumentation(
config
);
webTracerProviderWithZone = new WebTracerProvider();
dummySpanExporter = new DummySpanExporter();
webTracerProviderWithZone = new WebTracerProvider({
spanProcessors: [
new tracing.SimpleSpanProcessor(dummySpanExporter),
],
});
registerInstrumentations({
instrumentations: [xmlHttpRequestInstrumentation],
tracerProvider: webTracerProviderWithZone,
});
webTracerWithZone = webTracerProviderWithZone.getTracer('xhr-test');
dummySpanExporter = new DummySpanExporter();
exportSpy = sinon.stub(dummySpanExporter, 'export');
clearResourceTimingsSpy = sinon.stub(
performance as unknown as Performance,
'clearResourceTimings'
);
webTracerProviderWithZone.addSpanProcessor(
new tracing.SimpleSpanProcessor(dummySpanExporter)
);
rootSpan = webTracerWithZone.startSpan('root');
api.context.with(
@ -845,18 +847,19 @@ describe('xhr', () => {
);
spyEntries.withArgs('resource').returns(resources);
webTracerWithZoneProvider = new WebTracerProvider();
dummySpanExporter = new DummySpanExporter();
webTracerWithZoneProvider = new WebTracerProvider({
spanProcessors: [
new tracing.SimpleSpanProcessor(dummySpanExporter),
],
});
registerInstrumentations({
instrumentations: [new XMLHttpRequestInstrumentation(config)],
tracerProvider: webTracerWithZoneProvider,
});
dummySpanExporter = new DummySpanExporter();
exportSpy = sinon.stub(dummySpanExporter, 'export');
webTracerWithZoneProvider.addSpanProcessor(
new tracing.SimpleSpanProcessor(dummySpanExporter)
);
webTracerWithZone = webTracerWithZoneProvider.getTracer('xhr-test');
rootSpan = webTracerWithZone.startSpan('root');

View File

@ -61,7 +61,7 @@ import {
NodeTracerConfig,
NodeTracerProvider,
} from '@opentelemetry/sdk-trace-node';
import { SEMRESATTRS_SERVICE_NAME } from '@opentelemetry/semantic-conventions';
import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';
import { NodeSDKConfiguration } from './types';
import { getEnv, getEnvWithoutDefaults } from '@opentelemetry/core';
import {
@ -251,7 +251,7 @@ export class NodeSDK {
? this._resource
: this._resource.merge(
new Resource({
[SEMRESATTRS_SERVICE_NAME]: this._serviceName,
[ATTR_SERVICE_NAME]: this._serviceName,
})
);

View File

@ -39,11 +39,11 @@ export async function withTestTracer(
export async function withTestTracerProvider(
func: (otelTracerProvider: TracerProvider) => void | Promise<void>
): Promise<ReadableSpan[]> {
const inMemExporter = new InMemorySpanExporter();
const tracerProvider = new BasicTracerProvider({
sampler: new AlwaysOnSampler(),
spanProcessors: [new SimpleSpanProcessor(inMemExporter)],
});
const inMemExporter = new InMemorySpanExporter();
tracerProvider.addSpanProcessor(new SimpleSpanProcessor(inMemExporter));
await func(tracerProvider);

View File

@ -126,30 +126,6 @@ export class BasicTracerProvider implements TracerProvider {
return this._tracers.get(key)!;
}
/**
* @deprecated please use {@link TracerConfig} spanProcessors property
* Adds a new {@link SpanProcessor} to this tracer.
* @param spanProcessor the new SpanProcessor to be added.
*/
addSpanProcessor(spanProcessor: SpanProcessor): void {
if (this._registeredSpanProcessors.length === 0) {
// since we might have enabled by default a batchProcessor, we disable it
// before adding the new one
this.activeSpanProcessor
.shutdown()
.catch(err =>
diag.error(
'Error while trying to shutdown current span processor',
err
)
);
}
this._registeredSpanProcessors.push(spanProcessor);
this.activeSpanProcessor = new MultiSpanProcessor(
this._registeredSpanProcessors
);
}
getActiveSpanProcessor(): SpanProcessor {
return this.activeSpanProcessor;
}

View File

@ -787,12 +787,11 @@ describe('BasicTracerProvider', () => {
);
forceFlushStub.resolves();
const tracerProvider = new BasicTracerProvider();
const spanProcessorOne = new NoopSpanProcessor();
const spanProcessorTwo = new NoopSpanProcessor();
tracerProvider.addSpanProcessor(spanProcessorOne);
tracerProvider.addSpanProcessor(spanProcessorTwo);
const tracerProvider = new BasicTracerProvider({
spanProcessors: [spanProcessorOne, spanProcessorTwo],
});
tracerProvider
.forceFlush()
@ -816,11 +815,11 @@ describe('BasicTracerProvider', () => {
);
forceFlushStub.returns(Promise.reject('Error'));
const tracerProvider = new BasicTracerProvider();
const spanProcessorOne = new NoopSpanProcessor();
const spanProcessorTwo = new NoopSpanProcessor();
tracerProvider.addSpanProcessor(spanProcessorOne);
tracerProvider.addSpanProcessor(spanProcessorTwo);
const tracerProvider = new BasicTracerProvider({
spanProcessors: [spanProcessorOne, spanProcessorTwo],
});
tracerProvider
.forceFlush()

View File

@ -53,38 +53,25 @@ describe('MultiSpanProcessor', () => {
}
});
it('should handle empty span processor', () => {
const multiSpanProcessor = new MultiSpanProcessor([]);
const tracerProvider = new BasicTracerProvider();
tracerProvider.addSpanProcessor(multiSpanProcessor);
const tracer = tracerProvider.getTracer('default');
const span = tracer.startSpan('one');
span.end();
multiSpanProcessor.shutdown();
});
it('should handle one span processor', () => {
const processor1 = new TestProcessor();
const multiSpanProcessor = new MultiSpanProcessor([processor1]);
const tracerProvider = new BasicTracerProvider();
tracerProvider.addSpanProcessor(multiSpanProcessor);
const tracerProvider = new BasicTracerProvider({
spanProcessors: [processor1],
});
const tracer = tracerProvider.getTracer('default');
const span = tracer.startSpan('one');
assert.strictEqual(processor1.spans.length, 0);
span.end();
assert.strictEqual(processor1.spans.length, 1);
multiSpanProcessor.shutdown();
tracerProvider.getActiveSpanProcessor().shutdown();
});
it('should handle two span processor', async () => {
const processor1 = new TestProcessor();
const processor2 = new TestProcessor();
const multiSpanProcessor = new MultiSpanProcessor([processor1, processor2]);
const tracerProvider = new BasicTracerProvider();
tracerProvider.addSpanProcessor(multiSpanProcessor);
const tracerProvider = new BasicTracerProvider({
spanProcessors: [processor1, processor2],
});
const tracer = tracerProvider.getTracer('default');
const span = tracer.startSpan('one');
assert.strictEqual(processor1.spans.length, 0);
@ -94,18 +81,21 @@ describe('MultiSpanProcessor', () => {
assert.strictEqual(processor1.spans.length, 1);
assert.strictEqual(processor1.spans.length, processor2.spans.length);
await multiSpanProcessor.shutdown();
assert.strictEqual(processor1.spans.length, 0);
assert.strictEqual(processor1.spans.length, processor2.spans.length);
// await tracerProvider.getActiveSpanProcessor().shutdown();
// assert.strictEqual(processor1.spans.length, 0);
// assert.strictEqual(processor1.spans.length, processor2.spans.length);
tracerProvider.shutdown().then(() => {
assert.strictEqual(processor1.spans.length, 0);
assert.strictEqual(processor1.spans.length, processor2.spans.length);
});
});
it('should export spans on manual shutdown from two span processor', () => {
const processor1 = new TestProcessor();
const processor2 = new TestProcessor();
const multiSpanProcessor = new MultiSpanProcessor([processor1, processor2]);
const tracerProvider = new BasicTracerProvider();
tracerProvider.addSpanProcessor(multiSpanProcessor);
const tracerProvider = new BasicTracerProvider({
spanProcessors: [processor1, processor2],
});
const tracer = tracerProvider.getTracer('default');
const span = tracer.startSpan('one');
assert.strictEqual(processor1.spans.length, 0);
@ -124,10 +114,9 @@ describe('MultiSpanProcessor', () => {
it('should export spans on manual shutdown from two span processor', () => {
const processor1 = new TestProcessor();
const processor2 = new TestProcessor();
const multiSpanProcessor = new MultiSpanProcessor([processor1, processor2]);
const tracerProvider = new BasicTracerProvider();
tracerProvider.addSpanProcessor(multiSpanProcessor);
const tracerProvider = new BasicTracerProvider({
spanProcessors: [processor1, processor2],
});
const tracer = tracerProvider.getTracer('default');
const span = tracer.startSpan('one');
assert.strictEqual(processor1.spans.length, 0);

View File

@ -1132,9 +1132,9 @@ describe('Span', () => {
shutdown: () => Promise.resolve(),
};
const provider = new BasicTracerProvider();
provider.addSpanProcessor(processor);
const provider = new BasicTracerProvider({
spanProcessors: [processor],
});
provider.getTracer('default').startSpan('test');
assert.ok(started);
@ -1151,9 +1151,9 @@ describe('Span', () => {
shutdown: () => Promise.resolve(),
};
const provider = new BasicTracerProvider();
provider.addSpanProcessor(processor);
const provider = new BasicTracerProvider({
spanProcessors: [processor],
});
provider
.getTracer('default')
@ -1172,9 +1172,9 @@ describe('Span', () => {
shutdown: () => Promise.resolve(),
};
const provider = new BasicTracerProvider();
provider.addSpanProcessor(processor);
const provider = new BasicTracerProvider({
spanProcessors: [processor],
});
provider.getTracer('default').startSpan('test').end();
assert.ok(ended);
@ -1190,9 +1190,9 @@ describe('Span', () => {
shutdown: () => Promise.resolve(),
};
const provider = new BasicTracerProvider();
provider.addSpanProcessor(processor);
const provider = new BasicTracerProvider({
spanProcessors: [processor],
});
const s = provider.getTracer('default').startSpan('test') as Span;
assert.ok(s.attributes.attr);

View File

@ -259,8 +259,9 @@ describe('Tracer', () => {
const sp: SpanProcessor = new DummySpanProcessor();
const onStartSpy = sinon.spy(sp, 'onStart');
const tp = new BasicTracerProvider();
tp.addSpanProcessor(sp);
const tp = new BasicTracerProvider({
spanProcessors: [sp],
});
const sampler: Sampler = new AlwaysOnSampler();
const shouldSampleSpy = sinon.spy(sampler, 'shouldSample');
@ -289,8 +290,9 @@ describe('Tracer', () => {
const sp: SpanProcessor = new DummySpanProcessor();
const onStartSpy = sinon.spy(sp, 'onStart');
const tp = new BasicTracerProvider();
tp.addSpanProcessor(sp);
const tp = new BasicTracerProvider({
spanProcessors: [sp],
});
const sampler: Sampler = new AlwaysOnSampler();
const shouldSampleSpy = sinon.spy(sampler, 'shouldSample');

View File

@ -43,18 +43,15 @@ describe('ConsoleSpanExporter', () => {
describe('.export()', () => {
it('should export information about span', () => {
assert.doesNotThrow(() => {
consoleExporter = new ConsoleSpanExporter();
const basicTracerProvider = new BasicTracerProvider({
sampler: new AlwaysOnSampler(),
spanProcessors: [new SimpleSpanProcessor(consoleExporter)],
});
consoleExporter = new ConsoleSpanExporter();
const spyConsole = sinon.spy(console, 'dir');
const spyExport = sinon.spy(consoleExporter, 'export');
basicTracerProvider.addSpanProcessor(
new SimpleSpanProcessor(consoleExporter)
);
const instrumentationScopeName = '@opentelemetry/sdk-trace-base/test';
const instrumentationScopeVersion = '1.2.3';
const tracer = basicTracerProvider.getTracer(

View File

@ -29,8 +29,9 @@ describe('InMemorySpanExporter', () => {
beforeEach(() => {
memoryExporter = new InMemorySpanExporter();
provider = new BasicTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));
provider = new BasicTracerProvider({
spanProcessors: [new SimpleSpanProcessor(memoryExporter)],
});
});
it('should get finished spans', () => {

View File

@ -35,8 +35,6 @@ export class TestTracingSpanExporter extends InMemorySpanExporter {
constructor() {
super();
const tracerProvider = new BasicTracerProvider();
const spanProcessor: SpanProcessor = {
forceFlush: () => {
return Promise.resolve();
@ -50,7 +48,9 @@ export class TestTracingSpanExporter extends InMemorySpanExporter {
},
};
tracerProvider.addSpanProcessor(spanProcessor);
const tracerProvider = new BasicTracerProvider({
spanProcessors: [spanProcessor],
});
this._tracer = new Tracer(
{ name: 'default', version: '0.0.1' },