@opentelemetry/instrumentation-xml-http-request 0.201.0 → 0.201.1
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.
- package/build/esm/version.d.ts +1 -1
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/build/esm/xhr.js +10 -10
- package/build/esm/xhr.js.map +1 -1
- package/build/esnext/version.d.ts +1 -1
- package/build/esnext/version.js +1 -1
- package/build/esnext/version.js.map +1 -1
- package/build/esnext/xhr.js +10 -10
- package/build/esnext/xhr.js.map +1 -1
- package/build/src/version.d.ts +1 -1
- package/build/src/version.js +1 -1
- package/build/src/version.js.map +1 -1
- package/build/src/xhr.js +9 -9
- package/build/src/xhr.js.map +1 -1
- package/package.json +3 -3
package/build/esm/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.201.
|
|
1
|
+
export declare const VERSION = "0.201.1";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/build/esm/version.js
CHANGED
package/build/esm/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,4DAA4D;AAC5D,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '0.201.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,4DAA4D;AAC5D,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '0.201.1';\n"]}
|
package/build/esm/xhr.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
import * as api from '@opentelemetry/api';
|
|
17
|
-
import { semconvStabilityFromStr, isWrapped, InstrumentationBase, safeExecuteInTheMiddle, } from '@opentelemetry/instrumentation';
|
|
17
|
+
import { SemconvStability, semconvStabilityFromStr, isWrapped, InstrumentationBase, safeExecuteInTheMiddle, } from '@opentelemetry/instrumentation';
|
|
18
18
|
import { hrTime, isUrlIgnored, otperformance } from '@opentelemetry/core';
|
|
19
19
|
import { addSpanNetworkEvents, getResource, PerformanceTimingNames as PTN, shouldPropagateTraceHeaders, parseUrl, } from '@opentelemetry/sdk-trace-web';
|
|
20
20
|
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';
|
|
@@ -77,7 +77,7 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
|
|
|
77
77
|
const childSpan = this.tracer.startSpan('CORS Preflight', {
|
|
78
78
|
startTime: corsPreFlightRequest[PTN.FETCH_START],
|
|
79
79
|
});
|
|
80
|
-
const skipOldSemconvContentLengthAttrs = !(this._semconvStability &
|
|
80
|
+
const skipOldSemconvContentLengthAttrs = !(this._semconvStability & SemconvStability.OLD);
|
|
81
81
|
addSpanNetworkEvents(childSpan, corsPreFlightRequest, this.getConfig().ignoreNetworkEvents, undefined, skipOldSemconvContentLengthAttrs);
|
|
82
82
|
childSpan.end(corsPreFlightRequest[PTN.RESPONSE_END]);
|
|
83
83
|
});
|
|
@@ -90,7 +90,7 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
|
|
|
90
90
|
* @private
|
|
91
91
|
*/
|
|
92
92
|
_addFinalSpanAttributes(span, xhrMem, spanUrl) {
|
|
93
|
-
if (this._semconvStability &
|
|
93
|
+
if (this._semconvStability & SemconvStability.OLD) {
|
|
94
94
|
if (xhrMem.status !== undefined) {
|
|
95
95
|
span.setAttribute(ATTR_HTTP_STATUS_CODE, xhrMem.status);
|
|
96
96
|
}
|
|
@@ -106,7 +106,7 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
|
|
|
106
106
|
// maybe when parent span is not available ?
|
|
107
107
|
span.setAttribute(ATTR_HTTP_USER_AGENT, navigator.userAgent);
|
|
108
108
|
}
|
|
109
|
-
if (this._semconvStability &
|
|
109
|
+
if (this._semconvStability & SemconvStability.STABLE) {
|
|
110
110
|
if (xhrMem.status) {
|
|
111
111
|
// Intentionally exclude status=0, because XHR uses 0 for before a
|
|
112
112
|
// response is received and semconv says to only add the attribute if
|
|
@@ -197,7 +197,7 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
|
|
|
197
197
|
this._addChildSpan(span, corsPreFlightRequest);
|
|
198
198
|
this._markResourceAsUsed(corsPreFlightRequest);
|
|
199
199
|
}
|
|
200
|
-
const skipOldSemconvContentLengthAttrs = !(this._semconvStability &
|
|
200
|
+
const skipOldSemconvContentLengthAttrs = !(this._semconvStability & SemconvStability.OLD);
|
|
201
201
|
addSpanNetworkEvents(span, mainRequest, this.getConfig().ignoreNetworkEvents, undefined, skipOldSemconvContentLengthAttrs);
|
|
202
202
|
}
|
|
203
203
|
}
|
|
@@ -232,12 +232,12 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
|
|
|
232
232
|
let name = '';
|
|
233
233
|
const parsedUrl = parseUrl(url);
|
|
234
234
|
const attributes = {};
|
|
235
|
-
if (this._semconvStability &
|
|
235
|
+
if (this._semconvStability & SemconvStability.OLD) {
|
|
236
236
|
name = method.toUpperCase();
|
|
237
237
|
attributes[ATTR_HTTP_METHOD] = method;
|
|
238
238
|
attributes[ATTR_HTTP_URL] = parsedUrl.toString();
|
|
239
239
|
}
|
|
240
|
-
if (this._semconvStability &
|
|
240
|
+
if (this._semconvStability & SemconvStability.STABLE) {
|
|
241
241
|
const origMethod = method;
|
|
242
242
|
const normMethod = normalizeHttpRequestMethod(method);
|
|
243
243
|
if (!name) {
|
|
@@ -325,7 +325,7 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
|
|
|
325
325
|
if (xhrMem.span) {
|
|
326
326
|
const span = xhrMem.span;
|
|
327
327
|
plugin._applyAttributesAfterXHR(span, xhr);
|
|
328
|
-
if (plugin._semconvStability &
|
|
328
|
+
if (plugin._semconvStability & SemconvStability.STABLE) {
|
|
329
329
|
if (isError) {
|
|
330
330
|
if (errorType) {
|
|
331
331
|
span.setStatus({
|
|
@@ -390,10 +390,10 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
|
|
|
390
390
|
const body = args[0];
|
|
391
391
|
const bodyLength = getXHRBodyLength(body);
|
|
392
392
|
if (bodyLength !== undefined) {
|
|
393
|
-
if (plugin._semconvStability &
|
|
393
|
+
if (plugin._semconvStability & SemconvStability.OLD) {
|
|
394
394
|
currentSpan.setAttribute(ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED, bodyLength);
|
|
395
395
|
}
|
|
396
|
-
if (plugin._semconvStability &
|
|
396
|
+
if (plugin._semconvStability & SemconvStability.STABLE) {
|
|
397
397
|
currentSpan.setAttribute(ATTR_HTTP_REQUEST_BODY_SIZE, bodyLength);
|
|
398
398
|
}
|
|
399
399
|
}
|
package/build/esm/xhr.js.map
CHANGED
|
@@ -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 *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as api from '@opentelemetry/api';\nimport {\n SemconvStability,\n semconvStabilityFromStr,\n isWrapped,\n InstrumentationBase,\n InstrumentationConfig,\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 {\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 *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as api from '@opentelemetry/api';\nimport {\n SemconvStability,\n semconvStabilityFromStr,\n isWrapped,\n InstrumentationBase,\n InstrumentationConfig,\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 {\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,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.201.
|
|
1
|
+
export declare const VERSION = "0.201.1";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/build/esnext/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,4DAA4D;AAC5D,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '0.201.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,4DAA4D;AAC5D,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '0.201.1';\n"]}
|
package/build/esnext/xhr.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
import * as api from '@opentelemetry/api';
|
|
17
|
-
import { semconvStabilityFromStr, isWrapped, InstrumentationBase, safeExecuteInTheMiddle, } from '@opentelemetry/instrumentation';
|
|
17
|
+
import { SemconvStability, semconvStabilityFromStr, isWrapped, InstrumentationBase, safeExecuteInTheMiddle, } from '@opentelemetry/instrumentation';
|
|
18
18
|
import { hrTime, isUrlIgnored, otperformance } from '@opentelemetry/core';
|
|
19
19
|
import { addSpanNetworkEvents, getResource, PerformanceTimingNames as PTN, shouldPropagateTraceHeaders, parseUrl, } from '@opentelemetry/sdk-trace-web';
|
|
20
20
|
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';
|
|
@@ -77,7 +77,7 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
|
|
|
77
77
|
const childSpan = this.tracer.startSpan('CORS Preflight', {
|
|
78
78
|
startTime: corsPreFlightRequest[PTN.FETCH_START],
|
|
79
79
|
});
|
|
80
|
-
const skipOldSemconvContentLengthAttrs = !(this._semconvStability &
|
|
80
|
+
const skipOldSemconvContentLengthAttrs = !(this._semconvStability & SemconvStability.OLD);
|
|
81
81
|
addSpanNetworkEvents(childSpan, corsPreFlightRequest, this.getConfig().ignoreNetworkEvents, undefined, skipOldSemconvContentLengthAttrs);
|
|
82
82
|
childSpan.end(corsPreFlightRequest[PTN.RESPONSE_END]);
|
|
83
83
|
});
|
|
@@ -90,7 +90,7 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
|
|
|
90
90
|
* @private
|
|
91
91
|
*/
|
|
92
92
|
_addFinalSpanAttributes(span, xhrMem, spanUrl) {
|
|
93
|
-
if (this._semconvStability &
|
|
93
|
+
if (this._semconvStability & SemconvStability.OLD) {
|
|
94
94
|
if (xhrMem.status !== undefined) {
|
|
95
95
|
span.setAttribute(ATTR_HTTP_STATUS_CODE, xhrMem.status);
|
|
96
96
|
}
|
|
@@ -106,7 +106,7 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
|
|
|
106
106
|
// maybe when parent span is not available ?
|
|
107
107
|
span.setAttribute(ATTR_HTTP_USER_AGENT, navigator.userAgent);
|
|
108
108
|
}
|
|
109
|
-
if (this._semconvStability &
|
|
109
|
+
if (this._semconvStability & SemconvStability.STABLE) {
|
|
110
110
|
if (xhrMem.status) {
|
|
111
111
|
// Intentionally exclude status=0, because XHR uses 0 for before a
|
|
112
112
|
// response is received and semconv says to only add the attribute if
|
|
@@ -197,7 +197,7 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
|
|
|
197
197
|
this._addChildSpan(span, corsPreFlightRequest);
|
|
198
198
|
this._markResourceAsUsed(corsPreFlightRequest);
|
|
199
199
|
}
|
|
200
|
-
const skipOldSemconvContentLengthAttrs = !(this._semconvStability &
|
|
200
|
+
const skipOldSemconvContentLengthAttrs = !(this._semconvStability & SemconvStability.OLD);
|
|
201
201
|
addSpanNetworkEvents(span, mainRequest, this.getConfig().ignoreNetworkEvents, undefined, skipOldSemconvContentLengthAttrs);
|
|
202
202
|
}
|
|
203
203
|
}
|
|
@@ -232,12 +232,12 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
|
|
|
232
232
|
let name = '';
|
|
233
233
|
const parsedUrl = parseUrl(url);
|
|
234
234
|
const attributes = {};
|
|
235
|
-
if (this._semconvStability &
|
|
235
|
+
if (this._semconvStability & SemconvStability.OLD) {
|
|
236
236
|
name = method.toUpperCase();
|
|
237
237
|
attributes[ATTR_HTTP_METHOD] = method;
|
|
238
238
|
attributes[ATTR_HTTP_URL] = parsedUrl.toString();
|
|
239
239
|
}
|
|
240
|
-
if (this._semconvStability &
|
|
240
|
+
if (this._semconvStability & SemconvStability.STABLE) {
|
|
241
241
|
const origMethod = method;
|
|
242
242
|
const normMethod = normalizeHttpRequestMethod(method);
|
|
243
243
|
if (!name) {
|
|
@@ -325,7 +325,7 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
|
|
|
325
325
|
if (xhrMem.span) {
|
|
326
326
|
const span = xhrMem.span;
|
|
327
327
|
plugin._applyAttributesAfterXHR(span, xhr);
|
|
328
|
-
if (plugin._semconvStability &
|
|
328
|
+
if (plugin._semconvStability & SemconvStability.STABLE) {
|
|
329
329
|
if (isError) {
|
|
330
330
|
if (errorType) {
|
|
331
331
|
span.setStatus({
|
|
@@ -390,10 +390,10 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase {
|
|
|
390
390
|
const body = args[0];
|
|
391
391
|
const bodyLength = getXHRBodyLength(body);
|
|
392
392
|
if (bodyLength !== undefined) {
|
|
393
|
-
if (plugin._semconvStability &
|
|
393
|
+
if (plugin._semconvStability & SemconvStability.OLD) {
|
|
394
394
|
currentSpan.setAttribute(ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED, bodyLength);
|
|
395
395
|
}
|
|
396
|
-
if (plugin._semconvStability &
|
|
396
|
+
if (plugin._semconvStability & SemconvStability.STABLE) {
|
|
397
397
|
currentSpan.setAttribute(ATTR_HTTP_REQUEST_BODY_SIZE, bodyLength);
|
|
398
398
|
}
|
|
399
399
|
}
|
package/build/esnext/xhr.js.map
CHANGED
|
@@ -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 *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as api from '@opentelemetry/api';\nimport {\n SemconvStability,\n semconvStabilityFromStr,\n isWrapped,\n InstrumentationBase,\n InstrumentationConfig,\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 {\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 *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as api from '@opentelemetry/api';\nimport {\n SemconvStability,\n semconvStabilityFromStr,\n isWrapped,\n InstrumentationBase,\n InstrumentationConfig,\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 {\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"]}
|
package/build/src/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.201.
|
|
1
|
+
export declare const VERSION = "0.201.1";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/build/src/version.js
CHANGED
package/build/src/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,4DAA4D;AAC/C,QAAA,OAAO,GAAG,SAAS,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '0.201.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,4DAA4D;AAC/C,QAAA,OAAO,GAAG,SAAS,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '0.201.1';\n"]}
|
package/build/src/xhr.js
CHANGED
|
@@ -80,7 +80,7 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
|
|
|
80
80
|
const childSpan = this.tracer.startSpan('CORS Preflight', {
|
|
81
81
|
startTime: corsPreFlightRequest[sdk_trace_web_1.PerformanceTimingNames.FETCH_START],
|
|
82
82
|
});
|
|
83
|
-
const skipOldSemconvContentLengthAttrs = !(this._semconvStability &
|
|
83
|
+
const skipOldSemconvContentLengthAttrs = !(this._semconvStability & instrumentation_1.SemconvStability.OLD);
|
|
84
84
|
(0, sdk_trace_web_1.addSpanNetworkEvents)(childSpan, corsPreFlightRequest, this.getConfig().ignoreNetworkEvents, undefined, skipOldSemconvContentLengthAttrs);
|
|
85
85
|
childSpan.end(corsPreFlightRequest[sdk_trace_web_1.PerformanceTimingNames.RESPONSE_END]);
|
|
86
86
|
});
|
|
@@ -93,7 +93,7 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
|
|
|
93
93
|
* @private
|
|
94
94
|
*/
|
|
95
95
|
_addFinalSpanAttributes(span, xhrMem, spanUrl) {
|
|
96
|
-
if (this._semconvStability &
|
|
96
|
+
if (this._semconvStability & instrumentation_1.SemconvStability.OLD) {
|
|
97
97
|
if (xhrMem.status !== undefined) {
|
|
98
98
|
span.setAttribute(semconv_1.ATTR_HTTP_STATUS_CODE, xhrMem.status);
|
|
99
99
|
}
|
|
@@ -109,7 +109,7 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
|
|
|
109
109
|
// maybe when parent span is not available ?
|
|
110
110
|
span.setAttribute(semconv_1.ATTR_HTTP_USER_AGENT, navigator.userAgent);
|
|
111
111
|
}
|
|
112
|
-
if (this._semconvStability &
|
|
112
|
+
if (this._semconvStability & instrumentation_1.SemconvStability.STABLE) {
|
|
113
113
|
if (xhrMem.status) {
|
|
114
114
|
// Intentionally exclude status=0, because XHR uses 0 for before a
|
|
115
115
|
// response is received and semconv says to only add the attribute if
|
|
@@ -200,7 +200,7 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
|
|
|
200
200
|
this._addChildSpan(span, corsPreFlightRequest);
|
|
201
201
|
this._markResourceAsUsed(corsPreFlightRequest);
|
|
202
202
|
}
|
|
203
|
-
const skipOldSemconvContentLengthAttrs = !(this._semconvStability &
|
|
203
|
+
const skipOldSemconvContentLengthAttrs = !(this._semconvStability & instrumentation_1.SemconvStability.OLD);
|
|
204
204
|
(0, sdk_trace_web_1.addSpanNetworkEvents)(span, mainRequest, this.getConfig().ignoreNetworkEvents, undefined, skipOldSemconvContentLengthAttrs);
|
|
205
205
|
}
|
|
206
206
|
}
|
|
@@ -235,12 +235,12 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
|
|
|
235
235
|
let name = '';
|
|
236
236
|
const parsedUrl = (0, sdk_trace_web_1.parseUrl)(url);
|
|
237
237
|
const attributes = {};
|
|
238
|
-
if (this._semconvStability &
|
|
238
|
+
if (this._semconvStability & instrumentation_1.SemconvStability.OLD) {
|
|
239
239
|
name = method.toUpperCase();
|
|
240
240
|
attributes[semconv_1.ATTR_HTTP_METHOD] = method;
|
|
241
241
|
attributes[semconv_1.ATTR_HTTP_URL] = parsedUrl.toString();
|
|
242
242
|
}
|
|
243
|
-
if (this._semconvStability &
|
|
243
|
+
if (this._semconvStability & instrumentation_1.SemconvStability.STABLE) {
|
|
244
244
|
const origMethod = method;
|
|
245
245
|
const normMethod = (0, utils_1.normalizeHttpRequestMethod)(method);
|
|
246
246
|
if (!name) {
|
|
@@ -328,7 +328,7 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
|
|
|
328
328
|
if (xhrMem.span) {
|
|
329
329
|
const span = xhrMem.span;
|
|
330
330
|
plugin._applyAttributesAfterXHR(span, xhr);
|
|
331
|
-
if (plugin._semconvStability &
|
|
331
|
+
if (plugin._semconvStability & instrumentation_1.SemconvStability.STABLE) {
|
|
332
332
|
if (isError) {
|
|
333
333
|
if (errorType) {
|
|
334
334
|
span.setStatus({
|
|
@@ -393,10 +393,10 @@ class XMLHttpRequestInstrumentation extends instrumentation_1.InstrumentationBas
|
|
|
393
393
|
const body = args[0];
|
|
394
394
|
const bodyLength = (0, utils_1.getXHRBodyLength)(body);
|
|
395
395
|
if (bodyLength !== undefined) {
|
|
396
|
-
if (plugin._semconvStability &
|
|
396
|
+
if (plugin._semconvStability & instrumentation_1.SemconvStability.OLD) {
|
|
397
397
|
currentSpan.setAttribute(semconv_1.ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED, bodyLength);
|
|
398
398
|
}
|
|
399
|
-
if (plugin._semconvStability &
|
|
399
|
+
if (plugin._semconvStability & instrumentation_1.SemconvStability.STABLE) {
|
|
400
400
|
currentSpan.setAttribute(semconv_1.ATTR_HTTP_REQUEST_BODY_SIZE, bodyLength);
|
|
401
401
|
}
|
|
402
402
|
}
|
package/build/src/xhr.js.map
CHANGED
|
@@ -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 *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as api from '@opentelemetry/api';\nimport {\n SemconvStability,\n semconvStabilityFromStr,\n isWrapped,\n InstrumentationBase,\n InstrumentationConfig,\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 {\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 *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as api from '@opentelemetry/api';\nimport {\n SemconvStability,\n semconvStabilityFromStr,\n isWrapped,\n InstrumentationBase,\n InstrumentationConfig,\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 {\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opentelemetry/instrumentation-xml-http-request",
|
|
3
|
-
"version": "0.201.
|
|
3
|
+
"version": "0.201.1",
|
|
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",
|
|
@@ -87,11 +87,11 @@
|
|
|
87
87
|
},
|
|
88
88
|
"dependencies": {
|
|
89
89
|
"@opentelemetry/core": "2.0.1",
|
|
90
|
-
"@opentelemetry/instrumentation": "0.201.
|
|
90
|
+
"@opentelemetry/instrumentation": "0.201.1",
|
|
91
91
|
"@opentelemetry/sdk-trace-web": "2.0.1",
|
|
92
92
|
"@opentelemetry/semantic-conventions": "^1.29.0"
|
|
93
93
|
},
|
|
94
94
|
"homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-xml-http-request",
|
|
95
95
|
"sideEffects": false,
|
|
96
|
-
"gitHead": "
|
|
96
|
+
"gitHead": "9dbd1e446be0ecc7c22b00051c5cfb2612d9b0f2"
|
|
97
97
|
}
|