@opentelemetry/instrumentation-xml-http-request 0.26.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,387 @@
1
+ /*
2
+ * Copyright The 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
+ import * as api from '@opentelemetry/api';
17
+ import { isWrapped, InstrumentationBase, safeExecuteInTheMiddle, } from '@opentelemetry/instrumentation';
18
+ import { hrTime, isUrlIgnored, otperformance } from '@opentelemetry/core';
19
+ import { SemanticAttributes } from '@opentelemetry/semantic-conventions';
20
+ import { addSpanNetworkEvents, getResource, PerformanceTimingNames as PTN, shouldPropagateTraceHeaders, parseUrl, } from '@opentelemetry/sdk-trace-web';
21
+ import { EventNames } from './enums/EventNames';
22
+ import { VERSION } from './version';
23
+ import { AttributeNames } from './enums/AttributeNames';
24
+ // how long to wait for observer to collect information about resources
25
+ // this is needed as event "load" is called before observer
26
+ // hard to say how long it should really wait, seems like 300ms is
27
+ // safe enough
28
+ const OBSERVER_WAIT_TIME_MS = 300;
29
+ /**
30
+ * This class represents a XMLHttpRequest plugin for auto instrumentation
31
+ */
32
+ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
33
+ constructor(config) {
34
+ super('@opentelemetry/instrumentation-xml-http-request', VERSION, config);
35
+ this.component = 'xml-http-request';
36
+ this.version = VERSION;
37
+ this.moduleName = this.component;
38
+ this._tasksCount = 0;
39
+ this._xhrMem = new WeakMap();
40
+ this._usedResources = new WeakSet();
41
+ }
42
+ init() { }
43
+ _getConfig() {
44
+ return this._config;
45
+ }
46
+ /**
47
+ * Adds custom headers to XMLHttpRequest
48
+ * @param xhr
49
+ * @param spanUrl
50
+ * @private
51
+ */
52
+ _addHeaders(xhr, spanUrl) {
53
+ const url = parseUrl(spanUrl).href;
54
+ if (!shouldPropagateTraceHeaders(url, this._getConfig().propagateTraceHeaderCorsUrls)) {
55
+ const headers = {};
56
+ api.propagation.inject(api.context.active(), headers);
57
+ if (Object.keys(headers).length > 0) {
58
+ this._diag.debug('headers inject skipped due to CORS policy');
59
+ }
60
+ return;
61
+ }
62
+ const headers = {};
63
+ api.propagation.inject(api.context.active(), headers);
64
+ Object.keys(headers).forEach(key => {
65
+ xhr.setRequestHeader(key, String(headers[key]));
66
+ });
67
+ }
68
+ /**
69
+ * Add cors pre flight child span
70
+ * @param span
71
+ * @param corsPreFlightRequest
72
+ * @private
73
+ */
74
+ _addChildSpan(span, corsPreFlightRequest) {
75
+ api.context.with(api.trace.setSpan(api.context.active(), span), () => {
76
+ const childSpan = this.tracer.startSpan('CORS Preflight', {
77
+ startTime: corsPreFlightRequest[PTN.FETCH_START],
78
+ });
79
+ addSpanNetworkEvents(childSpan, corsPreFlightRequest);
80
+ childSpan.end(corsPreFlightRequest[PTN.RESPONSE_END]);
81
+ });
82
+ }
83
+ /**
84
+ * Add attributes when span is going to end
85
+ * @param span
86
+ * @param xhr
87
+ * @param spanUrl
88
+ * @private
89
+ */
90
+ _addFinalSpanAttributes(span, xhrMem, spanUrl) {
91
+ if (typeof spanUrl === 'string') {
92
+ const parsedUrl = parseUrl(spanUrl);
93
+ if (xhrMem.status !== undefined) {
94
+ span.setAttribute(SemanticAttributes.HTTP_STATUS_CODE, xhrMem.status);
95
+ }
96
+ if (xhrMem.statusText !== undefined) {
97
+ span.setAttribute(AttributeNames.HTTP_STATUS_TEXT, xhrMem.statusText);
98
+ }
99
+ span.setAttribute(SemanticAttributes.HTTP_HOST, parsedUrl.host);
100
+ span.setAttribute(SemanticAttributes.HTTP_SCHEME, parsedUrl.protocol.replace(':', ''));
101
+ // @TODO do we want to collect this or it will be collected earlier once only or
102
+ // maybe when parent span is not available ?
103
+ span.setAttribute(SemanticAttributes.HTTP_USER_AGENT, navigator.userAgent);
104
+ }
105
+ }
106
+ _applyAttributesAfterXHR(span, xhr) {
107
+ const applyCustomAttributesOnSpan = this._getConfig()
108
+ .applyCustomAttributesOnSpan;
109
+ if (typeof applyCustomAttributesOnSpan === 'function') {
110
+ safeExecuteInTheMiddle(() => applyCustomAttributesOnSpan(span, xhr), error => {
111
+ if (!error) {
112
+ return;
113
+ }
114
+ this._diag.error('applyCustomAttributesOnSpan', error);
115
+ }, true);
116
+ }
117
+ }
118
+ /**
119
+ * will collect information about all resources created
120
+ * between "send" and "end" with additional waiting for main resource
121
+ * @param xhr
122
+ * @param spanUrl
123
+ * @private
124
+ */
125
+ _addResourceObserver(xhr, spanUrl) {
126
+ const xhrMem = this._xhrMem.get(xhr);
127
+ if (!xhrMem ||
128
+ typeof PerformanceObserver !== 'function' ||
129
+ typeof PerformanceResourceTiming !== 'function') {
130
+ return;
131
+ }
132
+ xhrMem.createdResources = {
133
+ observer: new PerformanceObserver(list => {
134
+ const entries = list.getEntries();
135
+ const parsedUrl = parseUrl(spanUrl);
136
+ entries.forEach(entry => {
137
+ if (entry.initiatorType === 'xmlhttprequest' &&
138
+ entry.name === parsedUrl.href) {
139
+ if (xhrMem.createdResources) {
140
+ xhrMem.createdResources.entries.push(entry);
141
+ }
142
+ }
143
+ });
144
+ }),
145
+ entries: [],
146
+ };
147
+ xhrMem.createdResources.observer.observe({
148
+ entryTypes: ['resource'],
149
+ });
150
+ }
151
+ /**
152
+ * Clears the resource timings and all resources assigned with spans
153
+ * when {@link XMLHttpRequestInstrumentationConfig.clearTimingResources} is
154
+ * set to true (default false)
155
+ * @private
156
+ */
157
+ _clearResources() {
158
+ if (this._tasksCount === 0 && this._getConfig().clearTimingResources) {
159
+ otperformance.clearResourceTimings();
160
+ this._xhrMem = new WeakMap();
161
+ this._usedResources = new WeakSet();
162
+ }
163
+ }
164
+ /**
165
+ * Finds appropriate resource and add network events to the span
166
+ * @param span
167
+ */
168
+ _findResourceAndAddNetworkEvents(xhrMem, span, spanUrl, startTime, endTime) {
169
+ if (!spanUrl || !startTime || !endTime || !xhrMem.createdResources) {
170
+ return;
171
+ }
172
+ let resources = xhrMem.createdResources.entries;
173
+ if (!resources || !resources.length) {
174
+ // fallback - either Observer is not available or it took longer
175
+ // then OBSERVER_WAIT_TIME_MS and observer didn't collect enough
176
+ // information
177
+ // ts thinks this is the perf_hooks module, but it is the browser performance api
178
+ resources = otperformance.getEntriesByType('resource');
179
+ }
180
+ const resource = getResource(parseUrl(spanUrl).href, startTime, endTime, resources, this._usedResources);
181
+ if (resource.mainRequest) {
182
+ const mainRequest = resource.mainRequest;
183
+ this._markResourceAsUsed(mainRequest);
184
+ const corsPreFlightRequest = resource.corsPreFlightRequest;
185
+ if (corsPreFlightRequest) {
186
+ this._addChildSpan(span, corsPreFlightRequest);
187
+ this._markResourceAsUsed(corsPreFlightRequest);
188
+ }
189
+ addSpanNetworkEvents(span, mainRequest);
190
+ }
191
+ }
192
+ /**
193
+ * Removes the previous information about span.
194
+ * This might happened when the same xhr is used again.
195
+ * @param xhr
196
+ * @private
197
+ */
198
+ _cleanPreviousSpanInformation(xhr) {
199
+ const xhrMem = this._xhrMem.get(xhr);
200
+ if (xhrMem) {
201
+ const callbackToRemoveEvents = xhrMem.callbackToRemoveEvents;
202
+ if (callbackToRemoveEvents) {
203
+ callbackToRemoveEvents();
204
+ }
205
+ this._xhrMem.delete(xhr);
206
+ }
207
+ }
208
+ /**
209
+ * Creates a new span when method "open" is called
210
+ * @param xhr
211
+ * @param url
212
+ * @param method
213
+ * @private
214
+ */
215
+ _createSpan(xhr, url, method) {
216
+ if (isUrlIgnored(url, this._getConfig().ignoreUrls)) {
217
+ this._diag.debug('ignoring span as url matches ignored url');
218
+ return;
219
+ }
220
+ const spanName = `HTTP ${method.toUpperCase()}`;
221
+ const currentSpan = this.tracer.startSpan(spanName, {
222
+ kind: api.SpanKind.CLIENT,
223
+ attributes: {
224
+ [SemanticAttributes.HTTP_METHOD]: method,
225
+ [SemanticAttributes.HTTP_URL]: url,
226
+ },
227
+ });
228
+ currentSpan.addEvent(EventNames.METHOD_OPEN);
229
+ this._cleanPreviousSpanInformation(xhr);
230
+ this._xhrMem.set(xhr, {
231
+ span: currentSpan,
232
+ spanUrl: url,
233
+ });
234
+ return currentSpan;
235
+ }
236
+ /**
237
+ * Marks certain [resource]{@link PerformanceResourceTiming} when information
238
+ * from this is used to add events to span.
239
+ * This is done to avoid reusing the same resource again for next span
240
+ * @param resource
241
+ * @private
242
+ */
243
+ _markResourceAsUsed(resource) {
244
+ this._usedResources.add(resource);
245
+ }
246
+ /**
247
+ * Patches the method open
248
+ * @private
249
+ */
250
+ _patchOpen() {
251
+ return (original) => {
252
+ const plugin = this;
253
+ return function patchOpen(...args) {
254
+ const method = args[0];
255
+ const url = args[1];
256
+ plugin._createSpan(this, url, method);
257
+ return original.apply(this, args);
258
+ };
259
+ };
260
+ }
261
+ /**
262
+ * Patches the method send
263
+ * @private
264
+ */
265
+ _patchSend() {
266
+ const plugin = this;
267
+ function endSpanTimeout(eventName, xhrMem, endTime) {
268
+ const callbackToRemoveEvents = xhrMem.callbackToRemoveEvents;
269
+ if (typeof callbackToRemoveEvents === 'function') {
270
+ callbackToRemoveEvents();
271
+ }
272
+ const { span, spanUrl, sendStartTime } = xhrMem;
273
+ if (span) {
274
+ plugin._findResourceAndAddNetworkEvents(xhrMem, span, spanUrl, sendStartTime, endTime);
275
+ span.addEvent(eventName, endTime);
276
+ plugin._addFinalSpanAttributes(span, xhrMem, spanUrl);
277
+ span.end(endTime);
278
+ plugin._tasksCount--;
279
+ }
280
+ plugin._clearResources();
281
+ }
282
+ function endSpan(eventName, xhr) {
283
+ const xhrMem = plugin._xhrMem.get(xhr);
284
+ if (!xhrMem) {
285
+ return;
286
+ }
287
+ xhrMem.status = xhr.status;
288
+ xhrMem.statusText = xhr.statusText;
289
+ plugin._xhrMem.delete(xhr);
290
+ if (xhrMem.span) {
291
+ plugin._applyAttributesAfterXHR(xhrMem.span, xhr);
292
+ }
293
+ const endTime = hrTime();
294
+ // the timeout is needed as observer doesn't have yet information
295
+ // when event "load" is called. Also the time may differ depends on
296
+ // browser and speed of computer
297
+ setTimeout(() => {
298
+ endSpanTimeout(eventName, xhrMem, endTime);
299
+ }, OBSERVER_WAIT_TIME_MS);
300
+ }
301
+ function onError() {
302
+ endSpan(EventNames.EVENT_ERROR, this);
303
+ }
304
+ function onAbort() {
305
+ endSpan(EventNames.EVENT_ABORT, this);
306
+ }
307
+ function onTimeout() {
308
+ endSpan(EventNames.EVENT_TIMEOUT, this);
309
+ }
310
+ function onLoad() {
311
+ if (this.status < 299) {
312
+ endSpan(EventNames.EVENT_LOAD, this);
313
+ }
314
+ else {
315
+ endSpan(EventNames.EVENT_ERROR, this);
316
+ }
317
+ }
318
+ function unregister(xhr) {
319
+ xhr.removeEventListener('abort', onAbort);
320
+ xhr.removeEventListener('error', onError);
321
+ xhr.removeEventListener('load', onLoad);
322
+ xhr.removeEventListener('timeout', onTimeout);
323
+ const xhrMem = plugin._xhrMem.get(xhr);
324
+ if (xhrMem) {
325
+ xhrMem.callbackToRemoveEvents = undefined;
326
+ }
327
+ }
328
+ return (original) => {
329
+ return function patchSend(...args) {
330
+ const xhrMem = plugin._xhrMem.get(this);
331
+ if (!xhrMem) {
332
+ return original.apply(this, args);
333
+ }
334
+ const currentSpan = xhrMem.span;
335
+ const spanUrl = xhrMem.spanUrl;
336
+ if (currentSpan && spanUrl) {
337
+ api.context.with(api.trace.setSpan(api.context.active(), currentSpan), () => {
338
+ plugin._tasksCount++;
339
+ xhrMem.sendStartTime = hrTime();
340
+ currentSpan.addEvent(EventNames.METHOD_SEND);
341
+ this.addEventListener('abort', onAbort);
342
+ this.addEventListener('error', onError);
343
+ this.addEventListener('load', onLoad);
344
+ this.addEventListener('timeout', onTimeout);
345
+ xhrMem.callbackToRemoveEvents = () => {
346
+ unregister(this);
347
+ if (xhrMem.createdResources) {
348
+ xhrMem.createdResources.observer.disconnect();
349
+ }
350
+ };
351
+ plugin._addHeaders(this, spanUrl);
352
+ plugin._addResourceObserver(this, spanUrl);
353
+ });
354
+ }
355
+ return original.apply(this, args);
356
+ };
357
+ };
358
+ }
359
+ /**
360
+ * implements enable function
361
+ */
362
+ enable() {
363
+ this._diag.debug('applying patch to', this.moduleName, this.version);
364
+ if (isWrapped(XMLHttpRequest.prototype.open)) {
365
+ this._unwrap(XMLHttpRequest.prototype, 'open');
366
+ this._diag.debug('removing previous patch from method open');
367
+ }
368
+ if (isWrapped(XMLHttpRequest.prototype.send)) {
369
+ this._unwrap(XMLHttpRequest.prototype, 'send');
370
+ this._diag.debug('removing previous patch from method send');
371
+ }
372
+ this._wrap(XMLHttpRequest.prototype, 'open', this._patchOpen());
373
+ this._wrap(XMLHttpRequest.prototype, 'send', this._patchSend());
374
+ }
375
+ /**
376
+ * implements disable function
377
+ */
378
+ disable() {
379
+ this._diag.debug('removing patch from', this.moduleName, this.version);
380
+ this._unwrap(XMLHttpRequest.prototype, 'open');
381
+ this._unwrap(XMLHttpRequest.prototype, 'send');
382
+ this._tasksCount = 0;
383
+ this._xhrMem = new WeakMap();
384
+ this._usedResources = new WeakSet();
385
+ }
386
+ }
387
+ //# sourceMappingURL=xhr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xhr.js","sourceRoot":"","sources":["../../src/xhr.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as api from '@opentelemetry/api';\nimport {\n isWrapped,\n InstrumentationBase,\n InstrumentationConfig,\n safeExecuteInTheMiddle,\n} from '@opentelemetry/instrumentation';\nimport { hrTime, isUrlIgnored, otperformance } from '@opentelemetry/core';\nimport { SemanticAttributes } from '@opentelemetry/semantic-conventions';\nimport {\n addSpanNetworkEvents,\n getResource,\n PerformanceTimingNames as PTN,\n shouldPropagateTraceHeaders,\n parseUrl,\n} from '@opentelemetry/sdk-trace-web';\nimport { EventNames } from './enums/EventNames';\nimport {\n OpenFunction,\n PropagateTraceHeaderCorsUrls,\n SendFunction,\n XhrMem,\n} from './types';\nimport { VERSION } from './version';\nimport { AttributeNames } from './enums/AttributeNames';\n\n// how long to wait for observer to collect information about resources\n// this is needed as event \"load\" is called before observer\n// hard to say how long it should really wait, seems like 300ms is\n// safe enough\nconst OBSERVER_WAIT_TIME_MS = 300;\n\nexport type XHRCustomAttributeFunction = (\n span: api.Span,\n xhr: XMLHttpRequest\n) => void;\n\n/**\n * XMLHttpRequest config\n */\nexport interface XMLHttpRequestInstrumentationConfig\n extends InstrumentationConfig {\n /**\n * The number of timing resources is limited, after the limit\n * (chrome 250, safari 150) the information is not collected anymore.\n * The only way to prevent that is to regularly clean the resources\n * whenever it is possible. This is needed only when PerformanceObserver\n * is not available\n */\n clearTimingResources?: boolean;\n /** URLs which should include trace headers when origin doesn't match */\n propagateTraceHeaderCorsUrls?: PropagateTraceHeaderCorsUrls;\n /**\n * URLs that partially match any regex in ignoreUrls will not be traced.\n * In addition, URLs that are _exact matches_ of strings in ignoreUrls will\n * also not be traced.\n */\n ignoreUrls?: Array<string | RegExp>;\n /** Function for adding custom attributes on the span */\n applyCustomAttributesOnSpan?: XHRCustomAttributeFunction;\n}\n\n/**\n * This class represents a XMLHttpRequest plugin for auto instrumentation\n */\nexport class XMLHttpRequestInstrumentation extends InstrumentationBase<XMLHttpRequest> {\n readonly component: string = 'xml-http-request';\n readonly version: string = VERSION;\n moduleName = this.component;\n\n private _tasksCount = 0;\n private _xhrMem = new WeakMap<XMLHttpRequest, XhrMem>();\n private _usedResources = new WeakSet<PerformanceResourceTiming>();\n\n constructor(config?: XMLHttpRequestInstrumentationConfig) {\n super(\n '@opentelemetry/instrumentation-xml-http-request',\n VERSION,\n config\n );\n }\n\n init() {}\n\n private _getConfig(): XMLHttpRequestInstrumentationConfig {\n return this._config;\n }\n\n /**\n * Adds custom headers to XMLHttpRequest\n * @param xhr\n * @param spanUrl\n * @private\n */\n private _addHeaders(xhr: XMLHttpRequest, spanUrl: string) {\n const url = parseUrl(spanUrl).href;\n if (\n !shouldPropagateTraceHeaders(\n url,\n this._getConfig().propagateTraceHeaderCorsUrls\n )\n ) {\n const headers: Partial<Record<string, unknown>> = {};\n api.propagation.inject(api.context.active(), headers);\n if (Object.keys(headers).length > 0) {\n this._diag.debug('headers inject skipped due to CORS policy');\n }\n return;\n }\n const headers: { [key: string]: unknown } = {};\n api.propagation.inject(api.context.active(), headers);\n Object.keys(headers).forEach(key => {\n xhr.setRequestHeader(key, String(headers[key]));\n });\n }\n\n /**\n * Add cors pre flight child span\n * @param span\n * @param corsPreFlightRequest\n * @private\n */\n private _addChildSpan(\n span: api.Span,\n corsPreFlightRequest: PerformanceResourceTiming\n ): void {\n api.context.with(api.trace.setSpan(api.context.active(), span), () => {\n const childSpan = this.tracer.startSpan('CORS Preflight', {\n startTime: corsPreFlightRequest[PTN.FETCH_START],\n });\n addSpanNetworkEvents(childSpan, corsPreFlightRequest);\n childSpan.end(corsPreFlightRequest[PTN.RESPONSE_END]);\n });\n }\n\n /**\n * Add attributes when span is going to end\n * @param span\n * @param xhr\n * @param spanUrl\n * @private\n */\n _addFinalSpanAttributes(span: api.Span, xhrMem: XhrMem, spanUrl?: string) {\n if (typeof spanUrl === 'string') {\n const parsedUrl = parseUrl(spanUrl);\n if (xhrMem.status !== undefined) {\n span.setAttribute(SemanticAttributes.HTTP_STATUS_CODE, xhrMem.status);\n }\n if (xhrMem.statusText !== undefined) {\n span.setAttribute(AttributeNames.HTTP_STATUS_TEXT, xhrMem.statusText);\n }\n span.setAttribute(SemanticAttributes.HTTP_HOST, parsedUrl.host);\n span.setAttribute(\n SemanticAttributes.HTTP_SCHEME,\n parsedUrl.protocol.replace(':', '')\n );\n\n // @TODO do we want to collect this or it will be collected earlier once only or\n // maybe when parent span is not available ?\n span.setAttribute(\n SemanticAttributes.HTTP_USER_AGENT,\n navigator.userAgent\n );\n }\n }\n\n private _applyAttributesAfterXHR(span: api.Span, xhr: XMLHttpRequest) {\n const applyCustomAttributesOnSpan = this._getConfig()\n .applyCustomAttributesOnSpan;\n if (typeof applyCustomAttributesOnSpan === 'function') {\n safeExecuteInTheMiddle(\n () => applyCustomAttributesOnSpan(span, xhr),\n error => {\n if (!error) {\n return;\n }\n\n this._diag.error('applyCustomAttributesOnSpan', error);\n },\n true\n );\n }\n }\n\n /**\n * will collect information about all resources created\n * between \"send\" and \"end\" with additional waiting for main resource\n * @param xhr\n * @param spanUrl\n * @private\n */\n private _addResourceObserver(xhr: XMLHttpRequest, spanUrl: string) {\n const xhrMem = this._xhrMem.get(xhr);\n if (\n !xhrMem ||\n typeof PerformanceObserver !== 'function' ||\n typeof PerformanceResourceTiming !== 'function'\n ) {\n return;\n }\n xhrMem.createdResources = {\n observer: new PerformanceObserver(list => {\n const entries = list.getEntries() as PerformanceResourceTiming[];\n const parsedUrl = parseUrl(spanUrl);\n\n entries.forEach(entry => {\n if (\n entry.initiatorType === 'xmlhttprequest' &&\n entry.name === parsedUrl.href\n ) {\n if (xhrMem.createdResources) {\n xhrMem.createdResources.entries.push(entry);\n }\n }\n });\n }),\n entries: [],\n };\n xhrMem.createdResources.observer.observe({\n entryTypes: ['resource'],\n });\n }\n\n /**\n * Clears the resource timings and all resources assigned with spans\n * when {@link XMLHttpRequestInstrumentationConfig.clearTimingResources} is\n * set to true (default false)\n * @private\n */\n private _clearResources() {\n if (this._tasksCount === 0 && this._getConfig().clearTimingResources) {\n ((otperformance as unknown) as Performance).clearResourceTimings();\n this._xhrMem = new WeakMap<XMLHttpRequest, XhrMem>();\n this._usedResources = new WeakSet<PerformanceResourceTiming>();\n }\n }\n\n /**\n * Finds appropriate resource and add network events to the span\n * @param span\n */\n private _findResourceAndAddNetworkEvents(\n xhrMem: XhrMem,\n span: api.Span,\n spanUrl?: string,\n startTime?: api.HrTime,\n endTime?: api.HrTime\n ): void {\n if (!spanUrl || !startTime || !endTime || !xhrMem.createdResources) {\n return;\n }\n\n let resources: PerformanceResourceTiming[] =\n xhrMem.createdResources.entries;\n\n if (!resources || !resources.length) {\n // fallback - either Observer is not available or it took longer\n // then OBSERVER_WAIT_TIME_MS and observer didn't collect enough\n // information\n // ts thinks this is the perf_hooks module, but it is the browser performance api\n resources = ((otperformance as unknown) as Performance).getEntriesByType(\n 'resource'\n ) as PerformanceResourceTiming[];\n }\n\n const resource = getResource(\n parseUrl(spanUrl).href,\n startTime,\n endTime,\n resources,\n this._usedResources\n );\n\n if (resource.mainRequest) {\n const mainRequest = resource.mainRequest;\n this._markResourceAsUsed(mainRequest);\n\n const corsPreFlightRequest = resource.corsPreFlightRequest;\n if (corsPreFlightRequest) {\n this._addChildSpan(span, corsPreFlightRequest);\n this._markResourceAsUsed(corsPreFlightRequest);\n }\n addSpanNetworkEvents(span, mainRequest);\n }\n }\n\n /**\n * Removes the previous information about span.\n * This might happened when the same xhr is used again.\n * @param xhr\n * @private\n */\n private _cleanPreviousSpanInformation(xhr: XMLHttpRequest) {\n const xhrMem = this._xhrMem.get(xhr);\n if (xhrMem) {\n const callbackToRemoveEvents = xhrMem.callbackToRemoveEvents;\n if (callbackToRemoveEvents) {\n callbackToRemoveEvents();\n }\n this._xhrMem.delete(xhr);\n }\n }\n\n /**\n * Creates a new span when method \"open\" is called\n * @param xhr\n * @param url\n * @param method\n * @private\n */\n private _createSpan(\n xhr: XMLHttpRequest,\n url: string,\n method: string\n ): api.Span | undefined {\n if (isUrlIgnored(url, this._getConfig().ignoreUrls)) {\n this._diag.debug('ignoring span as url matches ignored url');\n return;\n }\n const spanName = `HTTP ${method.toUpperCase()}`;\n\n const currentSpan = this.tracer.startSpan(spanName, {\n kind: api.SpanKind.CLIENT,\n attributes: {\n [SemanticAttributes.HTTP_METHOD]: method,\n [SemanticAttributes.HTTP_URL]: url,\n },\n });\n\n currentSpan.addEvent(EventNames.METHOD_OPEN);\n\n this._cleanPreviousSpanInformation(xhr);\n\n this._xhrMem.set(xhr, {\n span: currentSpan,\n spanUrl: url,\n });\n\n return currentSpan;\n }\n\n /**\n * Marks certain [resource]{@link PerformanceResourceTiming} when information\n * from this is used to add events to span.\n * This is done to avoid reusing the same resource again for next span\n * @param resource\n * @private\n */\n private _markResourceAsUsed(resource: PerformanceResourceTiming) {\n this._usedResources.add(resource);\n }\n\n /**\n * Patches the method open\n * @private\n */\n protected _patchOpen() {\n return (original: OpenFunction): OpenFunction => {\n const plugin = this;\n return function patchOpen(this: XMLHttpRequest, ...args): void {\n const method: string = args[0];\n const url: string = args[1];\n plugin._createSpan(this, url, method);\n\n return original.apply(this, args);\n };\n };\n }\n\n /**\n * Patches the method send\n * @private\n */\n protected _patchSend() {\n const plugin = this;\n\n function endSpanTimeout(\n eventName: string,\n xhrMem: XhrMem,\n endTime: api.HrTime\n ) {\n const callbackToRemoveEvents = xhrMem.callbackToRemoveEvents;\n\n if (typeof callbackToRemoveEvents === 'function') {\n callbackToRemoveEvents();\n }\n\n const { span, spanUrl, sendStartTime } = xhrMem;\n\n if (span) {\n plugin._findResourceAndAddNetworkEvents(\n xhrMem,\n span,\n spanUrl,\n sendStartTime,\n endTime\n );\n span.addEvent(eventName, endTime);\n plugin._addFinalSpanAttributes(span, xhrMem, spanUrl);\n span.end(endTime);\n plugin._tasksCount--;\n }\n plugin._clearResources();\n }\n\n function endSpan(eventName: string, xhr: XMLHttpRequest) {\n const xhrMem = plugin._xhrMem.get(xhr);\n if (!xhrMem) {\n return;\n }\n xhrMem.status = xhr.status;\n xhrMem.statusText = xhr.statusText;\n plugin._xhrMem.delete(xhr);\n\n if (xhrMem.span) {\n plugin._applyAttributesAfterXHR(xhrMem.span, xhr);\n }\n const endTime = hrTime();\n\n // the timeout is needed as observer doesn't have yet information\n // when event \"load\" is called. Also the time may differ depends on\n // browser and speed of computer\n setTimeout(() => {\n endSpanTimeout(eventName, xhrMem, endTime);\n }, OBSERVER_WAIT_TIME_MS);\n }\n\n function onError(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_ERROR, this);\n }\n\n function onAbort(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_ABORT, this);\n }\n\n function onTimeout(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_TIMEOUT, this);\n }\n\n function onLoad(this: XMLHttpRequest) {\n if (this.status < 299) {\n endSpan(EventNames.EVENT_LOAD, this);\n } else {\n endSpan(EventNames.EVENT_ERROR, this);\n }\n }\n\n function unregister(xhr: XMLHttpRequest) {\n xhr.removeEventListener('abort', onAbort);\n xhr.removeEventListener('error', onError);\n xhr.removeEventListener('load', onLoad);\n xhr.removeEventListener('timeout', onTimeout);\n const xhrMem = plugin._xhrMem.get(xhr);\n if (xhrMem) {\n xhrMem.callbackToRemoveEvents = undefined;\n }\n }\n\n return (original: SendFunction): SendFunction => {\n return function patchSend(this: XMLHttpRequest, ...args): void {\n const xhrMem = plugin._xhrMem.get(this);\n if (!xhrMem) {\n return original.apply(this, args);\n }\n const currentSpan = xhrMem.span;\n const spanUrl = xhrMem.spanUrl;\n\n if (currentSpan && spanUrl) {\n api.context.with(\n api.trace.setSpan(api.context.active(), currentSpan),\n () => {\n plugin._tasksCount++;\n xhrMem.sendStartTime = hrTime();\n currentSpan.addEvent(EventNames.METHOD_SEND);\n\n this.addEventListener('abort', onAbort);\n this.addEventListener('error', onError);\n this.addEventListener('load', onLoad);\n this.addEventListener('timeout', onTimeout);\n\n xhrMem.callbackToRemoveEvents = () => {\n unregister(this);\n if (xhrMem.createdResources) {\n xhrMem.createdResources.observer.disconnect();\n }\n };\n plugin._addHeaders(this, spanUrl);\n plugin._addResourceObserver(this, spanUrl);\n }\n );\n }\n return original.apply(this, args);\n };\n };\n }\n\n /**\n * implements enable function\n */\n override enable() {\n this._diag.debug('applying patch to', this.moduleName, this.version);\n\n if (isWrapped(XMLHttpRequest.prototype.open)) {\n this._unwrap(XMLHttpRequest.prototype, 'open');\n this._diag.debug('removing previous patch from method open');\n }\n\n if (isWrapped(XMLHttpRequest.prototype.send)) {\n this._unwrap(XMLHttpRequest.prototype, 'send');\n this._diag.debug('removing previous patch from method send');\n }\n\n this._wrap(XMLHttpRequest.prototype, 'open', this._patchOpen());\n this._wrap(XMLHttpRequest.prototype, 'send', this._patchSend());\n }\n\n /**\n * implements disable function\n */\n override disable() {\n this._diag.debug('removing patch from', this.moduleName, this.version);\n\n this._unwrap(XMLHttpRequest.prototype, 'open');\n this._unwrap(XMLHttpRequest.prototype, 'send');\n\n this._tasksCount = 0;\n this._xhrMem = new WeakMap<XMLHttpRequest, XhrMem>();\n this._usedResources = new WeakSet<PerformanceResourceTiming>();\n }\n}\n"]}
@@ -6,7 +6,7 @@ export declare type OpenFunction = (method: string, url: string, async?: boolean
6
6
  /**
7
7
  * method "send" from XMLHttpRequest
8
8
  */
9
- export declare type SendFunction = (body?: SendBody) => void;
9
+ export declare type SendFunction = typeof XMLHttpRequest.prototype.send;
10
10
  export declare type SendBody = string | Document | Blob | ArrayBufferView | ArrayBuffer | FormData | URLSearchParams | ReadableStream<Uint8Array> | null;
11
11
  /**
12
12
  * interface to store information in weak map about spans, resources and
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as api from '@opentelemetry/api';\n\n/**\n * method \"open\" from XMLHttpRequest\n */\nexport type OpenFunction = (\n method: string,\n url: string,\n async?: boolean,\n user?: string | null,\n pass?: string | null\n) => void;\n\n/**\n * method \"send\" from XMLHttpRequest\n */\nexport type SendFunction = (body?: SendBody) => void;\n\nexport type SendBody =\n | string\n | Document\n | Blob\n | ArrayBufferView\n | ArrayBuffer\n | FormData\n // eslint-disable-next-line node/no-unsupported-features/node-builtins\n | URLSearchParams\n | ReadableStream<Uint8Array>\n | null;\n\n/**\n * interface to store information in weak map about spans, resources and\n * callbacks\n */\nexport interface XhrMem {\n status?: number;\n statusText?: string;\n // span assigned to xhr\n span: api.Span;\n // span url - not available on types.Span\n spanUrl?: string;\n // startTime of send function - used to filter cors preflight requests\n sendStartTime?: api.HrTime;\n // resources created between send and end plus some additional timeout\n createdResources?: {\n observer: PerformanceObserver;\n entries: PerformanceResourceTiming[];\n };\n // callback to remove events from xhr once the span ends\n callbackToRemoveEvents?: Function;\n}\n\nexport type PropagateTraceHeaderCorsUrl = string | RegExp;\n\nexport type PropagateTraceHeaderCorsUrls =\n | PropagateTraceHeaderCorsUrl\n | PropagateTraceHeaderCorsUrl[];\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as api from '@opentelemetry/api';\n\n/**\n * method \"open\" from XMLHttpRequest\n */\nexport type OpenFunction = (\n method: string,\n url: string,\n async?: boolean,\n user?: string | null,\n pass?: string | null\n) => void;\n\n/**\n * method \"send\" from XMLHttpRequest\n */\nexport type SendFunction = typeof XMLHttpRequest.prototype.send;\n\nexport type SendBody =\n | string\n | Document\n | Blob\n | ArrayBufferView\n | ArrayBuffer\n | FormData\n // eslint-disable-next-line node/no-unsupported-features/node-builtins\n | URLSearchParams\n | ReadableStream<Uint8Array>\n | null;\n\n/**\n * interface to store information in weak map about spans, resources and\n * callbacks\n */\nexport interface XhrMem {\n status?: number;\n statusText?: string;\n // span assigned to xhr\n span: api.Span;\n // span url - not available on types.Span\n spanUrl?: string;\n // startTime of send function - used to filter cors preflight requests\n sendStartTime?: api.HrTime;\n // resources created between send and end plus some additional timeout\n createdResources?: {\n observer: PerformanceObserver;\n entries: PerformanceResourceTiming[];\n };\n // callback to remove events from xhr once the span ends\n callbackToRemoveEvents?: Function;\n}\n\nexport type PropagateTraceHeaderCorsUrl = string | RegExp;\n\nexport type PropagateTraceHeaderCorsUrls =\n | PropagateTraceHeaderCorsUrl\n | PropagateTraceHeaderCorsUrl[];\n"]}
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.26.0";
1
+ export declare const VERSION = "0.29.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -17,5 +17,5 @@
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.VERSION = void 0;
19
19
  // this is autogenerated file, see scripts/version-update.js
20
- exports.VERSION = '0.26.0';
20
+ exports.VERSION = '0.29.0';
21
21
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,4DAA4D;AAC/C,QAAA,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '0.26.0';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,4DAA4D;AAC/C,QAAA,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '0.29.0';\n"]}
@@ -6,7 +6,15 @@ export declare type XHRCustomAttributeFunction = (span: api.Span, xhr: XMLHttpRe
6
6
  * XMLHttpRequest config
7
7
  */
8
8
  export interface XMLHttpRequestInstrumentationConfig extends InstrumentationConfig {
9
+ /**
10
+ * The number of timing resources is limited, after the limit
11
+ * (chrome 250, safari 150) the information is not collected anymore.
12
+ * The only way to prevent that is to regularly clean the resources
13
+ * whenever it is possible. This is needed only when PerformanceObserver
14
+ * is not available
15
+ */
9
16
  clearTimingResources?: boolean;
17
+ /** URLs which should include trace headers when origin doesn't match */
10
18
  propagateTraceHeaderCorsUrls?: PropagateTraceHeaderCorsUrls;
11
19
  /**
12
20
  * URLs that partially match any regex in ignoreUrls will not be traced.
@@ -27,13 +35,13 @@ export declare class XMLHttpRequestInstrumentation extends InstrumentationBase<X
27
35
  private _tasksCount;
28
36
  private _xhrMem;
29
37
  private _usedResources;
30
- constructor(config?: XMLHttpRequestInstrumentationConfig & InstrumentationConfig);
38
+ constructor(config?: XMLHttpRequestInstrumentationConfig);
31
39
  init(): void;
32
40
  private _getConfig;
33
41
  /**
34
42
  * Adds custom headers to XMLHttpRequest
35
43
  * @param xhr
36
- * @param span
44
+ * @param spanUrl
37
45
  * @private
38
46
  */
39
47
  private _addHeaders;
package/build/src/xhr.js CHANGED
@@ -33,8 +33,8 @@ const OBSERVER_WAIT_TIME_MS = 300;
33
33
  * This class represents a XMLHttpRequest plugin for auto instrumentation
34
34
  */
35
35
  class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBase {
36
- constructor(config = {}) {
37
- super('@opentelemetry/instrumentation-xml-http-request', version_1.VERSION, Object.assign({}, config));
36
+ constructor(config) {
37
+ super('@opentelemetry/instrumentation-xml-http-request', version_1.VERSION, config);
38
38
  this.component = 'xml-http-request';
39
39
  this.version = version_1.VERSION;
40
40
  this.moduleName = this.component;
@@ -49,11 +49,12 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
49
49
  /**
50
50
  * Adds custom headers to XMLHttpRequest
51
51
  * @param xhr
52
- * @param span
52
+ * @param spanUrl
53
53
  * @private
54
54
  */
55
55
  _addHeaders(xhr, spanUrl) {
56
- if (!sdk_trace_web_1.shouldPropagateTraceHeaders(spanUrl, this._getConfig().propagateTraceHeaderCorsUrls)) {
56
+ const url = (0, sdk_trace_web_1.parseUrl)(spanUrl).href;
57
+ if (!(0, sdk_trace_web_1.shouldPropagateTraceHeaders)(url, this._getConfig().propagateTraceHeaderCorsUrls)) {
57
58
  const headers = {};
58
59
  api.propagation.inject(api.context.active(), headers);
59
60
  if (Object.keys(headers).length > 0) {
@@ -78,7 +79,7 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
78
79
  const childSpan = this.tracer.startSpan('CORS Preflight', {
79
80
  startTime: corsPreFlightRequest[sdk_trace_web_1.PerformanceTimingNames.FETCH_START],
80
81
  });
81
- sdk_trace_web_1.addSpanNetworkEvents(childSpan, corsPreFlightRequest);
82
+ (0, sdk_trace_web_1.addSpanNetworkEvents)(childSpan, corsPreFlightRequest);
82
83
  childSpan.end(corsPreFlightRequest[sdk_trace_web_1.PerformanceTimingNames.RESPONSE_END]);
83
84
  });
84
85
  }
@@ -91,7 +92,7 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
91
92
  */
92
93
  _addFinalSpanAttributes(span, xhrMem, spanUrl) {
93
94
  if (typeof spanUrl === 'string') {
94
- const parsedUrl = sdk_trace_web_1.parseUrl(spanUrl);
95
+ const parsedUrl = (0, sdk_trace_web_1.parseUrl)(spanUrl);
95
96
  if (xhrMem.status !== undefined) {
96
97
  span.setAttribute(semantic_conventions_1.SemanticAttributes.HTTP_STATUS_CODE, xhrMem.status);
97
98
  }
@@ -109,7 +110,7 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
109
110
  const applyCustomAttributesOnSpan = this._getConfig()
110
111
  .applyCustomAttributesOnSpan;
111
112
  if (typeof applyCustomAttributesOnSpan === 'function') {
112
- instrumentation_1.safeExecuteInTheMiddle(() => applyCustomAttributesOnSpan(span, xhr), error => {
113
+ (0, instrumentation_1.safeExecuteInTheMiddle)(() => applyCustomAttributesOnSpan(span, xhr), error => {
113
114
  if (!error) {
114
115
  return;
115
116
  }
@@ -127,18 +128,17 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
127
128
  _addResourceObserver(xhr, spanUrl) {
128
129
  const xhrMem = this._xhrMem.get(xhr);
129
130
  if (!xhrMem ||
130
- typeof window.PerformanceObserver === 'undefined' ||
131
- typeof window.PerformanceResourceTiming === 'undefined') {
131
+ typeof PerformanceObserver !== 'function' ||
132
+ typeof PerformanceResourceTiming !== 'function') {
132
133
  return;
133
134
  }
134
135
  xhrMem.createdResources = {
135
136
  observer: new PerformanceObserver(list => {
136
137
  const entries = list.getEntries();
137
- const urlNormalizingAnchor = sdk_trace_web_1.getUrlNormalizingAnchor();
138
- urlNormalizingAnchor.href = spanUrl;
138
+ const parsedUrl = (0, sdk_trace_web_1.parseUrl)(spanUrl);
139
139
  entries.forEach(entry => {
140
140
  if (entry.initiatorType === 'xmlhttprequest' &&
141
- entry.name === urlNormalizingAnchor.href) {
141
+ entry.name === parsedUrl.href) {
142
142
  if (xhrMem.createdResources) {
143
143
  xhrMem.createdResources.entries.push(entry);
144
144
  }
@@ -180,7 +180,7 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
180
180
  // ts thinks this is the perf_hooks module, but it is the browser performance api
181
181
  resources = core_1.otperformance.getEntriesByType('resource');
182
182
  }
183
- const resource = sdk_trace_web_1.getResource(spanUrl, startTime, endTime, resources, this._usedResources);
183
+ const resource = (0, sdk_trace_web_1.getResource)((0, sdk_trace_web_1.parseUrl)(spanUrl).href, startTime, endTime, resources, this._usedResources);
184
184
  if (resource.mainRequest) {
185
185
  const mainRequest = resource.mainRequest;
186
186
  this._markResourceAsUsed(mainRequest);
@@ -189,7 +189,7 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
189
189
  this._addChildSpan(span, corsPreFlightRequest);
190
190
  this._markResourceAsUsed(corsPreFlightRequest);
191
191
  }
192
- sdk_trace_web_1.addSpanNetworkEvents(span, mainRequest);
192
+ (0, sdk_trace_web_1.addSpanNetworkEvents)(span, mainRequest);
193
193
  }
194
194
  }
195
195
  /**
@@ -216,7 +216,7 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
216
216
  * @private
217
217
  */
218
218
  _createSpan(xhr, url, method) {
219
- if (core_1.isUrlIgnored(url, this._getConfig().ignoreUrls)) {
219
+ if ((0, core_1.isUrlIgnored)(url, this._getConfig().ignoreUrls)) {
220
220
  this._diag.debug('ignoring span as url matches ignored url');
221
221
  return;
222
222
  }
@@ -293,7 +293,7 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
293
293
  if (xhrMem.span) {
294
294
  plugin._applyAttributesAfterXHR(xhrMem.span, xhr);
295
295
  }
296
- const endTime = core_1.hrTime();
296
+ const endTime = (0, core_1.hrTime)();
297
297
  // the timeout is needed as observer doesn't have yet information
298
298
  // when event "load" is called. Also the time may differ depends on
299
299
  // browser and speed of computer
@@ -339,7 +339,7 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
339
339
  if (currentSpan && spanUrl) {
340
340
  api.context.with(api.trace.setSpan(api.context.active(), currentSpan), () => {
341
341
  plugin._tasksCount++;
342
- xhrMem.sendStartTime = core_1.hrTime();
342
+ xhrMem.sendStartTime = (0, core_1.hrTime)();
343
343
  currentSpan.addEvent(EventNames_1.EventNames.METHOD_SEND);
344
344
  this.addEventListener('abort', onAbort);
345
345
  this.addEventListener('error', onError);
@@ -364,11 +364,11 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
364
364
  */
365
365
  enable() {
366
366
  this._diag.debug('applying patch to', this.moduleName, this.version);
367
- if (instrumentation_1.isWrapped(XMLHttpRequest.prototype.open)) {
367
+ if ((0, instrumentation_1.isWrapped)(XMLHttpRequest.prototype.open)) {
368
368
  this._unwrap(XMLHttpRequest.prototype, 'open');
369
369
  this._diag.debug('removing previous patch from method open');
370
370
  }
371
- if (instrumentation_1.isWrapped(XMLHttpRequest.prototype.send)) {
371
+ if ((0, instrumentation_1.isWrapped)(XMLHttpRequest.prototype.send)) {
372
372
  this._unwrap(XMLHttpRequest.prototype, 'send');
373
373
  this._diag.debug('removing previous patch from method send');
374
374
  }