15
15
*/
16
16
17
17
import * as assert from 'assert' ;
18
- import { _global , GLOBAL_METRICS_API_KEY } from '../../src/api/global-utils' ;
18
+ import { getGlobal } from '../../src/internal/global-utils' ;
19
+ import { _globalThis } from '../../src/platform' ;
19
20
import { NoopMeterProvider } from '../../src/NoopMeterProvider' ;
21
+ import sinon = require( 'sinon' ) ;
22
+ import { diag } from '@opentelemetry/api' ;
20
23
21
24
const api1 = require ( '../../src' ) as typeof import ( '../../src' ) ;
22
25
@@ -26,18 +29,31 @@ for (const key of Object.keys(require.cache)) {
26
29
}
27
30
const api2 = require ( '../../src' ) as typeof import ( '../../src' ) ;
28
31
32
+ // This will need to be changed manually on major version changes.
33
+ // It is intentionally not autogenerated to ensure the author of the change is aware of what they are doing.
34
+ const GLOBAL_METRICS_API_SYMBOL_KEY = 'opentelemetry.js.api.metrics.0' ;
35
+
36
+ const getMockLogger = ( ) => ( {
37
+ verbose : sinon . spy ( ) ,
38
+ debug : sinon . spy ( ) ,
39
+ info : sinon . spy ( ) ,
40
+ warn : sinon . spy ( ) ,
41
+ error : sinon . spy ( ) ,
42
+ } ) ;
43
+
29
44
describe ( 'Global Utils' , ( ) => {
30
45
// prove they are separate instances
31
- assert . notStrictEqual ( api1 , api2 ) ;
46
+ assert . notEqual ( api1 , api2 ) ;
32
47
// that return separate noop instances to start
33
48
assert . notStrictEqual (
34
49
api1 . metrics . getMeterProvider ( ) ,
35
- api2 . metrics . getMeterProvider ( )
50
+ api2 . metrics . getMeterProvider ( ) ,
36
51
) ;
37
52
38
53
beforeEach ( ( ) => {
39
54
api1 . metrics . disable ( ) ;
40
- api2 . metrics . disable ( ) ;
55
+ // @ts -expect-error we are modifying internals for testing purposes here
56
+ delete _globalThis [ Symbol . for ( GLOBAL_METRICS_API_SYMBOL_KEY ) ] ;
41
57
} ) ;
42
58
43
59
it ( 'should change the global meter provider' , ( ) => {
@@ -57,20 +73,46 @@ describe('Global Utils', () => {
57
73
} ) ;
58
74
59
75
it ( 'should disable both if one is disabled' , ( ) => {
60
- const original = api1 . metrics . getMeterProvider ( ) ;
76
+ const manager = new NoopMeterProvider ( ) ;
77
+ api1 . metrics . setGlobalMeterProvider ( manager ) ;
61
78
62
- api1 . metrics . setGlobalMeterProvider ( new NoopMeterProvider ( ) ) ;
63
-
64
- assert . notStrictEqual ( original , api1 . metrics . getMeterProvider ( ) ) ;
79
+ assert . strictEqual ( manager , api1 . metrics . getMeterProvider ( ) ) ;
65
80
api2 . metrics . disable ( ) ;
66
- assert . strictEqual ( original , api1 . metrics . getMeterProvider ( ) ) ;
81
+ assert . notStrictEqual ( manager , api1 . metrics . getMeterProvider ( ) ) ;
67
82
} ) ;
68
83
69
84
it ( 'should return the module NoOp implementation if the version is a mismatch' , ( ) => {
70
- const original = api1 . metrics . getMeterProvider ( ) ;
85
+ const newMeterProvider = new NoopMeterProvider ( ) ;
86
+ api1 . metrics . setGlobalMeterProvider ( newMeterProvider ) ;
87
+
88
+ // ensure new meter provider is returned
89
+ assert . strictEqual ( api1 . metrics . getMeterProvider ( ) , newMeterProvider ) ;
90
+
91
+ const globalInstance = getGlobal ( 'metrics' ) ;
92
+ assert . ok ( globalInstance ) ;
93
+ // @ts -expect-error we are modifying internals for testing purposes here
94
+ _globalThis [ Symbol . for ( GLOBAL_METRICS_API_SYMBOL_KEY ) ] . version = '0.0.1' ;
95
+
96
+ // ensure new meter provider is not returned because version above is incompatible
97
+ assert . notStrictEqual (
98
+ api1 . metrics . getMeterProvider ( ) ,
99
+ newMeterProvider
100
+ ) ;
101
+ } ) ;
102
+
103
+ it ( 'should log an error if there is a duplicate registration' , ( ) => {
104
+ const logger = getMockLogger ( ) ;
105
+ diag . setLogger ( logger ) ;
106
+
107
+ api1 . metrics . setGlobalMeterProvider ( new NoopMeterProvider ( ) ) ;
71
108
api1 . metrics . setGlobalMeterProvider ( new NoopMeterProvider ( ) ) ;
72
- const afterSet = _global [ GLOBAL_METRICS_API_KEY ] ! ( - 1 ) ;
73
109
74
- assert . strictEqual ( original , afterSet ) ;
110
+ sinon . assert . calledOnce ( logger . error ) ;
111
+ assert . strictEqual ( logger . error . firstCall . args . length , 1 ) ;
112
+ assert . ok (
113
+ logger . error . firstCall . args [ 0 ] . startsWith (
114
+ 'Error: @opentelemetry/api: Attempted duplicate registration of API: metrics'
115
+ )
116
+ ) ;
75
117
} ) ;
76
118
} ) ;
0 commit comments