Skip to content

Commit 544c409

Browse files
authored
feat(sdk-trace-base)!: remove BasicTracerProvider#register() to improve tree-shaking (#5503)
1 parent 537eaf9 commit 544c409

File tree

12 files changed

+175
-177
lines changed

12 files changed

+175
-177
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,10 @@ For semantic convention package changes, see the [semconv CHANGELOG](packages/se
120120
* (user-facing): `ENVIRONMENT` has been removed without replacement
121121
* (user-facing): `RAW_ENVIRONMENT` has been removed without replacement
122122
* (user-facing): `parseEnvironment` has been removed without replacement
123+
* feat(sdk-trace-base): remove `BasicTracerProvider#register()` to improve tree-shaking [#5503](https://github.com/open-telemetry/opentelemetry-js/pull/5503) @pichlermarc
124+
* (user-facing): `BasicTracerProvider#register()` has been removed
125+
* to register a global propagator, please use `propagation.setGlobalPropagator()` from `@opentelemetry/api`
126+
* to register a global context manager, please use `context.setGlobalContextManager()` from `@opentelemetry/api`
123127
* feat!: set compilation target to ES2022 for all packages except `@opentelemetry/api`, `@opentelemetry/api-logs`, `@opentelemetry/api-events`, and `@opentelemetry/semantic-conventions` [#5456](https://github.com/open-telemetry/opentelemetry-js/pull/5456) @david-luna
124128
* (user-facing): drops browser runtimes which do not support ES2022 features
125129

examples/basic-tracer-node/index.js

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,13 @@ const { resourceFromAttributes } = require('@opentelemetry/resources');
55
const { SEMRESATTRS_SERVICE_NAME } = require('@opentelemetry/semantic-conventions');
66
const { BasicTracerProvider, ConsoleSpanExporter, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base');
77
const { JaegerExporter } = require('@opentelemetry/exporter-jaeger');
8+
const { AsyncLocalStorageContextManager } = require("@opentelemetry/context-async-hooks");
9+
const {CompositePropagator, W3CTraceContextPropagator, W3CBaggagePropagator} = require("@opentelemetry/core");
810

911
// Configure span processor to send spans to the exporter
1012
const exporter = new JaegerExporter({
1113
endpoint: 'http://localhost:14268/api/traces',
1214
});
13-
const provider = new BasicTracerProvider({
14-
resource: resourceFromAttributes({
15-
[SEMRESATTRS_SERVICE_NAME]: 'basic-service',
16-
}),
17-
spanProcessors: [
18-
new SimpleSpanProcessor(exporter),
19-
new SimpleSpanProcessor(new ConsoleSpanExporter()),
20-
]
21-
});
2215

2316
/**
2417
* Initialize the OpenTelemetry APIs to use the BasicTracerProvider bindings.
@@ -29,7 +22,21 @@ const provider = new BasicTracerProvider({
2922
* do not register a global tracer provider, instrumentation which calls these
3023
* methods will receive no-op implementations.
3124
*/
32-
provider.register();
25+
opentelemetry.trace.setGlobalTracerProvider(new BasicTracerProvider({
26+
resource: resourceFromAttributes({
27+
[SEMRESATTRS_SERVICE_NAME]: 'basic-service',
28+
}),
29+
spanProcessors: [
30+
new SimpleSpanProcessor(exporter),
31+
new SimpleSpanProcessor(new ConsoleSpanExporter()),
32+
]
33+
}));
34+
opentelemetry.context.setGlobalContextManager(new AsyncLocalStorageContextManager());
35+
opentelemetry.propagation.setGlobalPropagator(new CompositePropagator({ propagators: [
36+
new W3CTraceContextPropagator(),
37+
new W3CBaggagePropagator()]
38+
}));
39+
3340
const tracer = opentelemetry.trace.getTracer('example-basic-tracer-node');
3441

3542
// Create a span. A span must be closed.

experimental/packages/exporter-trace-otlp-grpc/README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ To see documentation and sample code for the metric exporter, see the [exporter-
2424
The OTLPTraceExporter in Node expects the URL to only be the hostname. It will not work with `/v1/traces`.
2525

2626
```js
27-
const { BasicTracerProvider, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base');
27+
const { NodeTracerProvider, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-node');
2828
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-grpc');
2929

3030
const collectorOptions = {
@@ -34,7 +34,7 @@ const collectorOptions = {
3434
};
3535

3636
const exporter = new OTLPTraceExporter(collectorOptions);
37-
const provider = new BasicTracerProvider({
37+
const provider = new NodeTracerProvider({
3838
spanProcessors: [new SimpleSpanProcessor(exporter)]
3939
});
4040

@@ -50,7 +50,7 @@ By default, plaintext connection is used. In order to use TLS in Node.js, provid
5050
const fs = require('fs');
5151
const grpc = require('@grpc/grpc-js');
5252

53-
const { BasicTracerProvider, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base');
53+
const { NodeTracerProvider, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-node');
5454
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-grpc');
5555

5656
const collectorOptions = {
@@ -61,7 +61,7 @@ const collectorOptions = {
6161
};
6262

6363
const exporter = new OTLPTraceExporter(collectorOptions);
64-
const provider = new BasicTracerProvider({
64+
const provider = new NodeTracerProvider({
6565
spanProcessors: [new SimpleSpanProcessor(exporter)]
6666
});
6767

@@ -88,7 +88,7 @@ The exporter can be configured to send custom metadata with each request as in t
8888
```js
8989
const grpc = require('@grpc/grpc-js');
9090

91-
const { BasicTracerProvider, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base');
91+
const { NodeTracerProvider, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-node');
9292
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-grpc');
9393

9494
const metadata = new grpc.Metadata();
@@ -103,7 +103,7 @@ const collectorOptions = {
103103
};
104104

105105
const exporter = new OTLPTraceExporter(collectorOptions);
106-
const provider = new BasicTracerProvider({
106+
const provider = new NodeTracerProvider({
107107
spanProcessors: [new SimpleSpanProcessor(exporter)]
108108
});
109109

experimental/packages/exporter-trace-otlp-http/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ provider.register();
5959
## Traces in Node - JSON over http
6060

6161
```js
62-
const { BasicTracerProvider, BatchSpanProcessor } = require('@opentelemetry/sdk-trace-base');
62+
const { NodeTracerProvider, BatchSpanProcessor } = require('@opentelemetry/sdk-trace-node');
6363
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');
6464

6565
const collectorOptions = {
@@ -71,7 +71,7 @@ const collectorOptions = {
7171
};
7272

7373
const exporter = new OTLPTraceExporter(collectorOptions);
74-
const provider = new BasicTracerProvider({
74+
const provider = new NodeTracerProvider({
7575
spanProcessors: [
7676
new BatchSpanProcessor(exporter, {
7777
// The maximum queue size. After the size is reached spans are dropped.

experimental/packages/exporter-trace-otlp-proto/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ To see documentation and sample code for the metric exporter, see the [exporter-
2222
## Traces in Node - PROTO over http
2323

2424
```js
25-
const { BasicTracerProvider, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base');
25+
const { NodeTracerProvider, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-node');
2626
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-proto');
2727

2828
const collectorOptions = {
@@ -33,7 +33,7 @@ const collectorOptions = {
3333
};
3434

3535
const exporter = new OTLPTraceExporter(collectorOptions);
36-
const provider = new BasicTracerProvider({
36+
const provider = new NodeTracerProvider({
3737
spanProcessors: [new SimpleSpanProcessor(exporter)]
3838
});
3939

integration-tests/propagation-validation-server/validation-server.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,8 @@ propagation.setGlobalPropagator(new W3CTraceContextPropagator());
1313
// set global context manager
1414
context.setGlobalContextManager(new AsyncHooksContextManager());
1515

16-
// Create a provider for activating and tracking spans
17-
const tracerProvider = new BasicTracerProvider();
18-
19-
// Register the tracer
20-
tracerProvider.register();
16+
// set global tracer provider
17+
trace.setGlobalTracerProvider(new BasicTracerProvider());
2118

2219
// Get a tracer
2320
const tracer = trace.getTracer("w3c-tests");

packages/opentelemetry-sdk-trace-base/README.md

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@ The `tracing` module contains the foundation for all tracing SDKs of [openteleme
77

88
Used standalone, this module provides methods for manual instrumentation of code, offering full control over span creation for client-side JavaScript (browser) and Node.js.
99

10-
It does **not** provide automated instrumentation of known libraries, context propagation for asynchronous invocations or distributed-context out-of-the-box.
10+
It does **not** provide automated instrumentation of known libraries, context propagation or distributed-context out-of-the-box.
1111

12-
For automated instrumentation for Node.js, please see
12+
For a `TracerProvider` that includes default context management and propagation for Node.js, please see
1313
[@opentelemetry/sdk-trace-node](https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-sdk-trace-node).
1414

15+
For a `TracerProvider` that includes default context management and propagation for Browser, please see
16+
[@opentelemetry/sdk-trace-web](https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-sdk-trace-web).
17+
1518
## Installation
1619

1720
```bash
@@ -22,16 +25,20 @@ npm install --save @opentelemetry/sdk-trace-base
2225
## Usage
2326

2427
```js
25-
const opentelemetry = require('@opentelemetry/api');
28+
const { trace } = require('@opentelemetry/api');
2629
const { BasicTracerProvider } = require('@opentelemetry/sdk-trace-base');
2730

2831
// To start a trace, you first need to initialize the Tracer provider.
2932
// NOTE: The default OpenTelemetry tracer provider does not record any tracing information.
3033
// Registering a working tracer provider allows the API methods to record traces.
31-
new BasicTracerProvider().register();
34+
trace.setGlobalTracerProvider(new BasicTracerProvider());
35+
36+
// Important: requires a context manager and propagator to be registered manually.
37+
// propagation.setGlobalPropagator(propagator); // replace `propagator` with your `TextMapPropagator`, for example: `W3CTraceContextPropagator` from `@openetelemetry/core`
38+
// context.setGlobalContextManager(contextManager); // replace `contextManager` with your `ContextManager`: `AsyncLocalStorageContextManager` from `@openetelemetry/async-hooks`
3239

3340
// To create a span in a trace, we used the global singleton tracer to start a new span.
34-
const span = opentelemetry.trace.getTracer('default').startSpan('foo');
41+
const span = trace.getTracer('default').startSpan('foo');
3542

3643
// Set a span attribute
3744
span.setAttribute('key', 'value');

packages/opentelemetry-sdk-trace-base/src/BasicTracerProvider.ts

Lines changed: 3 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,14 @@
1414
* limitations under the License.
1515
*/
1616

17-
import {
18-
context,
19-
propagation,
20-
TextMapPropagator,
21-
trace,
22-
TracerProvider,
23-
Tracer as ApiTracer,
24-
} from '@opentelemetry/api';
25-
import {
26-
CompositePropagator,
27-
W3CBaggagePropagator,
28-
W3CTraceContextPropagator,
29-
merge,
30-
} from '@opentelemetry/core';
17+
import { TracerProvider, Tracer as ApiTracer } from '@opentelemetry/api';
18+
import { merge } from '@opentelemetry/core';
3119
import { defaultResource, Resource } from '@opentelemetry/resources';
3220
import { SpanProcessor } from './SpanProcessor';
3321
import { Tracer } from './Tracer';
3422
import { loadDefaultConfig } from './config';
3523
import { MultiSpanProcessor } from './MultiSpanProcessor';
36-
import { SDKRegistrationConfig, TracerConfig } from './types';
24+
import { TracerConfig } from './types';
3725
import { reconfigureLimits } from './utility';
3826

3927
export enum ForceFlushState {
@@ -43,10 +31,6 @@ export enum ForceFlushState {
4331
'unresolved',
4432
}
4533

46-
function getDefaultPropagators(): TextMapPropagator[] {
47-
return [new W3CTraceContextPropagator(), new W3CBaggagePropagator()];
48-
}
49-
5034
/**
5135
* This class represents a basic tracer provider which platform libraries can extend
5236
*/
@@ -99,31 +83,6 @@ export class BasicTracerProvider implements TracerProvider {
9983
return this._tracers.get(key)!;
10084
}
10185

102-
/**
103-
* Register this TracerProvider for use with the OpenTelemetry API.
104-
* Undefined values may be replaced with defaults, and
105-
* null values will be skipped.
106-
*
107-
* @param config Configuration object for SDK registration
108-
*/
109-
register(config: SDKRegistrationConfig = {}): void {
110-
trace.setGlobalTracerProvider(this);
111-
112-
if (config.contextManager) {
113-
context.setGlobalContextManager(config.contextManager);
114-
}
115-
116-
// undefined means "unset", null means don't register propagator
117-
if (config.propagator !== null) {
118-
propagation.setGlobalPropagator(
119-
config.propagator ??
120-
new CompositePropagator({
121-
propagators: getDefaultPropagators(),
122-
})
123-
);
124-
}
125-
}
126-
12786
forceFlush(): Promise<void> {
12887
const timeout = this._config.forceFlushTimeoutMillis;
12988
const promises = this._activeSpanProcessor['_spanProcessors'].map(

packages/opentelemetry-sdk-trace-base/test/common/BasicTracerProvider.test.ts

Lines changed: 0 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,8 @@ import {
2020
SpanContext,
2121
TraceFlags,
2222
ROOT_CONTEXT,
23-
TextMapPropagator,
24-
TextMapSetter,
25-
Context,
26-
TextMapGetter,
27-
propagation,
2823
diag,
29-
ContextManager,
3024
} from '@opentelemetry/api';
31-
import { CompositePropagator } from '@opentelemetry/core';
3225
import { TraceState } from '@opentelemetry/core';
3326
import {
3427
defaultResource,
@@ -49,28 +42,8 @@ import { SpanImpl } from '../../src/Span';
4942
import { MultiSpanProcessor } from '../../src/MultiSpanProcessor';
5043
import { Tracer } from '../../src/Tracer';
5144

52-
class DummyPropagator implements TextMapPropagator {
53-
inject(context: Context, carrier: any, setter: TextMapSetter<any>): void {
54-
throw new Error('Method not implemented.');
55-
}
56-
extract(context: Context, carrier: any, getter: TextMapGetter<any>): Context {
57-
throw new Error('Method not implemented.');
58-
}
59-
fields(): string[] {
60-
throw new Error('Method not implemented.');
61-
}
62-
}
63-
6445
describe('BasicTracerProvider', () => {
65-
let setGlobalPropagatorStub: sinon.SinonSpy<[TextMapPropagator], boolean>;
66-
let setGlobalContextManagerStub: sinon.SinonSpy<[ContextManager], boolean>;
67-
6846
beforeEach(() => {
69-
// to avoid actually registering the TraceProvider and leaking env to other tests
70-
sinon.stub(trace, 'setGlobalTracerProvider');
71-
setGlobalPropagatorStub = sinon.spy(propagation, 'setGlobalPropagator');
72-
setGlobalContextManagerStub = sinon.spy(context, 'setGlobalContextManager');
73-
7447
context.disable();
7548
});
7649

@@ -312,65 +285,6 @@ describe('BasicTracerProvider', () => {
312285
});
313286
});
314287

315-
describe('.register()', () => {
316-
describe('propagator', () => {
317-
it('should be set to a given value if it it provided', () => {
318-
const provider = new BasicTracerProvider();
319-
provider.register({
320-
propagator: new DummyPropagator(),
321-
});
322-
323-
sinon.assert.calledOnceWithExactly(
324-
setGlobalPropagatorStub,
325-
sinon.match.instanceOf(DummyPropagator)
326-
);
327-
});
328-
329-
it('should use w3c trace context and baggage propagators by default', () => {
330-
const provider = new BasicTracerProvider();
331-
provider.register();
332-
333-
sinon.assert.calledOnceWithExactly(
334-
setGlobalPropagatorStub,
335-
sinon.match.instanceOf(CompositePropagator)
336-
);
337-
assert.deepStrictEqual(setGlobalPropagatorStub.args[0][0].fields(), [
338-
'traceparent',
339-
'tracestate',
340-
'baggage',
341-
]);
342-
});
343-
});
344-
describe('contextManager', () => {
345-
it('should not be set if not provided', () => {
346-
const provider = new BasicTracerProvider();
347-
provider.register();
348-
349-
sinon.assert.notCalled(setGlobalContextManagerStub);
350-
});
351-
352-
it('should be set if provided', () => {
353-
const provider = new BasicTracerProvider();
354-
const mockContextManager: ContextManager = {
355-
active: sinon.stub(),
356-
bind: sinon.stub(),
357-
disable: sinon.stub(),
358-
enable: sinon.stub(),
359-
with: sinon.stub(),
360-
};
361-
362-
provider.register({
363-
contextManager: mockContextManager,
364-
});
365-
366-
sinon.assert.calledOnceWithExactly(
367-
setGlobalContextManagerStub,
368-
mockContextManager
369-
);
370-
});
371-
});
372-
});
373-
374288
describe('.startSpan()', () => {
375289
it('should start a span with name only', () => {
376290
const tracer = new BasicTracerProvider().getTracer('default');

0 commit comments

Comments
 (0)