Skip to content

Commit 3e65d14

Browse files
naseemkullahZirak
authored andcommitted
feat(node-sdk): add spanProcessors option (open-telemetry#4454)
1 parent 29ed71e commit 3e65d14

File tree

5 files changed

+45
-10
lines changed

5 files changed

+45
-10
lines changed

experimental/CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ All notable changes to experimental packages in this project will be documented
99
### :rocket: (Enhancement)
1010

1111
* feat(exporter-metrics-otlp-http): add option to set the exporter aggregation preference [#4409](https://github.com/open-telemetry/opentelemetry-js/pull/4409) @AkselAllas
12+
* feat(node-sdk): add spanProcessors option [#4454](https://github.com/open-telemetry/opentelemetry-js/pull/4454) @naseemkullah
1213

1314
### :bug: (Bug Fix)
1415

experimental/packages/opentelemetry-sdk-node/README.md

+6
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,12 @@ Configure a custom sampler. By default, all traces will be sampled.
124124

125125
### spanProcessor
126126

127+
Deprecated, please use [spanProcessors](#spanprocessors) instead.
128+
129+
### spanProcessors
130+
131+
An array of span processors to register to the tracer provider.
132+
127133
### traceExporter
128134

129135
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`.

experimental/packages/opentelemetry-sdk-node/src/sdk.ts

+20-6
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export type LoggerProviderConfig = {
7575
export class NodeSDK {
7676
private _tracerProviderConfig?: {
7777
tracerConfig: NodeTracerConfig;
78-
spanProcessor: SpanProcessor;
78+
spanProcessors: SpanProcessor[];
7979
contextManager?: ContextManager;
8080
textMapPropagator?: TextMapPropagator;
8181
};
@@ -130,7 +130,11 @@ export class NodeSDK {
130130
this._autoDetectResources = configuration.autoDetectResources ?? true;
131131

132132
// If a tracer provider can be created from manual configuration, create it
133-
if (configuration.traceExporter || configuration.spanProcessor) {
133+
if (
134+
configuration.traceExporter ||
135+
configuration.spanProcessor ||
136+
configuration.spanProcessors
137+
) {
134138
const tracerProviderConfig: NodeTracerConfig = {};
135139

136140
if (configuration.sampler) {
@@ -143,13 +147,21 @@ export class NodeSDK {
143147
tracerProviderConfig.idGenerator = configuration.idGenerator;
144148
}
145149

150+
if (configuration.spanProcessor) {
151+
diag.warn(
152+
"The 'spanProcessor' option is deprecated. Please use 'spanProcessors' instead."
153+
);
154+
}
155+
146156
const spanProcessor =
147157
configuration.spanProcessor ??
148158
new BatchSpanProcessor(configuration.traceExporter!);
149159

160+
const spanProcessors = configuration.spanProcessors ?? [spanProcessor];
161+
150162
this.configureTracerProvider(
151163
tracerProviderConfig,
152-
spanProcessor,
164+
spanProcessors,
153165
configuration.contextManager,
154166
configuration.textMapPropagator
155167
);
@@ -192,13 +204,13 @@ export class NodeSDK {
192204
*/
193205
public configureTracerProvider(
194206
tracerConfig: NodeTracerConfig,
195-
spanProcessor: SpanProcessor,
207+
spanProcessors: SpanProcessor[],
196208
contextManager?: ContextManager,
197209
textMapPropagator?: TextMapPropagator
198210
): void {
199211
this._tracerProviderConfig = {
200212
tracerConfig,
201-
spanProcessor,
213+
spanProcessors,
202214
contextManager,
203215
textMapPropagator,
204216
};
@@ -334,7 +346,9 @@ export class NodeSDK {
334346
this._tracerProvider = tracerProvider;
335347

336348
if (this._tracerProviderConfig) {
337-
tracerProvider.addSpanProcessor(this._tracerProviderConfig.spanProcessor);
349+
for (const spanProcessor of this._tracerProviderConfig.spanProcessors) {
350+
tracerProvider.addSpanProcessor(spanProcessor);
351+
}
338352
}
339353

340354
tracerProvider.register({

experimental/packages/opentelemetry-sdk-node/src/types.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ export interface NodeSDKConfiguration {
4040
resourceDetectors: Array<Detector | DetectorSync>;
4141
sampler: Sampler;
4242
serviceName?: string;
43-
spanProcessor: SpanProcessor;
43+
/** @deprecated use spanProcessors instead*/
44+
spanProcessor?: SpanProcessor;
45+
spanProcessors?: SpanProcessor[];
4446
traceExporter: SpanExporter;
4547
spanLimits: SpanLimits;
4648
idGenerator: IdGenerator;

experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts

+15-3
Original file line numberDiff line numberDiff line change
@@ -200,12 +200,15 @@ describe('Node SDK', () => {
200200
delete env.OTEL_TRACES_EXPORTER;
201201
});
202202

203-
it('should register a tracer provider if a span processor is provided', async () => {
203+
it('should register a tracer provider if span processors are provided', async () => {
204204
const exporter = new ConsoleSpanExporter();
205-
const spanProcessor = new SimpleSpanProcessor(exporter);
206205

207206
const sdk = new NodeSDK({
208-
spanProcessor,
207+
spanProcessors: [
208+
new NoopSpanProcessor(),
209+
new SimpleSpanProcessor(exporter),
210+
new BatchSpanProcessor(exporter),
211+
],
209212
autoDetectResources: false,
210213
});
211214

@@ -223,6 +226,15 @@ describe('Node SDK', () => {
223226
const apiTracerProvider =
224227
trace.getTracerProvider() as ProxyTracerProvider;
225228
assert.ok(apiTracerProvider.getDelegate() instanceof NodeTracerProvider);
229+
230+
const listOfProcessors =
231+
sdk['_tracerProvider']!['_registeredSpanProcessors']!;
232+
233+
assert(sdk['_tracerProvider'] instanceof NodeTracerProvider);
234+
assert(listOfProcessors.length === 3);
235+
assert(listOfProcessors[0] instanceof NoopSpanProcessor);
236+
assert(listOfProcessors[1] instanceof SimpleSpanProcessor);
237+
assert(listOfProcessors[2] instanceof BatchSpanProcessor);
226238
});
227239

228240
it('should register a meter provider if a reader is provided', async () => {

0 commit comments

Comments
 (0)