@opentelemetry/instrumentation-xml-http-request 0.215.0 → 0.217.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.
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.215.0";
1
+ export declare const VERSION = "0.217.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -3,5 +3,5 @@
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
5
  // this is autogenerated file, see scripts/version-update.js
6
- export const VERSION = '0.215.0';
6
+ export const VERSION = '0.217.0';
7
7
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,4DAA4D;AAC5D,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '0.215.0';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,4DAA4D;AAC5D,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '0.217.0';\n"]}
@@ -43,6 +43,8 @@ export declare class XMLHttpRequestInstrumentation extends InstrumentationBase<X
43
43
  private _xhrMem;
44
44
  private _usedResources;
45
45
  private _semconvStability;
46
+ private _isEnabled;
47
+ private _isXhrPatched;
46
48
  constructor(config?: XMLHttpRequestInstrumentationConfig);
47
49
  init(): void;
48
50
  /**
package/build/esm/xhr.js CHANGED
@@ -3,7 +3,7 @@
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
5
  import * as api from '@opentelemetry/api';
6
- import { SemconvStability, semconvStabilityFromStr, isWrapped, InstrumentationBase, safeExecuteInTheMiddle, } from '@opentelemetry/instrumentation';
6
+ import { SemconvStability, semconvStabilityFromStr, InstrumentationBase, safeExecuteInTheMiddle, } from '@opentelemetry/instrumentation';
7
7
  import { hrTime, isUrlIgnored, otperformance } from '@opentelemetry/core';
8
8
  import { addSpanNetworkEvents, getResource, PerformanceTimingNames as PTN, shouldPropagateTraceHeaders, parseUrl, } from '@opentelemetry/sdk-trace-web';
9
9
  import { ATTR_ERROR_TYPE, ATTR_HTTP_REQUEST_METHOD, ATTR_HTTP_REQUEST_METHOD_ORIGINAL, ATTR_HTTP_RESPONSE_STATUS_CODE, ATTR_SERVER_ADDRESS, ATTR_SERVER_PORT, ATTR_URL_FULL, } from '@opentelemetry/semantic-conventions';
@@ -214,12 +214,12 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
214
214
  * @private
215
215
  */
216
216
  _createSpan(xhr, url, method) {
217
- if (isUrlIgnored(url, this.getConfig().ignoreUrls)) {
217
+ const parsedUrl = parseUrl(url);
218
+ if (isUrlIgnored(parsedUrl.href, this.getConfig().ignoreUrls)) {
218
219
  this._diag.debug('ignoring span as url matches ignored url');
219
220
  return;
220
221
  }
221
222
  let name = '';
222
- const parsedUrl = parseUrl(url);
223
223
  const attributes = {};
224
224
  if (this._semconvStability & SemconvStability.OLD) {
225
225
  name = method.toUpperCase();
@@ -275,6 +275,9 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
275
275
  return (original) => {
276
276
  const plugin = this;
277
277
  return function patchOpen(...args) {
278
+ if (!plugin._isEnabled) {
279
+ return original.apply(this, args);
280
+ }
278
281
  const method = args[0];
279
282
  const url = args[1];
280
283
  plugin._createSpan(this, url, method);
@@ -368,6 +371,9 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
368
371
  }
369
372
  return (original) => {
370
373
  return function patchSend(...args) {
374
+ if (!plugin._isEnabled) {
375
+ return original.apply(this, args);
376
+ }
371
377
  const xhrMem = plugin._xhrMem.get(this);
372
378
  if (!xhrMem) {
373
379
  return original.apply(this, args);
@@ -413,25 +419,37 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
413
419
  * implements enable function
414
420
  */
415
421
  enable() {
416
- this._diag.debug('applying patch to', this.moduleName, this.version);
417
- if (isWrapped(XMLHttpRequest.prototype.open)) {
418
- this._unwrap(XMLHttpRequest.prototype, 'open');
419
- this._diag.debug('removing previous patch from method open');
422
+ if (this._isEnabled) {
423
+ return;
424
+ }
425
+ if (this._isXhrPatched) {
426
+ this._diag.debug('reactivating existing patch on', this.moduleName, this.version);
427
+ this._isEnabled = true;
428
+ return;
429
+ }
430
+ try {
431
+ this._diag.debug('applying patch to', this.moduleName, this.version);
432
+ this._wrap(XMLHttpRequest.prototype, 'open', this._patchOpen());
433
+ this._wrap(XMLHttpRequest.prototype, 'send', this._patchSend());
434
+ this._isXhrPatched = true;
435
+ this._isEnabled = true;
420
436
  }
421
- if (isWrapped(XMLHttpRequest.prototype.send)) {
437
+ catch (err) {
438
+ // make sure there is no wrapped functions
439
+ this._unwrap(XMLHttpRequest.prototype, 'open');
422
440
  this._unwrap(XMLHttpRequest.prototype, 'send');
423
- this._diag.debug('removing previous patch from method send');
441
+ this._diag.warn('Failed to patch globalThis.XMLHttpRequest; instrumentation will not be enabled. ' +
442
+ 'Another script may have locked globalThis.XMLHttpRequest via Object.defineProperty.', err);
424
443
  }
425
- this._wrap(XMLHttpRequest.prototype, 'open', this._patchOpen());
426
- this._wrap(XMLHttpRequest.prototype, 'send', this._patchSend());
427
444
  }
428
445
  /**
429
446
  * implements disable function
430
447
  */
431
448
  disable() {
432
- this._diag.debug('removing patch from', this.moduleName, this.version);
433
- this._unwrap(XMLHttpRequest.prototype, 'open');
434
- this._unwrap(XMLHttpRequest.prototype, 'send');
449
+ if (!this._isEnabled) {
450
+ return;
451
+ }
452
+ this._isEnabled = false;
435
453
  this._tasksCount = 0;
436
454
  this._xhrMem = new WeakMap();
437
455
  this._usedResources = new WeakSet();
@@ -1 +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 * SPDX-License-Identifier: Apache-2.0\n */\n\nimport * as api from '@opentelemetry/api';\nimport type { InstrumentationConfig } from '@opentelemetry/instrumentation';\nimport {\n SemconvStability,\n semconvStabilityFromStr,\n isWrapped,\n InstrumentationBase,\n safeExecuteInTheMiddle,\n} from '@opentelemetry/instrumentation';\nimport { hrTime, isUrlIgnored, otperformance } from '@opentelemetry/core';\nimport {\n addSpanNetworkEvents,\n getResource,\n PerformanceTimingNames as PTN,\n shouldPropagateTraceHeaders,\n parseUrl,\n} from '@opentelemetry/sdk-trace-web';\nimport {\n ATTR_ERROR_TYPE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_REQUEST_METHOD_ORIGINAL,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_URL_FULL,\n} from '@opentelemetry/semantic-conventions';\nimport {\n ATTR_HTTP_HOST,\n ATTR_HTTP_METHOD,\n ATTR_HTTP_SCHEME,\n ATTR_HTTP_STATUS_CODE,\n ATTR_HTTP_URL,\n ATTR_HTTP_USER_AGENT,\n ATTR_HTTP_REQUEST_BODY_SIZE,\n ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED,\n} from './semconv';\nimport { EventNames } from './enums/EventNames';\nimport type {\n OpenFunction,\n PropagateTraceHeaderCorsUrls,\n SendFunction,\n XhrMem,\n} from './types';\nimport {\n normalizeHttpRequestMethod,\n serverPortFromUrl,\n getXHRBodyLength,\n} from './utils';\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 /** Ignore adding network events as span events */\n ignoreNetworkEvents?: boolean;\n /** Measure outgoing request size */\n measureRequestSize?: boolean;\n /** Select the HTTP semantic conventions version(s) used. */\n semconvStabilityOptIn?: string;\n}\n\n/**\n * This class represents a XMLHttpRequest plugin for auto instrumentation\n */\nexport class XMLHttpRequestInstrumentation extends InstrumentationBase<XMLHttpRequestInstrumentationConfig> {\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 private _semconvStability: SemconvStability;\n\n constructor(config: XMLHttpRequestInstrumentationConfig = {}) {\n super('@opentelemetry/instrumentation-xml-http-request', VERSION, config);\n this._semconvStability = semconvStabilityFromStr(\n 'http',\n config?.semconvStabilityOptIn\n );\n }\n\n init() {}\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 const skipOldSemconvContentLengthAttrs = !(\n this._semconvStability & SemconvStability.OLD\n );\n addSpanNetworkEvents(\n childSpan,\n corsPreFlightRequest,\n this.getConfig().ignoreNetworkEvents,\n undefined,\n skipOldSemconvContentLengthAttrs\n );\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 (this._semconvStability & SemconvStability.OLD) {\n if (xhrMem.status !== undefined) {\n span.setAttribute(ATTR_HTTP_STATUS_CODE, xhrMem.status);\n }\n if (xhrMem.statusText !== undefined) {\n span.setAttribute(AttributeNames.HTTP_STATUS_TEXT, xhrMem.statusText);\n }\n if (typeof spanUrl === 'string') {\n const parsedUrl = parseUrl(spanUrl);\n span.setAttribute(ATTR_HTTP_HOST, parsedUrl.host);\n span.setAttribute(\n ATTR_HTTP_SCHEME,\n parsedUrl.protocol.replace(':', '')\n );\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(ATTR_HTTP_USER_AGENT, navigator.userAgent);\n }\n if (this._semconvStability & SemconvStability.STABLE) {\n if (xhrMem.status) {\n // Intentionally exclude status=0, because XHR uses 0 for before a\n // response is received and semconv says to only add the attribute if\n // received a response.\n span.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, xhrMem.status);\n }\n }\n }\n\n private _applyAttributesAfterXHR(span: api.Span, xhr: XMLHttpRequest) {\n const applyCustomAttributesOnSpan =\n this.getConfig().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 const skipOldSemconvContentLengthAttrs = !(\n this._semconvStability & SemconvStability.OLD\n );\n addSpanNetworkEvents(\n span,\n mainRequest,\n this.getConfig().ignoreNetworkEvents,\n undefined,\n skipOldSemconvContentLengthAttrs\n );\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\n let name = '';\n const parsedUrl = parseUrl(url);\n const attributes = {} as api.Attributes;\n if (this._semconvStability & SemconvStability.OLD) {\n name = method.toUpperCase();\n attributes[ATTR_HTTP_METHOD] = method;\n attributes[ATTR_HTTP_URL] = parsedUrl.toString();\n }\n if (this._semconvStability & SemconvStability.STABLE) {\n const origMethod = method;\n const normMethod = normalizeHttpRequestMethod(method);\n if (!name) {\n // The \"old\" span name wins if emitting both old and stable semconv\n // ('http/dup').\n name = normMethod;\n }\n attributes[ATTR_HTTP_REQUEST_METHOD] = normMethod;\n if (normMethod !== origMethod) {\n attributes[ATTR_HTTP_REQUEST_METHOD_ORIGINAL] = origMethod;\n }\n attributes[ATTR_URL_FULL] = parsedUrl.toString();\n attributes[ATTR_SERVER_ADDRESS] = parsedUrl.hostname;\n const serverPort = serverPortFromUrl(parsedUrl);\n if (serverPort) {\n attributes[ATTR_SERVER_PORT] = serverPort;\n }\n }\n\n const currentSpan = this.tracer.startSpan(name, {\n kind: api.SpanKind.CLIENT,\n attributes,\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 performanceEndTime: api.HrTime,\n endTime: number\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 performanceEndTime\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(\n eventName: string,\n xhr: XMLHttpRequest,\n isError: boolean,\n errorType?: string\n ) {\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 const span = xhrMem.span;\n plugin._applyAttributesAfterXHR(span, xhr);\n\n if (plugin._semconvStability & SemconvStability.STABLE) {\n if (isError) {\n if (errorType) {\n span.setStatus({\n code: api.SpanStatusCode.ERROR,\n message: errorType,\n });\n span.setAttribute(ATTR_ERROR_TYPE, errorType);\n }\n } else if (xhrMem.status && xhrMem.status >= 400) {\n span.setStatus({ code: api.SpanStatusCode.ERROR });\n span.setAttribute(ATTR_ERROR_TYPE, String(xhrMem.status));\n }\n }\n }\n\n const performanceEndTime = hrTime();\n const endTime = Date.now();\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, performanceEndTime, endTime);\n }, OBSERVER_WAIT_TIME_MS);\n }\n\n function onError(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_ERROR, this, true, 'error');\n }\n\n function onAbort(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_ABORT, this, false);\n }\n\n function onTimeout(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_TIMEOUT, this, true, 'timeout');\n }\n\n function onLoad(this: XMLHttpRequest) {\n if (this.status < 299) {\n endSpan(EventNames.EVENT_LOAD, this, false);\n } else {\n endSpan(EventNames.EVENT_ERROR, this, false);\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 if (plugin.getConfig().measureRequestSize && args?.[0]) {\n const body = args[0];\n const bodyLength = getXHRBodyLength(body);\n if (bodyLength !== undefined) {\n if (plugin._semconvStability & SemconvStability.OLD) {\n currentSpan.setAttribute(\n ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED,\n bodyLength\n );\n }\n if (plugin._semconvStability & SemconvStability.STABLE) {\n currentSpan.setAttribute(\n ATTR_HTTP_REQUEST_BODY_SIZE,\n bodyLength\n );\n }\n }\n }\n\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"]}
1
+ {"version":3,"file":"xhr.js","sourceRoot":"","sources":["../../src/xhr.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport * as api from '@opentelemetry/api';\nimport type { InstrumentationConfig } from '@opentelemetry/instrumentation';\nimport {\n SemconvStability,\n semconvStabilityFromStr,\n InstrumentationBase,\n safeExecuteInTheMiddle,\n} from '@opentelemetry/instrumentation';\nimport { hrTime, isUrlIgnored, otperformance } from '@opentelemetry/core';\nimport {\n addSpanNetworkEvents,\n getResource,\n PerformanceTimingNames as PTN,\n shouldPropagateTraceHeaders,\n parseUrl,\n} from '@opentelemetry/sdk-trace-web';\nimport {\n ATTR_ERROR_TYPE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_REQUEST_METHOD_ORIGINAL,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_URL_FULL,\n} from '@opentelemetry/semantic-conventions';\nimport {\n ATTR_HTTP_HOST,\n ATTR_HTTP_METHOD,\n ATTR_HTTP_SCHEME,\n ATTR_HTTP_STATUS_CODE,\n ATTR_HTTP_URL,\n ATTR_HTTP_USER_AGENT,\n ATTR_HTTP_REQUEST_BODY_SIZE,\n ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED,\n} from './semconv';\nimport { EventNames } from './enums/EventNames';\nimport type {\n OpenFunction,\n PropagateTraceHeaderCorsUrls,\n SendFunction,\n XhrMem,\n} from './types';\nimport {\n normalizeHttpRequestMethod,\n serverPortFromUrl,\n getXHRBodyLength,\n} from './utils';\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 /** Ignore adding network events as span events */\n ignoreNetworkEvents?: boolean;\n /** Measure outgoing request size */\n measureRequestSize?: boolean;\n /** Select the HTTP semantic conventions version(s) used. */\n semconvStabilityOptIn?: string;\n}\n\n/**\n * This class represents a XMLHttpRequest plugin for auto instrumentation\n */\nexport class XMLHttpRequestInstrumentation extends InstrumentationBase<XMLHttpRequestInstrumentationConfig> {\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 private _semconvStability: SemconvStability;\n\n // Note: Intentionally *not* using `_enabled` as the field name to avoid\n // any possible confusion with the `_enabled` field used on the *Node.js*\n // InstrumentationBase class.\n // Also not initializing the fields to `false` because the base class\n // constructor already calls `enable` modifying their values and it will\n // set the instrumentations in a bad state (enabled, patched but with flags set to false)\n declare private _isEnabled: boolean;\n declare private _isXhrPatched: boolean;\n\n constructor(config: XMLHttpRequestInstrumentationConfig = {}) {\n super('@opentelemetry/instrumentation-xml-http-request', VERSION, config);\n this._semconvStability = semconvStabilityFromStr(\n 'http',\n config?.semconvStabilityOptIn\n );\n }\n\n init() {}\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 const skipOldSemconvContentLengthAttrs = !(\n this._semconvStability & SemconvStability.OLD\n );\n addSpanNetworkEvents(\n childSpan,\n corsPreFlightRequest,\n this.getConfig().ignoreNetworkEvents,\n undefined,\n skipOldSemconvContentLengthAttrs\n );\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 (this._semconvStability & SemconvStability.OLD) {\n if (xhrMem.status !== undefined) {\n span.setAttribute(ATTR_HTTP_STATUS_CODE, xhrMem.status);\n }\n if (xhrMem.statusText !== undefined) {\n span.setAttribute(AttributeNames.HTTP_STATUS_TEXT, xhrMem.statusText);\n }\n if (typeof spanUrl === 'string') {\n const parsedUrl = parseUrl(spanUrl);\n span.setAttribute(ATTR_HTTP_HOST, parsedUrl.host);\n span.setAttribute(\n ATTR_HTTP_SCHEME,\n parsedUrl.protocol.replace(':', '')\n );\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(ATTR_HTTP_USER_AGENT, navigator.userAgent);\n }\n if (this._semconvStability & SemconvStability.STABLE) {\n if (xhrMem.status) {\n // Intentionally exclude status=0, because XHR uses 0 for before a\n // response is received and semconv says to only add the attribute if\n // received a response.\n span.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, xhrMem.status);\n }\n }\n }\n\n private _applyAttributesAfterXHR(span: api.Span, xhr: XMLHttpRequest) {\n const applyCustomAttributesOnSpan =\n this.getConfig().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 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 const skipOldSemconvContentLengthAttrs = !(\n this._semconvStability & SemconvStability.OLD\n );\n addSpanNetworkEvents(\n span,\n mainRequest,\n this.getConfig().ignoreNetworkEvents,\n undefined,\n skipOldSemconvContentLengthAttrs\n );\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 const parsedUrl = parseUrl(url);\n if (isUrlIgnored(parsedUrl.href, this.getConfig().ignoreUrls)) {\n this._diag.debug('ignoring span as url matches ignored url');\n return;\n }\n let name = '';\n const attributes = {} as api.Attributes;\n if (this._semconvStability & SemconvStability.OLD) {\n name = method.toUpperCase();\n attributes[ATTR_HTTP_METHOD] = method;\n attributes[ATTR_HTTP_URL] = parsedUrl.toString();\n }\n if (this._semconvStability & SemconvStability.STABLE) {\n const origMethod = method;\n const normMethod = normalizeHttpRequestMethod(method);\n if (!name) {\n // The \"old\" span name wins if emitting both old and stable semconv\n // ('http/dup').\n name = normMethod;\n }\n attributes[ATTR_HTTP_REQUEST_METHOD] = normMethod;\n if (normMethod !== origMethod) {\n attributes[ATTR_HTTP_REQUEST_METHOD_ORIGINAL] = origMethod;\n }\n attributes[ATTR_URL_FULL] = parsedUrl.toString();\n attributes[ATTR_SERVER_ADDRESS] = parsedUrl.hostname;\n const serverPort = serverPortFromUrl(parsedUrl);\n if (serverPort) {\n attributes[ATTR_SERVER_PORT] = serverPort;\n }\n }\n\n const currentSpan = this.tracer.startSpan(name, {\n kind: api.SpanKind.CLIENT,\n attributes,\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 if (!plugin._isEnabled) {\n return original.apply(this, args);\n }\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 performanceEndTime: api.HrTime,\n endTime: number\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 performanceEndTime\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(\n eventName: string,\n xhr: XMLHttpRequest,\n isError: boolean,\n errorType?: string\n ) {\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 const span = xhrMem.span;\n plugin._applyAttributesAfterXHR(span, xhr);\n\n if (plugin._semconvStability & SemconvStability.STABLE) {\n if (isError) {\n if (errorType) {\n span.setStatus({\n code: api.SpanStatusCode.ERROR,\n message: errorType,\n });\n span.setAttribute(ATTR_ERROR_TYPE, errorType);\n }\n } else if (xhrMem.status && xhrMem.status >= 400) {\n span.setStatus({ code: api.SpanStatusCode.ERROR });\n span.setAttribute(ATTR_ERROR_TYPE, String(xhrMem.status));\n }\n }\n }\n\n const performanceEndTime = hrTime();\n const endTime = Date.now();\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, performanceEndTime, endTime);\n }, OBSERVER_WAIT_TIME_MS);\n }\n\n function onError(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_ERROR, this, true, 'error');\n }\n\n function onAbort(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_ABORT, this, false);\n }\n\n function onTimeout(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_TIMEOUT, this, true, 'timeout');\n }\n\n function onLoad(this: XMLHttpRequest) {\n if (this.status < 299) {\n endSpan(EventNames.EVENT_LOAD, this, false);\n } else {\n endSpan(EventNames.EVENT_ERROR, this, false);\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 if (!plugin._isEnabled) {\n return original.apply(this, args);\n }\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 if (plugin.getConfig().measureRequestSize && args?.[0]) {\n const body = args[0];\n const bodyLength = getXHRBodyLength(body);\n if (bodyLength !== undefined) {\n if (plugin._semconvStability & SemconvStability.OLD) {\n currentSpan.setAttribute(\n ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED,\n bodyLength\n );\n }\n if (plugin._semconvStability & SemconvStability.STABLE) {\n currentSpan.setAttribute(\n ATTR_HTTP_REQUEST_BODY_SIZE,\n bodyLength\n );\n }\n }\n }\n\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 if (this._isEnabled) {\n return;\n }\n if (this._isXhrPatched) {\n this._diag.debug(\n 'reactivating existing patch on',\n this.moduleName,\n this.version\n );\n this._isEnabled = true;\n return;\n }\n\n try {\n this._diag.debug('applying patch to', this.moduleName, this.version);\n this._wrap(XMLHttpRequest.prototype, 'open', this._patchOpen());\n this._wrap(XMLHttpRequest.prototype, 'send', this._patchSend());\n this._isXhrPatched = true;\n this._isEnabled = true;\n } catch (err) {\n // make sure there is no wrapped functions\n this._unwrap(XMLHttpRequest.prototype, 'open');\n this._unwrap(XMLHttpRequest.prototype, 'send');\n this._diag.warn(\n 'Failed to patch globalThis.XMLHttpRequest; instrumentation will not be enabled. ' +\n 'Another script may have locked globalThis.XMLHttpRequest via Object.defineProperty.',\n err\n );\n }\n }\n\n /**\n * implements disable function\n */\n override disable() {\n if (!this._isEnabled) {\n return;\n }\n this._isEnabled = false;\n this._tasksCount = 0;\n this._xhrMem = new WeakMap<XMLHttpRequest, XhrMem>();\n this._usedResources = new WeakSet<PerformanceResourceTiming>();\n }\n}\n"]}
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.215.0";
1
+ export declare const VERSION = "0.217.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -3,5 +3,5 @@
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
5
  // this is autogenerated file, see scripts/version-update.js
6
- export const VERSION = '0.215.0';
6
+ export const VERSION = '0.217.0';
7
7
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,4DAA4D;AAC5D,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '0.215.0';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,4DAA4D;AAC5D,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '0.217.0';\n"]}
@@ -43,6 +43,8 @@ export declare class XMLHttpRequestInstrumentation extends InstrumentationBase<X
43
43
  private _xhrMem;
44
44
  private _usedResources;
45
45
  private _semconvStability;
46
+ private _isEnabled;
47
+ private _isXhrPatched;
46
48
  constructor(config?: XMLHttpRequestInstrumentationConfig);
47
49
  init(): void;
48
50
  /**
@@ -3,7 +3,7 @@
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
5
  import * as api from '@opentelemetry/api';
6
- import { SemconvStability, semconvStabilityFromStr, isWrapped, InstrumentationBase, safeExecuteInTheMiddle, } from '@opentelemetry/instrumentation';
6
+ import { SemconvStability, semconvStabilityFromStr, InstrumentationBase, safeExecuteInTheMiddle, } from '@opentelemetry/instrumentation';
7
7
  import { hrTime, isUrlIgnored, otperformance } from '@opentelemetry/core';
8
8
  import { addSpanNetworkEvents, getResource, PerformanceTimingNames as PTN, shouldPropagateTraceHeaders, parseUrl, } from '@opentelemetry/sdk-trace-web';
9
9
  import { ATTR_ERROR_TYPE, ATTR_HTTP_REQUEST_METHOD, ATTR_HTTP_REQUEST_METHOD_ORIGINAL, ATTR_HTTP_RESPONSE_STATUS_CODE, ATTR_SERVER_ADDRESS, ATTR_SERVER_PORT, ATTR_URL_FULL, } from '@opentelemetry/semantic-conventions';
@@ -214,12 +214,12 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
214
214
  * @private
215
215
  */
216
216
  _createSpan(xhr, url, method) {
217
- if (isUrlIgnored(url, this.getConfig().ignoreUrls)) {
217
+ const parsedUrl = parseUrl(url);
218
+ if (isUrlIgnored(parsedUrl.href, this.getConfig().ignoreUrls)) {
218
219
  this._diag.debug('ignoring span as url matches ignored url');
219
220
  return;
220
221
  }
221
222
  let name = '';
222
- const parsedUrl = parseUrl(url);
223
223
  const attributes = {};
224
224
  if (this._semconvStability & SemconvStability.OLD) {
225
225
  name = method.toUpperCase();
@@ -275,6 +275,9 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
275
275
  return (original) => {
276
276
  const plugin = this;
277
277
  return function patchOpen(...args) {
278
+ if (!plugin._isEnabled) {
279
+ return original.apply(this, args);
280
+ }
278
281
  const method = args[0];
279
282
  const url = args[1];
280
283
  plugin._createSpan(this, url, method);
@@ -368,6 +371,9 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
368
371
  }
369
372
  return (original) => {
370
373
  return function patchSend(...args) {
374
+ if (!plugin._isEnabled) {
375
+ return original.apply(this, args);
376
+ }
371
377
  const xhrMem = plugin._xhrMem.get(this);
372
378
  if (!xhrMem) {
373
379
  return original.apply(this, args);
@@ -413,25 +419,37 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
413
419
  * implements enable function
414
420
  */
415
421
  enable() {
416
- this._diag.debug('applying patch to', this.moduleName, this.version);
417
- if (isWrapped(XMLHttpRequest.prototype.open)) {
418
- this._unwrap(XMLHttpRequest.prototype, 'open');
419
- this._diag.debug('removing previous patch from method open');
422
+ if (this._isEnabled) {
423
+ return;
424
+ }
425
+ if (this._isXhrPatched) {
426
+ this._diag.debug('reactivating existing patch on', this.moduleName, this.version);
427
+ this._isEnabled = true;
428
+ return;
429
+ }
430
+ try {
431
+ this._diag.debug('applying patch to', this.moduleName, this.version);
432
+ this._wrap(XMLHttpRequest.prototype, 'open', this._patchOpen());
433
+ this._wrap(XMLHttpRequest.prototype, 'send', this._patchSend());
434
+ this._isXhrPatched = true;
435
+ this._isEnabled = true;
420
436
  }
421
- if (isWrapped(XMLHttpRequest.prototype.send)) {
437
+ catch (err) {
438
+ // make sure there is no wrapped functions
439
+ this._unwrap(XMLHttpRequest.prototype, 'open');
422
440
  this._unwrap(XMLHttpRequest.prototype, 'send');
423
- this._diag.debug('removing previous patch from method send');
441
+ this._diag.warn('Failed to patch globalThis.XMLHttpRequest; instrumentation will not be enabled. ' +
442
+ 'Another script may have locked globalThis.XMLHttpRequest via Object.defineProperty.', err);
424
443
  }
425
- this._wrap(XMLHttpRequest.prototype, 'open', this._patchOpen());
426
- this._wrap(XMLHttpRequest.prototype, 'send', this._patchSend());
427
444
  }
428
445
  /**
429
446
  * implements disable function
430
447
  */
431
448
  disable() {
432
- this._diag.debug('removing patch from', this.moduleName, this.version);
433
- this._unwrap(XMLHttpRequest.prototype, 'open');
434
- this._unwrap(XMLHttpRequest.prototype, 'send');
449
+ if (!this._isEnabled) {
450
+ return;
451
+ }
452
+ this._isEnabled = false;
435
453
  this._tasksCount = 0;
436
454
  this._xhrMem = new WeakMap();
437
455
  this._usedResources = new WeakSet();
@@ -1 +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 * SPDX-License-Identifier: Apache-2.0\n */\n\nimport * as api from '@opentelemetry/api';\nimport type { InstrumentationConfig } from '@opentelemetry/instrumentation';\nimport {\n SemconvStability,\n semconvStabilityFromStr,\n isWrapped,\n InstrumentationBase,\n safeExecuteInTheMiddle,\n} from '@opentelemetry/instrumentation';\nimport { hrTime, isUrlIgnored, otperformance } from '@opentelemetry/core';\nimport {\n addSpanNetworkEvents,\n getResource,\n PerformanceTimingNames as PTN,\n shouldPropagateTraceHeaders,\n parseUrl,\n} from '@opentelemetry/sdk-trace-web';\nimport {\n ATTR_ERROR_TYPE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_REQUEST_METHOD_ORIGINAL,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_URL_FULL,\n} from '@opentelemetry/semantic-conventions';\nimport {\n ATTR_HTTP_HOST,\n ATTR_HTTP_METHOD,\n ATTR_HTTP_SCHEME,\n ATTR_HTTP_STATUS_CODE,\n ATTR_HTTP_URL,\n ATTR_HTTP_USER_AGENT,\n ATTR_HTTP_REQUEST_BODY_SIZE,\n ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED,\n} from './semconv';\nimport { EventNames } from './enums/EventNames';\nimport type {\n OpenFunction,\n PropagateTraceHeaderCorsUrls,\n SendFunction,\n XhrMem,\n} from './types';\nimport {\n normalizeHttpRequestMethod,\n serverPortFromUrl,\n getXHRBodyLength,\n} from './utils';\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 /** Ignore adding network events as span events */\n ignoreNetworkEvents?: boolean;\n /** Measure outgoing request size */\n measureRequestSize?: boolean;\n /** Select the HTTP semantic conventions version(s) used. */\n semconvStabilityOptIn?: string;\n}\n\n/**\n * This class represents a XMLHttpRequest plugin for auto instrumentation\n */\nexport class XMLHttpRequestInstrumentation extends InstrumentationBase<XMLHttpRequestInstrumentationConfig> {\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 private _semconvStability: SemconvStability;\n\n constructor(config: XMLHttpRequestInstrumentationConfig = {}) {\n super('@opentelemetry/instrumentation-xml-http-request', VERSION, config);\n this._semconvStability = semconvStabilityFromStr(\n 'http',\n config?.semconvStabilityOptIn\n );\n }\n\n init() {}\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 const skipOldSemconvContentLengthAttrs = !(\n this._semconvStability & SemconvStability.OLD\n );\n addSpanNetworkEvents(\n childSpan,\n corsPreFlightRequest,\n this.getConfig().ignoreNetworkEvents,\n undefined,\n skipOldSemconvContentLengthAttrs\n );\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 (this._semconvStability & SemconvStability.OLD) {\n if (xhrMem.status !== undefined) {\n span.setAttribute(ATTR_HTTP_STATUS_CODE, xhrMem.status);\n }\n if (xhrMem.statusText !== undefined) {\n span.setAttribute(AttributeNames.HTTP_STATUS_TEXT, xhrMem.statusText);\n }\n if (typeof spanUrl === 'string') {\n const parsedUrl = parseUrl(spanUrl);\n span.setAttribute(ATTR_HTTP_HOST, parsedUrl.host);\n span.setAttribute(\n ATTR_HTTP_SCHEME,\n parsedUrl.protocol.replace(':', '')\n );\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(ATTR_HTTP_USER_AGENT, navigator.userAgent);\n }\n if (this._semconvStability & SemconvStability.STABLE) {\n if (xhrMem.status) {\n // Intentionally exclude status=0, because XHR uses 0 for before a\n // response is received and semconv says to only add the attribute if\n // received a response.\n span.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, xhrMem.status);\n }\n }\n }\n\n private _applyAttributesAfterXHR(span: api.Span, xhr: XMLHttpRequest) {\n const applyCustomAttributesOnSpan =\n this.getConfig().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 const skipOldSemconvContentLengthAttrs = !(\n this._semconvStability & SemconvStability.OLD\n );\n addSpanNetworkEvents(\n span,\n mainRequest,\n this.getConfig().ignoreNetworkEvents,\n undefined,\n skipOldSemconvContentLengthAttrs\n );\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\n let name = '';\n const parsedUrl = parseUrl(url);\n const attributes = {} as api.Attributes;\n if (this._semconvStability & SemconvStability.OLD) {\n name = method.toUpperCase();\n attributes[ATTR_HTTP_METHOD] = method;\n attributes[ATTR_HTTP_URL] = parsedUrl.toString();\n }\n if (this._semconvStability & SemconvStability.STABLE) {\n const origMethod = method;\n const normMethod = normalizeHttpRequestMethod(method);\n if (!name) {\n // The \"old\" span name wins if emitting both old and stable semconv\n // ('http/dup').\n name = normMethod;\n }\n attributes[ATTR_HTTP_REQUEST_METHOD] = normMethod;\n if (normMethod !== origMethod) {\n attributes[ATTR_HTTP_REQUEST_METHOD_ORIGINAL] = origMethod;\n }\n attributes[ATTR_URL_FULL] = parsedUrl.toString();\n attributes[ATTR_SERVER_ADDRESS] = parsedUrl.hostname;\n const serverPort = serverPortFromUrl(parsedUrl);\n if (serverPort) {\n attributes[ATTR_SERVER_PORT] = serverPort;\n }\n }\n\n const currentSpan = this.tracer.startSpan(name, {\n kind: api.SpanKind.CLIENT,\n attributes,\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 performanceEndTime: api.HrTime,\n endTime: number\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 performanceEndTime\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(\n eventName: string,\n xhr: XMLHttpRequest,\n isError: boolean,\n errorType?: string\n ) {\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 const span = xhrMem.span;\n plugin._applyAttributesAfterXHR(span, xhr);\n\n if (plugin._semconvStability & SemconvStability.STABLE) {\n if (isError) {\n if (errorType) {\n span.setStatus({\n code: api.SpanStatusCode.ERROR,\n message: errorType,\n });\n span.setAttribute(ATTR_ERROR_TYPE, errorType);\n }\n } else if (xhrMem.status && xhrMem.status >= 400) {\n span.setStatus({ code: api.SpanStatusCode.ERROR });\n span.setAttribute(ATTR_ERROR_TYPE, String(xhrMem.status));\n }\n }\n }\n\n const performanceEndTime = hrTime();\n const endTime = Date.now();\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, performanceEndTime, endTime);\n }, OBSERVER_WAIT_TIME_MS);\n }\n\n function onError(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_ERROR, this, true, 'error');\n }\n\n function onAbort(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_ABORT, this, false);\n }\n\n function onTimeout(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_TIMEOUT, this, true, 'timeout');\n }\n\n function onLoad(this: XMLHttpRequest) {\n if (this.status < 299) {\n endSpan(EventNames.EVENT_LOAD, this, false);\n } else {\n endSpan(EventNames.EVENT_ERROR, this, false);\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 if (plugin.getConfig().measureRequestSize && args?.[0]) {\n const body = args[0];\n const bodyLength = getXHRBodyLength(body);\n if (bodyLength !== undefined) {\n if (plugin._semconvStability & SemconvStability.OLD) {\n currentSpan.setAttribute(\n ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED,\n bodyLength\n );\n }\n if (plugin._semconvStability & SemconvStability.STABLE) {\n currentSpan.setAttribute(\n ATTR_HTTP_REQUEST_BODY_SIZE,\n bodyLength\n );\n }\n }\n }\n\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"]}
1
+ {"version":3,"file":"xhr.js","sourceRoot":"","sources":["../../src/xhr.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport * as api from '@opentelemetry/api';\nimport type { InstrumentationConfig } from '@opentelemetry/instrumentation';\nimport {\n SemconvStability,\n semconvStabilityFromStr,\n InstrumentationBase,\n safeExecuteInTheMiddle,\n} from '@opentelemetry/instrumentation';\nimport { hrTime, isUrlIgnored, otperformance } from '@opentelemetry/core';\nimport {\n addSpanNetworkEvents,\n getResource,\n PerformanceTimingNames as PTN,\n shouldPropagateTraceHeaders,\n parseUrl,\n} from '@opentelemetry/sdk-trace-web';\nimport {\n ATTR_ERROR_TYPE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_REQUEST_METHOD_ORIGINAL,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_URL_FULL,\n} from '@opentelemetry/semantic-conventions';\nimport {\n ATTR_HTTP_HOST,\n ATTR_HTTP_METHOD,\n ATTR_HTTP_SCHEME,\n ATTR_HTTP_STATUS_CODE,\n ATTR_HTTP_URL,\n ATTR_HTTP_USER_AGENT,\n ATTR_HTTP_REQUEST_BODY_SIZE,\n ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED,\n} from './semconv';\nimport { EventNames } from './enums/EventNames';\nimport type {\n OpenFunction,\n PropagateTraceHeaderCorsUrls,\n SendFunction,\n XhrMem,\n} from './types';\nimport {\n normalizeHttpRequestMethod,\n serverPortFromUrl,\n getXHRBodyLength,\n} from './utils';\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 /** Ignore adding network events as span events */\n ignoreNetworkEvents?: boolean;\n /** Measure outgoing request size */\n measureRequestSize?: boolean;\n /** Select the HTTP semantic conventions version(s) used. */\n semconvStabilityOptIn?: string;\n}\n\n/**\n * This class represents a XMLHttpRequest plugin for auto instrumentation\n */\nexport class XMLHttpRequestInstrumentation extends InstrumentationBase<XMLHttpRequestInstrumentationConfig> {\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 private _semconvStability: SemconvStability;\n\n // Note: Intentionally *not* using `_enabled` as the field name to avoid\n // any possible confusion with the `_enabled` field used on the *Node.js*\n // InstrumentationBase class.\n // Also not initializing the fields to `false` because the base class\n // constructor already calls `enable` modifying their values and it will\n // set the instrumentations in a bad state (enabled, patched but with flags set to false)\n declare private _isEnabled: boolean;\n declare private _isXhrPatched: boolean;\n\n constructor(config: XMLHttpRequestInstrumentationConfig = {}) {\n super('@opentelemetry/instrumentation-xml-http-request', VERSION, config);\n this._semconvStability = semconvStabilityFromStr(\n 'http',\n config?.semconvStabilityOptIn\n );\n }\n\n init() {}\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 const skipOldSemconvContentLengthAttrs = !(\n this._semconvStability & SemconvStability.OLD\n );\n addSpanNetworkEvents(\n childSpan,\n corsPreFlightRequest,\n this.getConfig().ignoreNetworkEvents,\n undefined,\n skipOldSemconvContentLengthAttrs\n );\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 (this._semconvStability & SemconvStability.OLD) {\n if (xhrMem.status !== undefined) {\n span.setAttribute(ATTR_HTTP_STATUS_CODE, xhrMem.status);\n }\n if (xhrMem.statusText !== undefined) {\n span.setAttribute(AttributeNames.HTTP_STATUS_TEXT, xhrMem.statusText);\n }\n if (typeof spanUrl === 'string') {\n const parsedUrl = parseUrl(spanUrl);\n span.setAttribute(ATTR_HTTP_HOST, parsedUrl.host);\n span.setAttribute(\n ATTR_HTTP_SCHEME,\n parsedUrl.protocol.replace(':', '')\n );\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(ATTR_HTTP_USER_AGENT, navigator.userAgent);\n }\n if (this._semconvStability & SemconvStability.STABLE) {\n if (xhrMem.status) {\n // Intentionally exclude status=0, because XHR uses 0 for before a\n // response is received and semconv says to only add the attribute if\n // received a response.\n span.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, xhrMem.status);\n }\n }\n }\n\n private _applyAttributesAfterXHR(span: api.Span, xhr: XMLHttpRequest) {\n const applyCustomAttributesOnSpan =\n this.getConfig().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 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 const skipOldSemconvContentLengthAttrs = !(\n this._semconvStability & SemconvStability.OLD\n );\n addSpanNetworkEvents(\n span,\n mainRequest,\n this.getConfig().ignoreNetworkEvents,\n undefined,\n skipOldSemconvContentLengthAttrs\n );\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 const parsedUrl = parseUrl(url);\n if (isUrlIgnored(parsedUrl.href, this.getConfig().ignoreUrls)) {\n this._diag.debug('ignoring span as url matches ignored url');\n return;\n }\n let name = '';\n const attributes = {} as api.Attributes;\n if (this._semconvStability & SemconvStability.OLD) {\n name = method.toUpperCase();\n attributes[ATTR_HTTP_METHOD] = method;\n attributes[ATTR_HTTP_URL] = parsedUrl.toString();\n }\n if (this._semconvStability & SemconvStability.STABLE) {\n const origMethod = method;\n const normMethod = normalizeHttpRequestMethod(method);\n if (!name) {\n // The \"old\" span name wins if emitting both old and stable semconv\n // ('http/dup').\n name = normMethod;\n }\n attributes[ATTR_HTTP_REQUEST_METHOD] = normMethod;\n if (normMethod !== origMethod) {\n attributes[ATTR_HTTP_REQUEST_METHOD_ORIGINAL] = origMethod;\n }\n attributes[ATTR_URL_FULL] = parsedUrl.toString();\n attributes[ATTR_SERVER_ADDRESS] = parsedUrl.hostname;\n const serverPort = serverPortFromUrl(parsedUrl);\n if (serverPort) {\n attributes[ATTR_SERVER_PORT] = serverPort;\n }\n }\n\n const currentSpan = this.tracer.startSpan(name, {\n kind: api.SpanKind.CLIENT,\n attributes,\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 if (!plugin._isEnabled) {\n return original.apply(this, args);\n }\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 performanceEndTime: api.HrTime,\n endTime: number\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 performanceEndTime\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(\n eventName: string,\n xhr: XMLHttpRequest,\n isError: boolean,\n errorType?: string\n ) {\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 const span = xhrMem.span;\n plugin._applyAttributesAfterXHR(span, xhr);\n\n if (plugin._semconvStability & SemconvStability.STABLE) {\n if (isError) {\n if (errorType) {\n span.setStatus({\n code: api.SpanStatusCode.ERROR,\n message: errorType,\n });\n span.setAttribute(ATTR_ERROR_TYPE, errorType);\n }\n } else if (xhrMem.status && xhrMem.status >= 400) {\n span.setStatus({ code: api.SpanStatusCode.ERROR });\n span.setAttribute(ATTR_ERROR_TYPE, String(xhrMem.status));\n }\n }\n }\n\n const performanceEndTime = hrTime();\n const endTime = Date.now();\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, performanceEndTime, endTime);\n }, OBSERVER_WAIT_TIME_MS);\n }\n\n function onError(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_ERROR, this, true, 'error');\n }\n\n function onAbort(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_ABORT, this, false);\n }\n\n function onTimeout(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_TIMEOUT, this, true, 'timeout');\n }\n\n function onLoad(this: XMLHttpRequest) {\n if (this.status < 299) {\n endSpan(EventNames.EVENT_LOAD, this, false);\n } else {\n endSpan(EventNames.EVENT_ERROR, this, false);\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 if (!plugin._isEnabled) {\n return original.apply(this, args);\n }\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 if (plugin.getConfig().measureRequestSize && args?.[0]) {\n const body = args[0];\n const bodyLength = getXHRBodyLength(body);\n if (bodyLength !== undefined) {\n if (plugin._semconvStability & SemconvStability.OLD) {\n currentSpan.setAttribute(\n ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED,\n bodyLength\n );\n }\n if (plugin._semconvStability & SemconvStability.STABLE) {\n currentSpan.setAttribute(\n ATTR_HTTP_REQUEST_BODY_SIZE,\n bodyLength\n );\n }\n }\n }\n\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 if (this._isEnabled) {\n return;\n }\n if (this._isXhrPatched) {\n this._diag.debug(\n 'reactivating existing patch on',\n this.moduleName,\n this.version\n );\n this._isEnabled = true;\n return;\n }\n\n try {\n this._diag.debug('applying patch to', this.moduleName, this.version);\n this._wrap(XMLHttpRequest.prototype, 'open', this._patchOpen());\n this._wrap(XMLHttpRequest.prototype, 'send', this._patchSend());\n this._isXhrPatched = true;\n this._isEnabled = true;\n } catch (err) {\n // make sure there is no wrapped functions\n this._unwrap(XMLHttpRequest.prototype, 'open');\n this._unwrap(XMLHttpRequest.prototype, 'send');\n this._diag.warn(\n 'Failed to patch globalThis.XMLHttpRequest; instrumentation will not be enabled. ' +\n 'Another script may have locked globalThis.XMLHttpRequest via Object.defineProperty.',\n err\n );\n }\n }\n\n /**\n * implements disable function\n */\n override disable() {\n if (!this._isEnabled) {\n return;\n }\n this._isEnabled = false;\n this._tasksCount = 0;\n this._xhrMem = new WeakMap<XMLHttpRequest, XhrMem>();\n this._usedResources = new WeakSet<PerformanceResourceTiming>();\n }\n}\n"]}
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.215.0";
1
+ export declare const VERSION = "0.217.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -6,5 +6,5 @@
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.VERSION = void 0;
8
8
  // this is autogenerated file, see scripts/version-update.js
9
- exports.VERSION = '0.215.0';
9
+ exports.VERSION = '0.217.0';
10
10
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,4DAA4D;AAC/C,QAAA,OAAO,GAAG,SAAS,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '0.215.0';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,4DAA4D;AAC/C,QAAA,OAAO,GAAG,SAAS,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '0.217.0';\n"]}
@@ -43,6 +43,8 @@ export declare class XMLHttpRequestInstrumentation extends InstrumentationBase<X
43
43
  private _xhrMem;
44
44
  private _usedResources;
45
45
  private _semconvStability;
46
+ private _isEnabled;
47
+ private _isXhrPatched;
46
48
  constructor(config?: XMLHttpRequestInstrumentationConfig);
47
49
  init(): void;
48
50
  /**
package/build/src/xhr.js CHANGED
@@ -217,12 +217,12 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
217
217
  * @private
218
218
  */
219
219
  _createSpan(xhr, url, method) {
220
- if ((0, core_1.isUrlIgnored)(url, this.getConfig().ignoreUrls)) {
220
+ const parsedUrl = (0, sdk_trace_web_1.parseUrl)(url);
221
+ if ((0, core_1.isUrlIgnored)(parsedUrl.href, this.getConfig().ignoreUrls)) {
221
222
  this._diag.debug('ignoring span as url matches ignored url');
222
223
  return;
223
224
  }
224
225
  let name = '';
225
- const parsedUrl = (0, sdk_trace_web_1.parseUrl)(url);
226
226
  const attributes = {};
227
227
  if (this._semconvStability & instrumentation_1.SemconvStability.OLD) {
228
228
  name = method.toUpperCase();
@@ -278,6 +278,9 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
278
278
  return (original) => {
279
279
  const plugin = this;
280
280
  return function patchOpen(...args) {
281
+ if (!plugin._isEnabled) {
282
+ return original.apply(this, args);
283
+ }
281
284
  const method = args[0];
282
285
  const url = args[1];
283
286
  plugin._createSpan(this, url, method);
@@ -371,6 +374,9 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
371
374
  }
372
375
  return (original) => {
373
376
  return function patchSend(...args) {
377
+ if (!plugin._isEnabled) {
378
+ return original.apply(this, args);
379
+ }
374
380
  const xhrMem = plugin._xhrMem.get(this);
375
381
  if (!xhrMem) {
376
382
  return original.apply(this, args);
@@ -416,25 +422,37 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
416
422
  * implements enable function
417
423
  */
418
424
  enable() {
419
- this._diag.debug('applying patch to', this.moduleName, this.version);
420
- if ((0, instrumentation_1.isWrapped)(XMLHttpRequest.prototype.open)) {
421
- this._unwrap(XMLHttpRequest.prototype, 'open');
422
- this._diag.debug('removing previous patch from method open');
425
+ if (this._isEnabled) {
426
+ return;
427
+ }
428
+ if (this._isXhrPatched) {
429
+ this._diag.debug('reactivating existing patch on', this.moduleName, this.version);
430
+ this._isEnabled = true;
431
+ return;
432
+ }
433
+ try {
434
+ this._diag.debug('applying patch to', this.moduleName, this.version);
435
+ this._wrap(XMLHttpRequest.prototype, 'open', this._patchOpen());
436
+ this._wrap(XMLHttpRequest.prototype, 'send', this._patchSend());
437
+ this._isXhrPatched = true;
438
+ this._isEnabled = true;
423
439
  }
424
- if ((0, instrumentation_1.isWrapped)(XMLHttpRequest.prototype.send)) {
440
+ catch (err) {
441
+ // make sure there is no wrapped functions
442
+ this._unwrap(XMLHttpRequest.prototype, 'open');
425
443
  this._unwrap(XMLHttpRequest.prototype, 'send');
426
- this._diag.debug('removing previous patch from method send');
444
+ this._diag.warn('Failed to patch globalThis.XMLHttpRequest; instrumentation will not be enabled. ' +
445
+ 'Another script may have locked globalThis.XMLHttpRequest via Object.defineProperty.', err);
427
446
  }
428
- this._wrap(XMLHttpRequest.prototype, 'open', this._patchOpen());
429
- this._wrap(XMLHttpRequest.prototype, 'send', this._patchSend());
430
447
  }
431
448
  /**
432
449
  * implements disable function
433
450
  */
434
451
  disable() {
435
- this._diag.debug('removing patch from', this.moduleName, this.version);
436
- this._unwrap(XMLHttpRequest.prototype, 'open');
437
- this._unwrap(XMLHttpRequest.prototype, 'send');
452
+ if (!this._isEnabled) {
453
+ return;
454
+ }
455
+ this._isEnabled = false;
438
456
  this._tasksCount = 0;
439
457
  this._xhrMem = new WeakMap();
440
458
  this._usedResources = new WeakSet();
@@ -1 +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 * SPDX-License-Identifier: Apache-2.0\n */\n\nimport * as api from '@opentelemetry/api';\nimport type { InstrumentationConfig } from '@opentelemetry/instrumentation';\nimport {\n SemconvStability,\n semconvStabilityFromStr,\n isWrapped,\n InstrumentationBase,\n safeExecuteInTheMiddle,\n} from '@opentelemetry/instrumentation';\nimport { hrTime, isUrlIgnored, otperformance } from '@opentelemetry/core';\nimport {\n addSpanNetworkEvents,\n getResource,\n PerformanceTimingNames as PTN,\n shouldPropagateTraceHeaders,\n parseUrl,\n} from '@opentelemetry/sdk-trace-web';\nimport {\n ATTR_ERROR_TYPE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_REQUEST_METHOD_ORIGINAL,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_URL_FULL,\n} from '@opentelemetry/semantic-conventions';\nimport {\n ATTR_HTTP_HOST,\n ATTR_HTTP_METHOD,\n ATTR_HTTP_SCHEME,\n ATTR_HTTP_STATUS_CODE,\n ATTR_HTTP_URL,\n ATTR_HTTP_USER_AGENT,\n ATTR_HTTP_REQUEST_BODY_SIZE,\n ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED,\n} from './semconv';\nimport { EventNames } from './enums/EventNames';\nimport type {\n OpenFunction,\n PropagateTraceHeaderCorsUrls,\n SendFunction,\n XhrMem,\n} from './types';\nimport {\n normalizeHttpRequestMethod,\n serverPortFromUrl,\n getXHRBodyLength,\n} from './utils';\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 /** Ignore adding network events as span events */\n ignoreNetworkEvents?: boolean;\n /** Measure outgoing request size */\n measureRequestSize?: boolean;\n /** Select the HTTP semantic conventions version(s) used. */\n semconvStabilityOptIn?: string;\n}\n\n/**\n * This class represents a XMLHttpRequest plugin for auto instrumentation\n */\nexport class XMLHttpRequestInstrumentation extends InstrumentationBase<XMLHttpRequestInstrumentationConfig> {\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 private _semconvStability: SemconvStability;\n\n constructor(config: XMLHttpRequestInstrumentationConfig = {}) {\n super('@opentelemetry/instrumentation-xml-http-request', VERSION, config);\n this._semconvStability = semconvStabilityFromStr(\n 'http',\n config?.semconvStabilityOptIn\n );\n }\n\n init() {}\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 const skipOldSemconvContentLengthAttrs = !(\n this._semconvStability & SemconvStability.OLD\n );\n addSpanNetworkEvents(\n childSpan,\n corsPreFlightRequest,\n this.getConfig().ignoreNetworkEvents,\n undefined,\n skipOldSemconvContentLengthAttrs\n );\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 (this._semconvStability & SemconvStability.OLD) {\n if (xhrMem.status !== undefined) {\n span.setAttribute(ATTR_HTTP_STATUS_CODE, xhrMem.status);\n }\n if (xhrMem.statusText !== undefined) {\n span.setAttribute(AttributeNames.HTTP_STATUS_TEXT, xhrMem.statusText);\n }\n if (typeof spanUrl === 'string') {\n const parsedUrl = parseUrl(spanUrl);\n span.setAttribute(ATTR_HTTP_HOST, parsedUrl.host);\n span.setAttribute(\n ATTR_HTTP_SCHEME,\n parsedUrl.protocol.replace(':', '')\n );\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(ATTR_HTTP_USER_AGENT, navigator.userAgent);\n }\n if (this._semconvStability & SemconvStability.STABLE) {\n if (xhrMem.status) {\n // Intentionally exclude status=0, because XHR uses 0 for before a\n // response is received and semconv says to only add the attribute if\n // received a response.\n span.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, xhrMem.status);\n }\n }\n }\n\n private _applyAttributesAfterXHR(span: api.Span, xhr: XMLHttpRequest) {\n const applyCustomAttributesOnSpan =\n this.getConfig().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 const skipOldSemconvContentLengthAttrs = !(\n this._semconvStability & SemconvStability.OLD\n );\n addSpanNetworkEvents(\n span,\n mainRequest,\n this.getConfig().ignoreNetworkEvents,\n undefined,\n skipOldSemconvContentLengthAttrs\n );\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\n let name = '';\n const parsedUrl = parseUrl(url);\n const attributes = {} as api.Attributes;\n if (this._semconvStability & SemconvStability.OLD) {\n name = method.toUpperCase();\n attributes[ATTR_HTTP_METHOD] = method;\n attributes[ATTR_HTTP_URL] = parsedUrl.toString();\n }\n if (this._semconvStability & SemconvStability.STABLE) {\n const origMethod = method;\n const normMethod = normalizeHttpRequestMethod(method);\n if (!name) {\n // The \"old\" span name wins if emitting both old and stable semconv\n // ('http/dup').\n name = normMethod;\n }\n attributes[ATTR_HTTP_REQUEST_METHOD] = normMethod;\n if (normMethod !== origMethod) {\n attributes[ATTR_HTTP_REQUEST_METHOD_ORIGINAL] = origMethod;\n }\n attributes[ATTR_URL_FULL] = parsedUrl.toString();\n attributes[ATTR_SERVER_ADDRESS] = parsedUrl.hostname;\n const serverPort = serverPortFromUrl(parsedUrl);\n if (serverPort) {\n attributes[ATTR_SERVER_PORT] = serverPort;\n }\n }\n\n const currentSpan = this.tracer.startSpan(name, {\n kind: api.SpanKind.CLIENT,\n attributes,\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 performanceEndTime: api.HrTime,\n endTime: number\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 performanceEndTime\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(\n eventName: string,\n xhr: XMLHttpRequest,\n isError: boolean,\n errorType?: string\n ) {\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 const span = xhrMem.span;\n plugin._applyAttributesAfterXHR(span, xhr);\n\n if (plugin._semconvStability & SemconvStability.STABLE) {\n if (isError) {\n if (errorType) {\n span.setStatus({\n code: api.SpanStatusCode.ERROR,\n message: errorType,\n });\n span.setAttribute(ATTR_ERROR_TYPE, errorType);\n }\n } else if (xhrMem.status && xhrMem.status >= 400) {\n span.setStatus({ code: api.SpanStatusCode.ERROR });\n span.setAttribute(ATTR_ERROR_TYPE, String(xhrMem.status));\n }\n }\n }\n\n const performanceEndTime = hrTime();\n const endTime = Date.now();\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, performanceEndTime, endTime);\n }, OBSERVER_WAIT_TIME_MS);\n }\n\n function onError(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_ERROR, this, true, 'error');\n }\n\n function onAbort(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_ABORT, this, false);\n }\n\n function onTimeout(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_TIMEOUT, this, true, 'timeout');\n }\n\n function onLoad(this: XMLHttpRequest) {\n if (this.status < 299) {\n endSpan(EventNames.EVENT_LOAD, this, false);\n } else {\n endSpan(EventNames.EVENT_ERROR, this, false);\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 if (plugin.getConfig().measureRequestSize && args?.[0]) {\n const body = args[0];\n const bodyLength = getXHRBodyLength(body);\n if (bodyLength !== undefined) {\n if (plugin._semconvStability & SemconvStability.OLD) {\n currentSpan.setAttribute(\n ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED,\n bodyLength\n );\n }\n if (plugin._semconvStability & SemconvStability.STABLE) {\n currentSpan.setAttribute(\n ATTR_HTTP_REQUEST_BODY_SIZE,\n bodyLength\n );\n }\n }\n }\n\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"]}
1
+ {"version":3,"file":"xhr.js","sourceRoot":"","sources":["../../src/xhr.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport * as api from '@opentelemetry/api';\nimport type { InstrumentationConfig } from '@opentelemetry/instrumentation';\nimport {\n SemconvStability,\n semconvStabilityFromStr,\n InstrumentationBase,\n safeExecuteInTheMiddle,\n} from '@opentelemetry/instrumentation';\nimport { hrTime, isUrlIgnored, otperformance } from '@opentelemetry/core';\nimport {\n addSpanNetworkEvents,\n getResource,\n PerformanceTimingNames as PTN,\n shouldPropagateTraceHeaders,\n parseUrl,\n} from '@opentelemetry/sdk-trace-web';\nimport {\n ATTR_ERROR_TYPE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_REQUEST_METHOD_ORIGINAL,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_URL_FULL,\n} from '@opentelemetry/semantic-conventions';\nimport {\n ATTR_HTTP_HOST,\n ATTR_HTTP_METHOD,\n ATTR_HTTP_SCHEME,\n ATTR_HTTP_STATUS_CODE,\n ATTR_HTTP_URL,\n ATTR_HTTP_USER_AGENT,\n ATTR_HTTP_REQUEST_BODY_SIZE,\n ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED,\n} from './semconv';\nimport { EventNames } from './enums/EventNames';\nimport type {\n OpenFunction,\n PropagateTraceHeaderCorsUrls,\n SendFunction,\n XhrMem,\n} from './types';\nimport {\n normalizeHttpRequestMethod,\n serverPortFromUrl,\n getXHRBodyLength,\n} from './utils';\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 /** Ignore adding network events as span events */\n ignoreNetworkEvents?: boolean;\n /** Measure outgoing request size */\n measureRequestSize?: boolean;\n /** Select the HTTP semantic conventions version(s) used. */\n semconvStabilityOptIn?: string;\n}\n\n/**\n * This class represents a XMLHttpRequest plugin for auto instrumentation\n */\nexport class XMLHttpRequestInstrumentation extends InstrumentationBase<XMLHttpRequestInstrumentationConfig> {\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 private _semconvStability: SemconvStability;\n\n // Note: Intentionally *not* using `_enabled` as the field name to avoid\n // any possible confusion with the `_enabled` field used on the *Node.js*\n // InstrumentationBase class.\n // Also not initializing the fields to `false` because the base class\n // constructor already calls `enable` modifying their values and it will\n // set the instrumentations in a bad state (enabled, patched but with flags set to false)\n declare private _isEnabled: boolean;\n declare private _isXhrPatched: boolean;\n\n constructor(config: XMLHttpRequestInstrumentationConfig = {}) {\n super('@opentelemetry/instrumentation-xml-http-request', VERSION, config);\n this._semconvStability = semconvStabilityFromStr(\n 'http',\n config?.semconvStabilityOptIn\n );\n }\n\n init() {}\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 const skipOldSemconvContentLengthAttrs = !(\n this._semconvStability & SemconvStability.OLD\n );\n addSpanNetworkEvents(\n childSpan,\n corsPreFlightRequest,\n this.getConfig().ignoreNetworkEvents,\n undefined,\n skipOldSemconvContentLengthAttrs\n );\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 (this._semconvStability & SemconvStability.OLD) {\n if (xhrMem.status !== undefined) {\n span.setAttribute(ATTR_HTTP_STATUS_CODE, xhrMem.status);\n }\n if (xhrMem.statusText !== undefined) {\n span.setAttribute(AttributeNames.HTTP_STATUS_TEXT, xhrMem.statusText);\n }\n if (typeof spanUrl === 'string') {\n const parsedUrl = parseUrl(spanUrl);\n span.setAttribute(ATTR_HTTP_HOST, parsedUrl.host);\n span.setAttribute(\n ATTR_HTTP_SCHEME,\n parsedUrl.protocol.replace(':', '')\n );\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(ATTR_HTTP_USER_AGENT, navigator.userAgent);\n }\n if (this._semconvStability & SemconvStability.STABLE) {\n if (xhrMem.status) {\n // Intentionally exclude status=0, because XHR uses 0 for before a\n // response is received and semconv says to only add the attribute if\n // received a response.\n span.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, xhrMem.status);\n }\n }\n }\n\n private _applyAttributesAfterXHR(span: api.Span, xhr: XMLHttpRequest) {\n const applyCustomAttributesOnSpan =\n this.getConfig().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 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 const skipOldSemconvContentLengthAttrs = !(\n this._semconvStability & SemconvStability.OLD\n );\n addSpanNetworkEvents(\n span,\n mainRequest,\n this.getConfig().ignoreNetworkEvents,\n undefined,\n skipOldSemconvContentLengthAttrs\n );\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 const parsedUrl = parseUrl(url);\n if (isUrlIgnored(parsedUrl.href, this.getConfig().ignoreUrls)) {\n this._diag.debug('ignoring span as url matches ignored url');\n return;\n }\n let name = '';\n const attributes = {} as api.Attributes;\n if (this._semconvStability & SemconvStability.OLD) {\n name = method.toUpperCase();\n attributes[ATTR_HTTP_METHOD] = method;\n attributes[ATTR_HTTP_URL] = parsedUrl.toString();\n }\n if (this._semconvStability & SemconvStability.STABLE) {\n const origMethod = method;\n const normMethod = normalizeHttpRequestMethod(method);\n if (!name) {\n // The \"old\" span name wins if emitting both old and stable semconv\n // ('http/dup').\n name = normMethod;\n }\n attributes[ATTR_HTTP_REQUEST_METHOD] = normMethod;\n if (normMethod !== origMethod) {\n attributes[ATTR_HTTP_REQUEST_METHOD_ORIGINAL] = origMethod;\n }\n attributes[ATTR_URL_FULL] = parsedUrl.toString();\n attributes[ATTR_SERVER_ADDRESS] = parsedUrl.hostname;\n const serverPort = serverPortFromUrl(parsedUrl);\n if (serverPort) {\n attributes[ATTR_SERVER_PORT] = serverPort;\n }\n }\n\n const currentSpan = this.tracer.startSpan(name, {\n kind: api.SpanKind.CLIENT,\n attributes,\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 if (!plugin._isEnabled) {\n return original.apply(this, args);\n }\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 performanceEndTime: api.HrTime,\n endTime: number\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 performanceEndTime\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(\n eventName: string,\n xhr: XMLHttpRequest,\n isError: boolean,\n errorType?: string\n ) {\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 const span = xhrMem.span;\n plugin._applyAttributesAfterXHR(span, xhr);\n\n if (plugin._semconvStability & SemconvStability.STABLE) {\n if (isError) {\n if (errorType) {\n span.setStatus({\n code: api.SpanStatusCode.ERROR,\n message: errorType,\n });\n span.setAttribute(ATTR_ERROR_TYPE, errorType);\n }\n } else if (xhrMem.status && xhrMem.status >= 400) {\n span.setStatus({ code: api.SpanStatusCode.ERROR });\n span.setAttribute(ATTR_ERROR_TYPE, String(xhrMem.status));\n }\n }\n }\n\n const performanceEndTime = hrTime();\n const endTime = Date.now();\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, performanceEndTime, endTime);\n }, OBSERVER_WAIT_TIME_MS);\n }\n\n function onError(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_ERROR, this, true, 'error');\n }\n\n function onAbort(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_ABORT, this, false);\n }\n\n function onTimeout(this: XMLHttpRequest) {\n endSpan(EventNames.EVENT_TIMEOUT, this, true, 'timeout');\n }\n\n function onLoad(this: XMLHttpRequest) {\n if (this.status < 299) {\n endSpan(EventNames.EVENT_LOAD, this, false);\n } else {\n endSpan(EventNames.EVENT_ERROR, this, false);\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 if (!plugin._isEnabled) {\n return original.apply(this, args);\n }\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 if (plugin.getConfig().measureRequestSize && args?.[0]) {\n const body = args[0];\n const bodyLength = getXHRBodyLength(body);\n if (bodyLength !== undefined) {\n if (plugin._semconvStability & SemconvStability.OLD) {\n currentSpan.setAttribute(\n ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED,\n bodyLength\n );\n }\n if (plugin._semconvStability & SemconvStability.STABLE) {\n currentSpan.setAttribute(\n ATTR_HTTP_REQUEST_BODY_SIZE,\n bodyLength\n );\n }\n }\n }\n\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 if (this._isEnabled) {\n return;\n }\n if (this._isXhrPatched) {\n this._diag.debug(\n 'reactivating existing patch on',\n this.moduleName,\n this.version\n );\n this._isEnabled = true;\n return;\n }\n\n try {\n this._diag.debug('applying patch to', this.moduleName, this.version);\n this._wrap(XMLHttpRequest.prototype, 'open', this._patchOpen());\n this._wrap(XMLHttpRequest.prototype, 'send', this._patchSend());\n this._isXhrPatched = true;\n this._isEnabled = true;\n } catch (err) {\n // make sure there is no wrapped functions\n this._unwrap(XMLHttpRequest.prototype, 'open');\n this._unwrap(XMLHttpRequest.prototype, 'send');\n this._diag.warn(\n 'Failed to patch globalThis.XMLHttpRequest; instrumentation will not be enabled. ' +\n 'Another script may have locked globalThis.XMLHttpRequest via Object.defineProperty.',\n err\n );\n }\n }\n\n /**\n * implements disable function\n */\n override disable() {\n if (!this._isEnabled) {\n return;\n }\n this._isEnabled = false;\n this._tasksCount = 0;\n this._xhrMem = new WeakMap<XMLHttpRequest, XhrMem>();\n this._usedResources = new WeakSet<PerformanceResourceTiming>();\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opentelemetry/instrumentation-xml-http-request",
3
- "version": "0.215.0",
3
+ "version": "0.217.0",
4
4
  "description": "OpenTelemetry instrumentation for XMLHttpRequest http client in web browsers",
5
5
  "main": "build/src/index.js",
6
6
  "module": "build/esm/index.js",
@@ -56,9 +56,9 @@
56
56
  "@babel/core": "7.27.1",
57
57
  "@babel/preset-env": "7.27.2",
58
58
  "@opentelemetry/api": "1.9.1",
59
- "@opentelemetry/context-zone": "2.7.0",
60
- "@opentelemetry/propagator-b3": "2.7.0",
61
- "@opentelemetry/sdk-trace-base": "2.7.0",
59
+ "@opentelemetry/context-zone": "2.7.1",
60
+ "@opentelemetry/propagator-b3": "2.7.1",
61
+ "@opentelemetry/sdk-trace-base": "2.7.1",
62
62
  "@types/mocha": "10.0.10",
63
63
  "@types/node": "18.19.130",
64
64
  "@types/sinon": "17.0.4",
@@ -83,12 +83,12 @@
83
83
  "@opentelemetry/api": "^1.3.0"
84
84
  },
85
85
  "dependencies": {
86
- "@opentelemetry/core": "2.7.0",
87
- "@opentelemetry/instrumentation": "0.215.0",
88
- "@opentelemetry/sdk-trace-web": "2.7.0",
86
+ "@opentelemetry/core": "2.7.1",
87
+ "@opentelemetry/instrumentation": "0.217.0",
88
+ "@opentelemetry/sdk-trace-web": "2.7.1",
89
89
  "@opentelemetry/semantic-conventions": "^1.29.0"
90
90
  },
91
91
  "homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-xml-http-request",
92
92
  "sideEffects": false,
93
- "gitHead": "a0476eef3cb973bfcc0c2e41f868dd7b484c2ed8"
93
+ "gitHead": "74cde1b674508ccc0ed2601ac43a80ff2d35114c"
94
94
  }