Skip to content

Commit 5883e4e

Browse files
authored
Simplify SDK registration (open-telemetry#837)
1 parent cd59fcc commit 5883e4e

File tree

8 files changed

+261
-9
lines changed

8 files changed

+261
-9
lines changed

packages/opentelemetry-api/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export * from './common/Logger';
1818
export * from './common/Time';
1919
export * from './context/propagation/getter';
2020
export * from './context/propagation/HttpTextFormat';
21+
export * from './context/propagation/NoopHttpTextFormat';
2122
export * from './context/propagation/setter';
2223
export * from './correlation_context/CorrelationContext';
2324
export * from './correlation_context/EntryValue';

packages/opentelemetry-node/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
"devDependencies": {
4444
"@types/mocha": "^5.2.5",
4545
"@types/node": "^12.6.8",
46+
"@opentelemetry/scope-base": "^0.4.0",
4647
"@types/semver": "^6.0.1",
4748
"@types/shimmer": "^1.0.1",
4849
"codecov": "^3.6.1",

packages/opentelemetry-node/src/NodeTracerProvider.ts

+19-2
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,20 @@
1414
* limitations under the License.
1515
*/
1616

17-
import { BasicTracerProvider } from '@opentelemetry/tracing';
17+
import { AsyncHooksScopeManager } from '@opentelemetry/scope-async-hooks';
18+
import {
19+
BasicTracerProvider,
20+
SDKRegistrationConfig,
21+
} from '@opentelemetry/tracing';
1822
import { DEFAULT_INSTRUMENTATION_PLUGINS, NodeTracerConfig } from './config';
1923
import { PluginLoader } from './instrumentation/PluginLoader';
2024

2125
/**
22-
* This class represents a node tracer with `async_hooks` module.
26+
* Register this TracerProvider for use with the OpenTelemetry API.
27+
* Undefined values may be replaced with defaults, and
28+
* null values will be skipped.
29+
*
30+
* @param config Configuration object for SDK registration
2331
*/
2432
export class NodeTracerProvider extends BasicTracerProvider {
2533
private readonly _pluginLoader: PluginLoader;
@@ -37,4 +45,13 @@ export class NodeTracerProvider extends BasicTracerProvider {
3745
stop() {
3846
this._pluginLoader.unload();
3947
}
48+
49+
register(config: SDKRegistrationConfig = {}) {
50+
if (config.contextManager === undefined) {
51+
config.contextManager = new AsyncHooksScopeManager();
52+
config.contextManager.enable();
53+
}
54+
55+
super.register(config);
56+
}
4057
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/*!
2+
* Copyright 2020, OpenTelemetry Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
import {
18+
context,
19+
NoopHttpTextFormat,
20+
NoopTracerProvider,
21+
propagation,
22+
trace,
23+
} from '@opentelemetry/api';
24+
import { HttpTraceContext } from '@opentelemetry/core';
25+
import { AsyncHooksScopeManager } from '@opentelemetry/scope-async-hooks';
26+
import { NoopScopeManager } from '@opentelemetry/scope-base';
27+
import * as assert from 'assert';
28+
import { NodeTracerProvider } from '../src';
29+
30+
describe('API registration', () => {
31+
beforeEach(() => {
32+
context.initGlobalContextManager(new NoopScopeManager());
33+
propagation.initGlobalPropagator(new NoopHttpTextFormat());
34+
trace.initGlobalTracerProvider(new NoopTracerProvider());
35+
});
36+
37+
it('should register default implementations', () => {
38+
const tracerProvider = new NodeTracerProvider();
39+
tracerProvider.register();
40+
41+
assert.ok(context['_scopeManager'] instanceof AsyncHooksScopeManager);
42+
assert.ok(propagation['_propagator'] instanceof HttpTraceContext);
43+
assert.ok(trace['_tracerProvider'] === tracerProvider);
44+
});
45+
46+
it('should register configured implementations', () => {
47+
const tracerProvider = new NodeTracerProvider();
48+
49+
const contextManager = new NoopScopeManager();
50+
const propagator = new NoopHttpTextFormat();
51+
52+
tracerProvider.register({
53+
contextManager,
54+
propagator,
55+
});
56+
57+
assert.ok(context['_scopeManager'] === contextManager);
58+
assert.ok(propagation['_propagator'] === propagator);
59+
60+
assert.ok(trace['_tracerProvider'] === tracerProvider);
61+
});
62+
63+
it('should skip null context manager', () => {
64+
const tracerProvider = new NodeTracerProvider();
65+
tracerProvider.register({
66+
contextManager: null,
67+
});
68+
69+
assert.ok(context['_scopeManager'] instanceof NoopScopeManager);
70+
71+
assert.ok(propagation['_propagator'] instanceof HttpTraceContext);
72+
assert.ok(trace['_tracerProvider'] === tracerProvider);
73+
});
74+
75+
it('should skip null propagator', () => {
76+
const tracerProvider = new NodeTracerProvider();
77+
tracerProvider.register({
78+
propagator: null,
79+
});
80+
81+
assert.ok(propagation['_propagator'] instanceof NoopHttpTextFormat);
82+
83+
assert.ok(context['_scopeManager'] instanceof AsyncHooksScopeManager);
84+
assert.ok(trace['_tracerProvider'] === tracerProvider);
85+
});
86+
});

packages/opentelemetry-tracing/src/BasicTracerProvider.ts

+27-5
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,23 @@
1414
* limitations under the License.
1515
*/
1616

17-
import { ConsoleLogger } from '@opentelemetry/core';
18-
import * as types from '@opentelemetry/api';
17+
import * as api from '@opentelemetry/api';
18+
import { ConsoleLogger, HttpTraceContext } from '@opentelemetry/core';
1919
import { SpanProcessor, Tracer } from '.';
2020
import { DEFAULT_CONFIG } from './config';
2121
import { MultiSpanProcessor } from './MultiSpanProcessor';
2222
import { NoopSpanProcessor } from './NoopSpanProcessor';
23-
import { TracerConfig } from './types';
23+
import { SDKRegistrationConfig, TracerConfig } from './types';
2424

2525
/**
2626
* This class represents a basic tracer provider which platform libraries can extend
2727
*/
28-
export class BasicTracerProvider implements types.TracerProvider {
28+
export class BasicTracerProvider implements api.TracerProvider {
2929
private readonly _registeredSpanProcessors: SpanProcessor[] = [];
3030
private readonly _tracers: Map<string, Tracer> = new Map();
3131

3232
activeSpanProcessor = new NoopSpanProcessor();
33-
readonly logger: types.Logger;
33+
readonly logger: api.Logger;
3434

3535
constructor(private _config: TracerConfig = DEFAULT_CONFIG) {
3636
this.logger = _config.logger || new ConsoleLogger(_config.logLevel);
@@ -59,4 +59,26 @@ export class BasicTracerProvider implements types.TracerProvider {
5959
getActiveSpanProcessor(): SpanProcessor {
6060
return this.activeSpanProcessor;
6161
}
62+
63+
/**
64+
* Register this TracerProvider for use with the OpenTelemetry API.
65+
* Undefined values may be replaced with defaults, and
66+
* null values will be skipped.
67+
*
68+
* @param config Configuration object for SDK registration
69+
*/
70+
register(config: SDKRegistrationConfig = {}) {
71+
api.trace.initGlobalTracerProvider(this);
72+
if (config.propagator === undefined) {
73+
config.propagator = new HttpTraceContext();
74+
}
75+
76+
if (config.contextManager) {
77+
api.context.initGlobalContextManager(config.contextManager);
78+
}
79+
80+
if (config.propagator) {
81+
api.propagation.initGlobalPropagator(config.propagator);
82+
}
83+
}
6284
}

packages/opentelemetry-tracing/src/types.ts

+20-1
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,14 @@
1414
* limitations under the License.
1515
*/
1616

17-
import { Attributes, Logger, Sampler } from '@opentelemetry/api';
17+
import {
18+
Attributes,
19+
HttpTextFormat,
20+
Logger,
21+
Sampler,
22+
} from '@opentelemetry/api';
1823
import { LogLevel } from '@opentelemetry/core';
24+
import { ScopeManager } from '@opentelemetry/scope-base';
1925

2026
/**
2127
* TracerConfig provides an interface for configuring a Basic Tracer.
@@ -44,6 +50,19 @@ export interface TracerConfig {
4450
traceParams?: TraceParams;
4551
}
4652

53+
/**
54+
* Configuration options for registering the API with the SDK.
55+
* Undefined values may be substituted for defaults, and null
56+
* values will not be registered.
57+
*/
58+
export interface SDKRegistrationConfig {
59+
/** Propagator to register as the global propagator */
60+
propagator?: HttpTextFormat | null;
61+
62+
/** Context manager to register as the global context manager */
63+
contextManager?: ScopeManager | null;
64+
}
65+
4766
/** Global configuration of trace service */
4867
export interface TraceParams {
4968
/** numberOfAttributesPerSpan is number of attributes per span */

packages/opentelemetry-web/src/WebTracerProvider.ts

+22-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,12 @@
1515
*/
1616

1717
import { BasePlugin } from '@opentelemetry/core';
18-
import { BasicTracerProvider, TracerConfig } from '@opentelemetry/tracing';
18+
import {
19+
BasicTracerProvider,
20+
SDKRegistrationConfig,
21+
TracerConfig,
22+
} from '@opentelemetry/tracing';
23+
import { StackScopeManager } from './StackScopeManager';
1924

2025
/**
2126
* WebTracerConfig provides an interface for configuring a Web Tracer.
@@ -45,4 +50,20 @@ export class WebTracerProvider extends BasicTracerProvider {
4550
plugin.enable([], this, this.logger);
4651
}
4752
}
53+
54+
/**
55+
* Register this TracerProvider for use with the OpenTelemetry API.
56+
* Undefined values may be replaced with defaults, and
57+
* null values will be skipped.
58+
*
59+
* @param config Configuration object for SDK registration
60+
*/
61+
register(config: SDKRegistrationConfig = {}) {
62+
if (config.contextManager === undefined) {
63+
config.contextManager = new StackScopeManager();
64+
config.contextManager.enable();
65+
}
66+
67+
super.register(config);
68+
}
4869
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/*!
2+
* Copyright 2020, OpenTelemetry Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
import {
18+
context,
19+
NoopHttpTextFormat,
20+
NoopTracerProvider,
21+
propagation,
22+
trace,
23+
} from '@opentelemetry/api';
24+
import { HttpTraceContext } from '@opentelemetry/core';
25+
import { NoopScopeManager } from '@opentelemetry/scope-base';
26+
import * as assert from 'assert';
27+
import { WebTracerProvider, StackScopeManager } from '../src';
28+
29+
describe('API registration', () => {
30+
beforeEach(() => {
31+
context.initGlobalContextManager(new NoopScopeManager());
32+
propagation.initGlobalPropagator(new NoopHttpTextFormat());
33+
trace.initGlobalTracerProvider(new NoopTracerProvider());
34+
});
35+
36+
it('should register default implementations', () => {
37+
const tracerProvider = new WebTracerProvider();
38+
tracerProvider.register();
39+
40+
assert.ok(context['_scopeManager'] instanceof StackScopeManager);
41+
assert.ok(propagation['_propagator'] instanceof HttpTraceContext);
42+
assert.ok(trace['_tracerProvider'] === tracerProvider);
43+
});
44+
45+
it('should register configured implementations', () => {
46+
const tracerProvider = new WebTracerProvider();
47+
48+
const contextManager = new NoopScopeManager();
49+
const propagator = new NoopHttpTextFormat();
50+
51+
tracerProvider.register({
52+
contextManager,
53+
propagator,
54+
});
55+
56+
assert.ok(context['_scopeManager'] === contextManager);
57+
assert.ok(propagation['_propagator'] === propagator);
58+
59+
assert.ok(trace['_tracerProvider'] === tracerProvider);
60+
});
61+
62+
it('should skip null context manager', () => {
63+
const tracerProvider = new WebTracerProvider();
64+
tracerProvider.register({
65+
contextManager: null,
66+
});
67+
68+
assert.ok(context['_scopeManager'] instanceof NoopScopeManager);
69+
70+
assert.ok(propagation['_propagator'] instanceof HttpTraceContext);
71+
assert.ok(trace['_tracerProvider'] === tracerProvider);
72+
});
73+
74+
it('should skip null propagator', () => {
75+
const tracerProvider = new WebTracerProvider();
76+
tracerProvider.register({
77+
propagator: null,
78+
});
79+
80+
assert.ok(propagation['_propagator'] instanceof NoopHttpTextFormat);
81+
82+
assert.ok(context['_scopeManager'] instanceof StackScopeManager);
83+
assert.ok(trace['_tracerProvider'] === tracerProvider);
84+
});
85+
});

0 commit comments

Comments
 (0)