@@ -15,26 +15,49 @@ jest.mock('../../../lib/config/tracing', () => ({
15
15
createTracingConfig : jest . fn ( ) . mockReturnValue ( { tracing : 'mock-tracing' } )
16
16
} ) ) ;
17
17
18
- const {
19
- createInstrumentationConfig
20
- } = require ( '../../../lib/config/instrumentations' ) ;
21
- const { createMetricsConfig } = require ( '../../../lib/config/metrics' ) ;
22
- const { createResourceConfig } = require ( '../../../lib/config/resource' ) ;
23
- const { createTracingConfig } = require ( '../../../lib/config/tracing' ) ;
24
- const { diag, DiagLogLevel } = require ( '@opentelemetry/sdk-node' ) . api ;
25
- const { NodeSDK } = require ( '@opentelemetry/sdk-node' ) ;
26
- const logger = require ( '@dotcom-reliability-kit/logger' ) ;
27
-
28
- logger . createChildLogger . mockReturnValue ( 'mock child logger' ) ;
29
- DiagLogLevel . INFO = 'mock info log level' ;
30
-
31
- // Import the OTel function for testing
32
- const opentelemetry = require ( '../../../lib/index' ) ;
33
-
34
18
describe ( '@dotcom-reliability-kit/opentelemetry' , ( ) => {
19
+ let createInstrumentationConfig ;
20
+ let createMetricsConfig ;
21
+ let createResourceConfig ;
22
+ let createTracingConfig ;
23
+ let diag ;
24
+ let DiagLogLevel ;
25
+ let logger ;
26
+ let NodeSDK ;
27
+ let opentelemetry ;
28
+
29
+ // Helper function to reload all modules. We need this because the setup
30
+ // method stores a global singleton so it's impossible to call it multiple
31
+ // times with different configuration values normally. We need to do this
32
+ // in the tests though
33
+ function reloadAllModules ( ) {
34
+ jest . resetModules ( ) ;
35
+ createInstrumentationConfig =
36
+ require ( '../../../lib/config/instrumentations' ) . createInstrumentationConfig ;
37
+ createMetricsConfig =
38
+ require ( '../../../lib/config/metrics' ) . createMetricsConfig ;
39
+ createResourceConfig =
40
+ require ( '../../../lib/config/resource' ) . createResourceConfig ;
41
+ createTracingConfig =
42
+ require ( '../../../lib/config/tracing' ) . createTracingConfig ;
43
+ diag = require ( '@opentelemetry/sdk-node' ) . api . diag ;
44
+ DiagLogLevel = require ( '@opentelemetry/sdk-node' ) . api . DiagLogLevel ;
45
+ NodeSDK = require ( '@opentelemetry/sdk-node' ) . NodeSDK ;
46
+ logger = require ( '@dotcom-reliability-kit/logger' ) ;
47
+
48
+ logger . createChildLogger . mockReturnValue ( 'mock child logger' ) ;
49
+ DiagLogLevel . INFO = 'mock info log level' ;
50
+
51
+ opentelemetry = require ( '../../../lib/index' ) ;
52
+ }
53
+
54
+ beforeEach ( reloadAllModules ) ;
55
+
35
56
describe ( '.setup(options)' , ( ) => {
36
- beforeAll ( ( ) => {
37
- opentelemetry . setup ( {
57
+ let instances ;
58
+
59
+ beforeEach ( ( ) => {
60
+ instances = opentelemetry . setup ( {
38
61
tracing : {
39
62
endpoint : 'mock-tracing-endpoint' ,
40
63
samplePercentage : 137
@@ -93,9 +116,16 @@ describe('@dotcom-reliability-kit/opentelemetry', () => {
93
116
expect ( NodeSDK . prototype . start ) . toHaveBeenCalledTimes ( 1 ) ;
94
117
} ) ;
95
118
119
+ it ( 'returns the SDK instance' , ( ) => {
120
+ expect ( instances ) . toEqual ( {
121
+ sdk : NodeSDK . mock . instances [ 0 ]
122
+ } ) ;
123
+ } ) ;
124
+
96
125
describe ( 'when no options are set' , ( ) => {
97
- beforeAll ( ( ) => {
126
+ beforeEach ( ( ) => {
98
127
NodeSDK . mockClear ( ) ;
128
+ reloadAllModules ( ) ;
99
129
opentelemetry . setup ( ) ;
100
130
} ) ;
101
131
@@ -111,8 +141,9 @@ describe('@dotcom-reliability-kit/opentelemetry', () => {
111
141
} ) ;
112
142
113
143
describe ( 'when an authorization header is passed into the root options (deprecated)' , ( ) => {
114
- beforeAll ( ( ) => {
144
+ beforeEach ( ( ) => {
115
145
createTracingConfig . mockReset ( ) ;
146
+ reloadAllModules ( ) ;
116
147
opentelemetry . setup ( {
117
148
authorizationHeader : 'mock-authorization-header-root' ,
118
149
tracing : {
@@ -131,8 +162,9 @@ describe('@dotcom-reliability-kit/opentelemetry', () => {
131
162
} ) ;
132
163
133
164
describe ( 'when an authorization header is passed into the tracing options' , ( ) => {
134
- beforeAll ( ( ) => {
165
+ beforeEach ( ( ) => {
135
166
createTracingConfig . mockReset ( ) ;
167
+ reloadAllModules ( ) ;
136
168
opentelemetry . setup ( {
137
169
tracing : {
138
170
authorizationHeader : 'mock-authorization-header-tracing' ,
@@ -151,8 +183,9 @@ describe('@dotcom-reliability-kit/opentelemetry', () => {
151
183
} ) ;
152
184
153
185
describe ( 'when an authorization header is passed into both the root options (deprecated) and tracing options' , ( ) => {
154
- beforeAll ( ( ) => {
186
+ beforeEach ( ( ) => {
155
187
createTracingConfig . mockReset ( ) ;
188
+ reloadAllModules ( ) ;
156
189
opentelemetry . setup ( {
157
190
authorizationHeader : 'mock-authorization-header-root' ,
158
191
tracing : {
@@ -172,8 +205,9 @@ describe('@dotcom-reliability-kit/opentelemetry', () => {
172
205
} ) ;
173
206
174
207
describe ( 'when OTEL_ environment variables are defined' , ( ) => {
175
- beforeAll ( ( ) => {
208
+ beforeEach ( ( ) => {
176
209
process . env . OTEL_MOCK = 'mock' ;
210
+ reloadAllModules ( ) ;
177
211
opentelemetry . setup ( ) ;
178
212
} ) ;
179
213
@@ -185,5 +219,39 @@ describe('@dotcom-reliability-kit/opentelemetry', () => {
185
219
} ) ;
186
220
} ) ;
187
221
} ) ;
222
+
223
+ describe ( 'when called a second time' , ( ) => {
224
+ let returnValue1 ;
225
+ let returnValue2 ;
226
+
227
+ beforeEach ( ( ) => {
228
+ reloadAllModules ( ) ;
229
+ returnValue1 = opentelemetry . setup ( {
230
+ tracing : {
231
+ endpoint : 'mock-tracing-endpoint' ,
232
+ samplePercentage : 137
233
+ } ,
234
+ metrics : {
235
+ endpoint : 'mock-metrics-endpoint'
236
+ }
237
+ } ) ;
238
+ returnValue2 = opentelemetry . setup ( ) ;
239
+ } ) ;
240
+
241
+ it ( 'instantiates and starts the OpenTelemetry Node SDK once only' , ( ) => {
242
+ expect ( NodeSDK ) . toHaveBeenCalledTimes ( 1 ) ;
243
+ expect ( NodeSDK ) . toHaveBeenCalledWith ( {
244
+ instrumentations : 'mock-instrumentations' ,
245
+ resource : 'mock-resource' ,
246
+ tracing : 'mock-tracing' ,
247
+ metrics : 'mock-metrics'
248
+ } ) ;
249
+ expect ( NodeSDK . prototype . start ) . toHaveBeenCalledTimes ( 1 ) ;
250
+ } ) ;
251
+
252
+ it ( 'returns the same instances on each call' , ( ) => {
253
+ expect ( returnValue1 ) . toStrictEqual ( returnValue2 ) ;
254
+ } ) ;
255
+ } ) ;
188
256
} ) ;
189
257
} ) ;
0 commit comments