Skip to content
This repository was archived by the owner on Nov 17, 2025. It is now read-only.

Commit 1bbed91

Browse files
committed
chore: use semver to determine API compatibility
1 parent 53244ed commit 1bbed91

File tree

10 files changed

+380
-198
lines changed

10 files changed

+380
-198
lines changed

src/api/context.ts

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
import { NoopContextManager } from '../context/NoopContextManager';
1818
import { Context, ContextManager } from '../context/types';
1919
import {
20-
API_BACKWARDS_COMPATIBILITY_VERSION,
21-
GLOBAL_CONTEXT_MANAGER_API_KEY,
22-
makeGetter,
23-
_global,
24-
} from './global-utils';
20+
getGlobal,
21+
registerGlobal,
22+
unregisterGlobal,
23+
} from '../internal/global-utils';
2524

25+
const API_NAME = 'context';
2626
const NOOP_CONTEXT_MANAGER = new NoopContextManager();
2727

2828
/**
@@ -49,17 +49,7 @@ export class ContextAPI {
4949
public setGlobalContextManager(
5050
contextManager: ContextManager
5151
): ContextManager {
52-
if (_global[GLOBAL_CONTEXT_MANAGER_API_KEY]) {
53-
// global context manager has already been set
54-
return this._getContextManager();
55-
}
56-
57-
_global[GLOBAL_CONTEXT_MANAGER_API_KEY] = makeGetter(
58-
API_BACKWARDS_COMPATIBILITY_VERSION,
59-
contextManager,
60-
NOOP_CONTEXT_MANAGER
61-
);
62-
52+
registerGlobal(API_NAME, contextManager);
6353
return contextManager;
6454
}
6555

@@ -98,16 +88,12 @@ export class ContextAPI {
9888
}
9989

10090
private _getContextManager(): ContextManager {
101-
return (
102-
_global[GLOBAL_CONTEXT_MANAGER_API_KEY]?.(
103-
API_BACKWARDS_COMPATIBILITY_VERSION
104-
) ?? NOOP_CONTEXT_MANAGER
105-
);
91+
return getGlobal(API_NAME) || NOOP_CONTEXT_MANAGER;
10692
}
10793

10894
/** Disable and remove the global context manager */
10995
public disable() {
11096
this._getContextManager().disable();
111-
delete _global[GLOBAL_CONTEXT_MANAGER_API_KEY];
97+
unregisterGlobal(API_NAME);
11298
}
11399
}

src/api/diag.ts

Lines changed: 37 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -22,63 +22,38 @@ import {
2222
} from '../diag/logger';
2323
import { DiagLogLevel, createLogLevelDiagLogger } from '../diag/logLevel';
2424
import {
25-
API_BACKWARDS_COMPATIBILITY_VERSION,
26-
GLOBAL_DIAG_LOGGER_API_KEY,
27-
makeGetter,
28-
_global,
29-
} from './global-utils';
30-
31-
/** Internal simple Noop Diag API that returns a noop logger and does not allow any changes */
32-
function noopDiagApi(): DiagAPI {
33-
const noopApi = createNoopDiagLogger() as DiagAPI;
34-
35-
noopApi.getLogger = () => noopApi;
36-
noopApi.setLogger = noopApi.getLogger;
37-
noopApi.setLogLevel = () => {};
38-
39-
return noopApi;
40-
}
25+
getGlobal,
26+
registerGlobal,
27+
unregisterGlobal,
28+
} from '../internal/global-utils';
4129

4230
/**
4331
* Singleton object which represents the entry point to the OpenTelemetry internal
4432
* diagnostic API
4533
*/
4634
export class DiagAPI implements DiagLogger {
35+
private static _instance?: DiagAPI;
36+
4737
/** Get the singleton instance of the DiagAPI API */
4838
public static instance(): DiagAPI {
49-
let theInst = null;
50-
if (_global[GLOBAL_DIAG_LOGGER_API_KEY]) {
51-
// Looks like a previous instance was set, so try and fetch it
52-
theInst = _global[GLOBAL_DIAG_LOGGER_API_KEY]?.(
53-
API_BACKWARDS_COMPATIBILITY_VERSION
54-
) as DiagAPI;
55-
}
56-
57-
if (!theInst) {
58-
theInst = new DiagAPI();
59-
_global[GLOBAL_DIAG_LOGGER_API_KEY] = makeGetter(
60-
API_BACKWARDS_COMPATIBILITY_VERSION,
61-
theInst,
62-
noopDiagApi()
63-
);
39+
if (!this._instance) {
40+
this._instance = new DiagAPI();
6441
}
6542

66-
return theInst;
43+
return this._instance;
6744
}
6845

6946
/**
7047
* Private internal constructor
7148
* @private
7249
*/
7350
private constructor() {
74-
let _logLevel: DiagLogLevel = DiagLogLevel.INFO;
75-
let _filteredLogger: DiagLogger | null;
76-
let _logger: DiagLogger = createNoopDiagLogger();
51+
const _noopLogger = createNoopDiagLogger();
7752

7853
function _logProxy(funcName: keyof DiagLogger): DiagLogFunction {
7954
return function () {
8055
const orgArguments = arguments as unknown;
81-
const theLogger = _filteredLogger || _logger;
56+
const theLogger = getGlobal('filteredDiagLogger') || _noopLogger;
8257
const theFunc = theLogger[funcName];
8358
if (typeof theFunc === 'function') {
8459
return theFunc.apply(
@@ -89,34 +64,44 @@ export class DiagAPI implements DiagLogger {
8964
};
9065
}
9166

67+
function getLevel(): DiagLogLevel {
68+
return getGlobal('diagLogLevel') ?? DiagLogLevel.INFO;
69+
}
70+
9271
// Using self local variable for minification purposes as 'this' cannot be minified
9372
const self = this;
9473

9574
// DiagAPI specific functions
9675

9776
self.getLogger = (): DiagLogger => {
98-
// Return itself if no existing logger is defined (defaults effectively to a Noop)
99-
return _logger;
77+
return getGlobal('diagLogger') || _noopLogger;
10078
};
10179

10280
self.setLogger = (logger?: DiagLogger): DiagLogger => {
103-
const prevLogger = _logger;
104-
if (!logger || logger !== self) {
105-
// Simple special case to avoid any possible infinite recursion on the logging functions
106-
_logger = logger || createNoopDiagLogger();
107-
_filteredLogger = createLogLevelDiagLogger(_logLevel, _logger);
108-
}
109-
110-
return prevLogger;
81+
const previous = getGlobal('diagLogger') || _noopLogger;
82+
83+
unregisterGlobal('diagLogger');
84+
unregisterGlobal('filteredDiagLogger');
85+
86+
const newLogger = logger || _noopLogger;
87+
registerGlobal('diagLogger', newLogger);
88+
registerGlobal(
89+
'filteredDiagLogger',
90+
createLogLevelDiagLogger(getLevel(), newLogger)
91+
);
92+
93+
return previous;
11194
};
11295

11396
self.setLogLevel = (maxLogLevel: DiagLogLevel) => {
114-
if (maxLogLevel !== _logLevel) {
115-
_logLevel = maxLogLevel;
116-
if (_logger) {
117-
_filteredLogger = createLogLevelDiagLogger(maxLogLevel, _logger);
118-
}
119-
}
97+
const logger = self.getLogger();
98+
unregisterGlobal('diagLogLevel');
99+
unregisterGlobal('filteredDiagLogger');
100+
registerGlobal('diagLogLevel', maxLogLevel);
101+
registerGlobal(
102+
'filteredDiagLogger',
103+
createLogLevelDiagLogger(maxLogLevel, logger)
104+
);
120105
};
121106

122107
for (let i = 0; i < diagLoggerFunctions.length; i++) {

src/api/global-utils.ts

Lines changed: 0 additions & 70 deletions
This file was deleted.

src/api/propagation.ts

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@ import {
2424
TextMapSetter,
2525
} from '../propagation/TextMapPropagator';
2626
import {
27-
API_BACKWARDS_COMPATIBILITY_VERSION,
28-
GLOBAL_PROPAGATION_API_KEY,
29-
makeGetter,
30-
_global,
31-
} from './global-utils';
27+
getGlobal,
28+
registerGlobal,
29+
unregisterGlobal,
30+
} from '../internal/global-utils';
31+
32+
const API_NAME = 'propagation';
3233

3334
/**
3435
* Singleton object which represents the entry point to the OpenTelemetry Propagation API
@@ -52,17 +53,7 @@ export class PropagationAPI {
5253
* Set the current propagator. Returns the initialized propagator
5354
*/
5455
public setGlobalPropagator(propagator: TextMapPropagator): TextMapPropagator {
55-
if (_global[GLOBAL_PROPAGATION_API_KEY]) {
56-
// global propagator has already been set
57-
return this._getGlobalPropagator();
58-
}
59-
60-
_global[GLOBAL_PROPAGATION_API_KEY] = makeGetter(
61-
API_BACKWARDS_COMPATIBILITY_VERSION,
62-
propagator,
63-
NOOP_TEXT_MAP_PROPAGATOR
64-
);
65-
56+
registerGlobal(API_NAME, propagator);
6657
return propagator;
6758
}
6859

@@ -105,14 +96,10 @@ export class PropagationAPI {
10596

10697
/** Remove the global propagator */
10798
public disable() {
108-
delete _global[GLOBAL_PROPAGATION_API_KEY];
99+
unregisterGlobal(API_NAME);
109100
}
110101

111102
private _getGlobalPropagator(): TextMapPropagator {
112-
return (
113-
_global[GLOBAL_PROPAGATION_API_KEY]?.(
114-
API_BACKWARDS_COMPATIBILITY_VERSION
115-
) ?? NOOP_TEXT_MAP_PROPAGATOR
116-
);
103+
return getGlobal(API_NAME) || NOOP_TEXT_MAP_PROPAGATOR;
117104
}
118105
}

src/api/trace.ts

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

17-
import { NOOP_TRACER_PROVIDER } from '../trace/NoopTracerProvider';
1817
import { ProxyTracerProvider } from '../trace/ProxyTracerProvider';
1918
import { Tracer } from '../trace/tracer';
2019
import { TracerProvider } from '../trace/tracer_provider';
2120
import { isSpanContextValid } from '../trace/spancontext-utils';
2221
import {
23-
API_BACKWARDS_COMPATIBILITY_VERSION,
24-
GLOBAL_TRACE_API_KEY,
25-
makeGetter,
26-
_global,
27-
} from './global-utils';
22+
getGlobal,
23+
registerGlobal,
24+
unregisterGlobal,
25+
} from '../internal/global-utils';
26+
27+
const API_NAME = 'trace';
2828

2929
/**
3030
* Singleton object which represents the entry point to the OpenTelemetry Tracing API
@@ -50,30 +50,16 @@ export class TraceAPI {
5050
* Set the current global tracer. Returns the initialized global tracer provider
5151
*/
5252
public setGlobalTracerProvider(provider: TracerProvider): TracerProvider {
53-
if (_global[GLOBAL_TRACE_API_KEY]) {
54-
// global tracer provider has already been set
55-
return this.getTracerProvider();
56-
}
57-
5853
this._proxyTracerProvider.setDelegate(provider);
59-
60-
_global[GLOBAL_TRACE_API_KEY] = makeGetter(
61-
API_BACKWARDS_COMPATIBILITY_VERSION,
62-
this._proxyTracerProvider,
63-
NOOP_TRACER_PROVIDER
64-
);
65-
66-
return this.getTracerProvider();
54+
registerGlobal(API_NAME, this._proxyTracerProvider);
55+
return this._proxyTracerProvider;
6756
}
6857

6958
/**
7059
* Returns the global tracer provider.
7160
*/
7261
public getTracerProvider(): TracerProvider {
73-
return (
74-
_global[GLOBAL_TRACE_API_KEY]?.(API_BACKWARDS_COMPATIBILITY_VERSION) ??
75-
this._proxyTracerProvider
76-
);
62+
return getGlobal(API_NAME) || this._proxyTracerProvider;
7763
}
7864

7965
/**
@@ -85,7 +71,7 @@ export class TraceAPI {
8571

8672
/** Remove the global tracer provider */
8773
public disable() {
88-
delete _global[GLOBAL_TRACE_API_KEY];
74+
unregisterGlobal(API_NAME);
8975
this._proxyTracerProvider = new ProxyTracerProvider();
9076
}
9177

0 commit comments

Comments
 (0)