diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 7b677d8fa9d..c12838be90e 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -10,6 +10,8 @@ All notable changes to experimental packages in this project will be documented * feat(exporter-metrics-otlp-http): add option to set the exporter aggregation preference [#4409](https://github.com/open-telemetry/opentelemetry-js/pull/4409) @AkselAllas +* feat(node-sdk): add spanProcessors option [#4454](https://github.com/open-telemetry/opentelemetry-js/pull/4454) @naseemkullah + ### :bug: (Bug Fix) * fix(sdk-node): allow using samplers when the exporter is defined in the environment [#4394](https://github.com/open-telemetry/opentelemetry-js/pull/4394) @JacksonWeber diff --git a/experimental/packages/opentelemetry-sdk-node/README.md b/experimental/packages/opentelemetry-sdk-node/README.md index ac828b371cd..82957c7cccc 100644 --- a/experimental/packages/opentelemetry-sdk-node/README.md +++ b/experimental/packages/opentelemetry-sdk-node/README.md @@ -124,6 +124,12 @@ Configure a custom sampler. By default, all traces will be sampled. ### spanProcessor +Deprecated, please use [`spanProcessors](#spanprocessors) instead. + +### spanProcessors + +An array of span processors to register to the tracer provider. + ### traceExporter Configure a trace exporter. If an exporter is configured, it will be used with a [BatchSpanProcessor](../../../packages/opentelemetry-sdk-trace-base/src/platform/node/export/BatchSpanProcessor.ts). If an exporter OR span processor is not configured programatically, this package will auto setup the default `otlp` exporter with `http/protobuf` protocol with a `BatchSpanProcessor`. diff --git a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts index 39aca6f58a3..69816604544 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts @@ -75,7 +75,7 @@ export type LoggerProviderConfig = { export class NodeSDK { private _tracerProviderConfig?: { tracerConfig: NodeTracerConfig; - spanProcessor: SpanProcessor; + spanProcessors: SpanProcessor[]; contextManager?: ContextManager; textMapPropagator?: TextMapPropagator; }; @@ -147,9 +147,11 @@ export class NodeSDK { configuration.spanProcessor ?? new BatchSpanProcessor(configuration.traceExporter!); + const spanProcessors = configuration.spanProcessors ?? [spanProcessor]; + this.configureTracerProvider( tracerProviderConfig, - spanProcessor, + spanProcessors, configuration.contextManager, configuration.textMapPropagator ); @@ -192,13 +194,13 @@ export class NodeSDK { */ public configureTracerProvider( tracerConfig: NodeTracerConfig, - spanProcessor: SpanProcessor, + spanProcessors: SpanProcessor[], contextManager?: ContextManager, textMapPropagator?: TextMapPropagator ): void { this._tracerProviderConfig = { tracerConfig, - spanProcessor, + spanProcessors, contextManager, textMapPropagator, }; @@ -334,7 +336,9 @@ export class NodeSDK { this._tracerProvider = tracerProvider; if (this._tracerProviderConfig) { - tracerProvider.addSpanProcessor(this._tracerProviderConfig.spanProcessor); + for (const spanProcessor of this._tracerProviderConfig.spanProcessors) { + tracerProvider.addSpanProcessor(spanProcessor); + } } tracerProvider.register({ diff --git a/experimental/packages/opentelemetry-sdk-node/src/types.ts b/experimental/packages/opentelemetry-sdk-node/src/types.ts index 9292e0ae70e..2ed7cae48dd 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/types.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/types.ts @@ -40,7 +40,9 @@ export interface NodeSDKConfiguration { resourceDetectors: Array; sampler: Sampler; serviceName?: string; - spanProcessor: SpanProcessor; + /** @deprecated use spanProcessors instead*/ + spanProcessor?: SpanProcessor; + spanProcessors?: SpanProcessor[]; traceExporter: SpanExporter; spanLimits: SpanLimits; idGenerator: IdGenerator; diff --git a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts index d6a93c8a607..36b4c5dbee2 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -200,12 +200,15 @@ describe('Node SDK', () => { delete env.OTEL_TRACES_EXPORTER; }); - it('should register a tracer provider if a span processor is provided', async () => { + it('should register a tracer provider if a span processors are provided', async () => { const exporter = new ConsoleSpanExporter(); - const spanProcessor = new SimpleSpanProcessor(exporter); const sdk = new NodeSDK({ - spanProcessor, + spanProcessors: [ + new NoopSpanProcessor(), + new SimpleSpanProcessor(exporter), + new BatchSpanProcessor(exporter), + ], autoDetectResources: false, }); @@ -223,6 +226,16 @@ describe('Node SDK', () => { const apiTracerProvider = trace.getTracerProvider() as ProxyTracerProvider; assert.ok(apiTracerProvider.getDelegate() instanceof NodeTracerProvider); + + + const listOfProcessors = + sdk['_tracerProvider']!['_registeredSpanProcessors']!; + + assert(sdk['_tracerProvider'] instanceof TracerProviderWithEnvExporters); + assert(listOfProcessors.length === 3); + assert(listOfProcessors[0] instanceof NoopSpanProcessor); + assert(listOfProcessors[1] instanceof SimpleSpanProcessor); + assert(listOfProcessors[2] instanceof BatchSpanProcessor); }); it('should register a meter provider if a reader is provided', async () => {