@opentelemetry/instrumentation-fetch 0.213.0 → 0.215.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,8 @@
1
1
  import type { Span } from '@opentelemetry/api';
2
- import { InstrumentationBase, InstrumentationConfig } from '@opentelemetry/instrumentation';
2
+ import type { InstrumentationConfig } from '@opentelemetry/instrumentation';
3
+ import { InstrumentationBase } from '@opentelemetry/instrumentation';
3
4
  import * as web from '@opentelemetry/sdk-trace-web';
4
- import { FetchError } from './types';
5
+ import type { FetchError } from './types';
5
6
  export interface FetchCustomAttributeFunction {
6
7
  (span: Span, request: Request | RequestInit, result: Response | FetchError): void;
7
8
  }
@@ -40,6 +41,8 @@ export declare class FetchInstrumentation extends InstrumentationBase<FetchInstr
40
41
  private _usedResources;
41
42
  private _tasksCount;
42
43
  private _semconvStability;
44
+ private _isEnabled;
45
+ private _isFetchPatched;
43
46
  constructor(config?: FetchInstrumentationConfig);
44
47
  init(): void;
45
48
  /**
@@ -111,7 +114,7 @@ export declare class FetchInstrumentation extends InstrumentationBase<FetchInstr
111
114
  */
112
115
  enable(): void;
113
116
  /**
114
- * implements unpatch function
117
+ * deactivates fetch instrumentation
115
118
  */
116
119
  disable(): void;
117
120
  }
@@ -3,7 +3,7 @@
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
5
  import { context, propagation, SpanKind, SpanStatusCode, trace, } from '@opentelemetry/api';
6
- import { SemconvStability, semconvStabilityFromStr, isWrapped, InstrumentationBase, safeExecuteInTheMiddle, } from '@opentelemetry/instrumentation';
6
+ import { SemconvStability, semconvStabilityFromStr, InstrumentationBase, safeExecuteInTheMiddle, } from '@opentelemetry/instrumentation';
7
7
  import * as core from '@opentelemetry/core';
8
8
  import * as web from '@opentelemetry/sdk-trace-web';
9
9
  import { AttributeNames } from './enums/AttributeNames';
@@ -226,28 +226,25 @@ export class FetchInstrumentation extends InstrumentationBase {
226
226
  _patchConstructor() {
227
227
  return original => {
228
228
  const plugin = this;
229
- const readOnlyProps = new Set(['url', 'type', 'redirected']);
230
- function createResponseProxy(target, originalResponse) {
231
- return new Proxy(target, {
232
- get(t, prop, _receiver) {
233
- if (typeof prop === 'string' && readOnlyProps.has(prop)) {
234
- return Reflect.get(originalResponse, prop);
235
- }
236
- if (prop === 'clone') {
237
- return function clone() {
238
- return createResponseProxy(t.clone(), originalResponse);
239
- };
240
- }
241
- // Use target as receiver so getters (e.g. headers) run with correct this and avoid "Illegal invocation"
242
- const value = Reflect.get(t, prop, t);
243
- return typeof value === 'function' ? value.bind(t) : value;
244
- },
245
- });
246
- }
247
229
  return function patchConstructor(...args) {
230
+ if (!plugin._isEnabled) {
231
+ return original.apply(this, args);
232
+ }
248
233
  const self = this;
249
234
  const url = web.parseUrl(args[0] instanceof Request ? args[0].url : String(args[0])).href;
250
- const options = args[0] instanceof Request ? args[0] : args[1] || {};
235
+ // Per the Fetch spec, when fetch() is called with a Request object
236
+ // and a separate init object, the init properties override the
237
+ // Request's properties. Merge them into a new Request so that
238
+ // downstream consumers (hooks, header injection, the actual fetch
239
+ // call) see the correct final values.
240
+ // See: https://developer.mozilla.org/en-US/docs/Web/API/Request/Request#parameters
241
+ let options;
242
+ if (args[0] instanceof Request) {
243
+ options = args[1] != null ? new Request(args[0], args[1]) : args[0];
244
+ }
245
+ else {
246
+ options = args[1] || {};
247
+ }
251
248
  const createdSpan = plugin._createSpan(url, options);
252
249
  if (!createdSpan) {
253
250
  return original.apply(this, args);
@@ -290,48 +287,13 @@ export class FetchInstrumentation extends InstrumentationBase {
290
287
  });
291
288
  }
292
289
  }
293
- function withCancelPropagation(body, readerClone) {
294
- if (!body)
295
- return null;
296
- const reader = body.getReader();
297
- return new ReadableStream({
298
- async pull(controller) {
299
- try {
300
- const { value, done } = await reader.read();
301
- if (done) {
302
- reader.releaseLock();
303
- controller.close();
304
- }
305
- else {
306
- controller.enqueue(value);
307
- }
308
- }
309
- catch (err) {
310
- controller.error(err);
311
- reader.cancel(err).catch(_ => { });
312
- try {
313
- reader.releaseLock();
314
- }
315
- catch {
316
- // Spec reference:
317
- // https://streams.spec.whatwg.org/#default-reader-release-lock
318
- //
319
- // releaseLock() only throws if called on an invalid reader
320
- // (i.e. reader.[[stream]] is undefined, meaning the lock is already released
321
- // or the reader was never associated). In normal use this cannot happen.
322
- // This catch is defensive only.
323
- }
324
- }
325
- },
326
- cancel(reason) {
327
- readerClone.cancel(reason).catch(_ => { });
328
- return reader.cancel(reason);
329
- },
330
- });
331
- }
332
- function onSuccess(span, resolve, response) {
333
- let proxiedResponse = null;
290
+ function onSuccess(span, response) {
334
291
  try {
292
+ // Clone the response and eagerly consume the clone to detect
293
+ // when the body transfer completes. The original response is
294
+ // returned to the caller untouched so that it passes internal
295
+ // brand-checks required by APIs such as
296
+ // WebAssembly.compileStreaming.
335
297
  // TODO: Switch to a consumer-driven model and drop `resClone`.
336
298
  // Keeping eager consumption here to preserve current behavior and avoid breaking existing tests.
337
299
  // Context: discussion in PR #5894 → https://github.com/open-telemetry/opentelemetry-js/pull/5894
@@ -339,22 +301,6 @@ export class FetchInstrumentation extends InstrumentationBase {
339
301
  const body = resClone.body;
340
302
  if (body) {
341
303
  const reader = body.getReader();
342
- const isNullBodyStatus =
343
- // 101 responses and protocol upgrading is handled internally by the browser
344
- response.status === 204 ||
345
- response.status === 205 ||
346
- response.status === 304;
347
- const wrappedBody = isNullBodyStatus
348
- ? null
349
- : withCancelPropagation(response.body, reader);
350
- const newResponse = new Response(wrappedBody, {
351
- status: response.status,
352
- statusText: response.statusText,
353
- headers: response.headers,
354
- });
355
- // Response url, type, and redirected are read-only properties that can't be set via constructor
356
- // Use a Proxy to forward them from the original response and maintain the wrapped body
357
- proxiedResponse = createResponseProxy(newResponse, response);
358
304
  const read = () => {
359
305
  reader.read().then(({ done }) => {
360
306
  if (done) {
@@ -374,30 +320,43 @@ export class FetchInstrumentation extends InstrumentationBase {
374
320
  endSpanOnSuccess(span, response);
375
321
  }
376
322
  }
377
- finally {
378
- resolve(proxiedResponse ?? response);
323
+ catch (error) {
324
+ // Setup failed (e.g. clone() or getReader() threw).
325
+ // End the span and clean up so _tasksCount doesn't leak.
326
+ plugin._diag.error('Failed to read fetch response body', error);
327
+ plugin._endSpan(span, spanData, {
328
+ status: 0,
329
+ url,
330
+ });
379
331
  }
332
+ return response;
380
333
  }
381
- function onError(span, reject, error) {
334
+ function onError(span, error) {
382
335
  try {
383
336
  endSpanOnError(span, error);
384
337
  }
385
- finally {
386
- reject(error);
338
+ catch (e) {
339
+ // endSpanOnError failed — fall back to ending the span
340
+ // directly so _tasksCount doesn't leak.
341
+ plugin._diag.error('Failed to end span on fetch error', e);
342
+ plugin._endSpan(span, spanData, {
343
+ status: error.status || 0,
344
+ url,
345
+ });
387
346
  }
347
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
348
+ throw error;
388
349
  }
389
- return new Promise((resolve, reject) => {
390
- return context.with(trace.setSpan(context.active(), createdSpan), () => {
391
- // Call request hook before injection so hooks cannot tamper with propagation headers.
392
- // Also, this means the hook will see `options.headers` in the same type as passed in,
393
- // rather than as a `Headers` instance set by `_addHeaders()`.
394
- plugin._callRequestHook(createdSpan, options);
395
- plugin._addHeaders(options, url);
396
- plugin._tasksCount++;
397
- return original
398
- .apply(self, options instanceof Request ? [options] : [url, options])
399
- .then(onSuccess.bind(self, createdSpan, resolve), onError.bind(self, createdSpan, reject));
400
- });
350
+ return context.with(trace.setSpan(context.active(), createdSpan), () => {
351
+ // Call request hook before injection so hooks cannot tamper with propagation headers.
352
+ // Also, this means the hook will see `options.headers` in the same type as passed in,
353
+ // rather than as a `Headers` instance set by `_addHeaders()`.
354
+ plugin._callRequestHook(createdSpan, options);
355
+ plugin._addHeaders(options, url);
356
+ plugin._tasksCount++;
357
+ return original
358
+ .apply(self, options instanceof Request ? [options] : [url, options])
359
+ .then(onSuccess.bind(self, createdSpan), onError.bind(self, createdSpan));
401
360
  });
402
361
  };
403
362
  };
@@ -456,20 +415,28 @@ export class FetchInstrumentation extends InstrumentationBase {
456
415
  this._diag.warn('this instrumentation is intended for web usage only, it does not instrument server-side fetch()');
457
416
  return;
458
417
  }
459
- if (isWrapped(fetch)) {
460
- this._unwrap(globalThis, 'fetch');
461
- this._diag.debug('removing previous patch for constructor');
418
+ if (this._isEnabled) {
419
+ return;
420
+ }
421
+ this._isEnabled = true;
422
+ if (this._isFetchPatched) {
423
+ this._diag.debug('fetch constructor already patched');
424
+ return;
462
425
  }
426
+ this._isFetchPatched = true;
463
427
  this._wrap(globalThis, 'fetch', this._patchConstructor());
464
428
  }
465
429
  /**
466
- * implements unpatch function
430
+ * deactivates fetch instrumentation
467
431
  */
468
432
  disable() {
469
433
  if (!hasBrowserPerformanceAPI) {
470
434
  return;
471
435
  }
472
- this._unwrap(globalThis, 'fetch');
436
+ if (!this._isEnabled) {
437
+ return;
438
+ }
439
+ this._isEnabled = false;
473
440
  this._usedResources = new WeakSet();
474
441
  }
475
442
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/fetch.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n context,\n propagation,\n SpanKind,\n SpanStatusCode,\n trace,\n} from '@opentelemetry/api';\nimport type { Attributes, HrTime, Span } from '@opentelemetry/api';\nimport {\n SemconvStability,\n semconvStabilityFromStr,\n isWrapped,\n InstrumentationBase,\n InstrumentationConfig,\n safeExecuteInTheMiddle,\n} from '@opentelemetry/instrumentation';\nimport * as core from '@opentelemetry/core';\nimport * as web from '@opentelemetry/sdk-trace-web';\nimport { AttributeNames } from './enums/AttributeNames';\nimport {\n ATTR_HTTP_STATUS_CODE,\n ATTR_HTTP_HOST,\n ATTR_HTTP_USER_AGENT,\n ATTR_HTTP_SCHEME,\n ATTR_HTTP_URL,\n ATTR_HTTP_METHOD,\n ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED,\n ATTR_HTTP_REQUEST_BODY_SIZE,\n} from './semconv';\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 { FetchError, FetchResponse, SpanData } from './types';\nimport {\n getFetchBodyLength,\n normalizeHttpRequestMethod,\n serverPortFromUrl,\n} from './utils';\nimport { VERSION } from './version';\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\nconst hasBrowserPerformanceAPI = typeof PerformanceObserver !== 'undefined';\n\nexport interface FetchCustomAttributeFunction {\n (\n span: Span,\n request: Request | RequestInit,\n result: Response | FetchError\n ): void;\n}\n\nexport interface FetchRequestHookFunction {\n (span: Span, request: Request | RequestInit): void;\n}\n\n/**\n * FetchPlugin Config\n */\nexport interface FetchInstrumentationConfig extends InstrumentationConfig {\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 clearTimingResources?: boolean;\n // urls which should include trace headers when origin doesn't match\n propagateTraceHeaderCorsUrls?: web.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?: FetchCustomAttributeFunction;\n /** Function for adding custom attributes or headers before the request is handled */\n requestHook?: FetchRequestHookFunction;\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 fetch plugin for auto instrumentation\n */\nexport class FetchInstrumentation extends InstrumentationBase<FetchInstrumentationConfig> {\n readonly component: string = 'fetch';\n readonly version: string = VERSION;\n moduleName = this.component;\n private _usedResources = new WeakSet<PerformanceResourceTiming>();\n private _tasksCount = 0;\n\n private _semconvStability: SemconvStability;\n\n constructor(config: FetchInstrumentationConfig = {}) {\n super('@opentelemetry/instrumentation-fetch', VERSION, config);\n this._semconvStability = semconvStabilityFromStr(\n 'http',\n config?.semconvStabilityOptIn\n );\n }\n\n init(): void {}\n\n /**\n * Add cors pre flight child span\n * @param span\n * @param corsPreFlightRequest\n */\n private _addChildSpan(\n span: Span,\n corsPreFlightRequest: PerformanceResourceTiming\n ): void {\n const childSpan = this.tracer.startSpan(\n 'CORS Preflight',\n {\n startTime: corsPreFlightRequest[web.PerformanceTimingNames.FETCH_START],\n },\n trace.setSpan(context.active(), span)\n );\n const skipOldSemconvContentLengthAttrs = !(\n this._semconvStability & SemconvStability.OLD\n );\n web.addSpanNetworkEvents(\n childSpan,\n corsPreFlightRequest,\n this.getConfig().ignoreNetworkEvents,\n undefined,\n skipOldSemconvContentLengthAttrs\n );\n childSpan.end(\n corsPreFlightRequest[web.PerformanceTimingNames.RESPONSE_END]\n );\n }\n\n /**\n * Adds more attributes to span just before ending it\n * @param span\n * @param response\n */\n private _addFinalSpanAttributes(span: Span, response: FetchResponse): void {\n const parsedUrl = web.parseUrl(response.url);\n\n if (this._semconvStability & SemconvStability.OLD) {\n span.setAttribute(ATTR_HTTP_STATUS_CODE, response.status);\n if (response.statusText != null) {\n span.setAttribute(AttributeNames.HTTP_STATUS_TEXT, response.statusText);\n }\n span.setAttribute(ATTR_HTTP_HOST, parsedUrl.host);\n span.setAttribute(ATTR_HTTP_SCHEME, parsedUrl.protocol.replace(':', ''));\n if (typeof navigator !== 'undefined') {\n span.setAttribute(ATTR_HTTP_USER_AGENT, navigator.userAgent);\n }\n }\n\n if (this._semconvStability & SemconvStability.STABLE) {\n span.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, response.status);\n // TODO: Set server.{address,port} at span creation for sampling decisions\n // (a \"SHOULD\" requirement in semconv).\n span.setAttribute(ATTR_SERVER_ADDRESS, parsedUrl.hostname);\n const serverPort = serverPortFromUrl(parsedUrl);\n if (serverPort) {\n span.setAttribute(ATTR_SERVER_PORT, serverPort);\n }\n }\n }\n\n /**\n * Add headers\n * @param options\n * @param spanUrl\n */\n private _addHeaders(options: Request | RequestInit, spanUrl: string): void {\n if (\n !web.shouldPropagateTraceHeaders(\n spanUrl,\n this.getConfig().propagateTraceHeaderCorsUrls\n )\n ) {\n const headers: Partial<Record<string, unknown>> = {};\n propagation.inject(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\n if (options instanceof Request) {\n // This mutates `Request.headers` in-place, because it is read-only\n // (per https://developer.mozilla.org/en-US/docs/Web/API/Request/headers),\n // so we cannot (easily) replace it.\n propagation.inject(context.active(), options.headers, {\n set: (h, k, v) => h.set(k, typeof v === 'string' ? v : String(v)),\n });\n } else {\n // Otherwise, create a new Headers to avoid mutating the caller's\n // possibly re-used headers.\n const headers = new Headers(options.headers);\n propagation.inject(context.active(), headers, {\n set: (h, k, v) => h.set(k, typeof v === 'string' ? v : String(v)),\n });\n options.headers = headers;\n }\n }\n\n /**\n * Clears the resource timings and all resources assigned with spans\n * when {@link FetchPluginConfig.clearTimingResources} is\n * set to true (default false)\n * @private\n */\n private _clearResources() {\n if (this._tasksCount === 0 && this.getConfig().clearTimingResources) {\n performance.clearResourceTimings();\n this._usedResources = new WeakSet<PerformanceResourceTiming>();\n }\n }\n\n /**\n * Creates a new span\n * @param url\n * @param options\n */\n private _createSpan(\n url: string,\n options: Partial<Request | RequestInit> = {}\n ): Span | undefined {\n if (core.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 attributes = {} as Attributes;\n if (this._semconvStability & SemconvStability.OLD) {\n const method = (options.method || 'GET').toUpperCase();\n name = `HTTP ${method}`;\n attributes[AttributeNames.COMPONENT] = this.moduleName;\n attributes[ATTR_HTTP_METHOD] = method;\n attributes[ATTR_HTTP_URL] = url;\n }\n if (this._semconvStability & SemconvStability.STABLE) {\n const origMethod = options.method;\n const normMethod = normalizeHttpRequestMethod(options.method || 'GET');\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] = url;\n }\n\n return this.tracer.startSpan(name, {\n kind: SpanKind.CLIENT,\n attributes,\n });\n }\n\n /**\n * Finds appropriate resource and add network events to the span\n * @param span\n * @param resourcesObserver\n * @param endTime\n */\n private _findResourceAndAddNetworkEvents(\n span: Span,\n resourcesObserver: SpanData,\n endTime: HrTime\n ): void {\n let resources: PerformanceResourceTiming[] = resourcesObserver.entries;\n if (!resources.length) {\n if (!performance.getEntriesByType) {\n return;\n }\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 resources = performance.getEntriesByType(\n 'resource'\n ) as PerformanceResourceTiming[];\n }\n const resource = web.getResource(\n resourcesObserver.spanUrl,\n resourcesObserver.startTime,\n endTime,\n resources,\n this._usedResources,\n 'fetch'\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 web.addSpanNetworkEvents(\n span,\n mainRequest,\n this.getConfig().ignoreNetworkEvents,\n undefined,\n skipOldSemconvContentLengthAttrs\n );\n }\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 */\n private _markResourceAsUsed(resource: PerformanceResourceTiming): void {\n this._usedResources.add(resource);\n }\n\n /**\n * Finish span, add attributes, network events etc.\n * @param span\n * @param spanData\n * @param response\n */\n private _endSpan(span: Span, spanData: SpanData, response: FetchResponse) {\n const endTime = core.millisToHrTime(Date.now());\n const performanceEndTime = core.hrTime();\n this._addFinalSpanAttributes(span, response);\n\n if (this._semconvStability & SemconvStability.STABLE) {\n // https://github.com/open-telemetry/semantic-conventions/blob/main/docs/http/http-spans.md#status\n if (response.status >= 400) {\n span.setStatus({ code: SpanStatusCode.ERROR });\n span.setAttribute(ATTR_ERROR_TYPE, String(response.status));\n }\n }\n\n setTimeout(() => {\n spanData.observer?.disconnect();\n this._findResourceAndAddNetworkEvents(span, spanData, performanceEndTime);\n this._tasksCount--;\n this._clearResources();\n span.end(endTime);\n }, OBSERVER_WAIT_TIME_MS);\n }\n\n /**\n * Patches the constructor of fetch\n */\n private _patchConstructor(): (original: typeof fetch) => typeof fetch {\n return original => {\n const plugin = this;\n const readOnlyProps = new Set(['url', 'type', 'redirected']);\n function createResponseProxy(\n target: Response,\n originalResponse: Response\n ): Response {\n return new Proxy(target, {\n get(t, prop, _receiver) {\n if (typeof prop === 'string' && readOnlyProps.has(prop)) {\n return Reflect.get(originalResponse, prop);\n }\n if (prop === 'clone') {\n return function clone() {\n return createResponseProxy(t.clone(), originalResponse);\n };\n }\n // Use target as receiver so getters (e.g. headers) run with correct this and avoid \"Illegal invocation\"\n const value = Reflect.get(t, prop, t);\n return typeof value === 'function' ? value.bind(t) : value;\n },\n }) as Response;\n }\n\n return function patchConstructor(\n this: typeof globalThis,\n ...args: Parameters<typeof fetch>\n ): Promise<Response> {\n const self = this;\n const url = web.parseUrl(\n args[0] instanceof Request ? args[0].url : String(args[0])\n ).href;\n\n const options = args[0] instanceof Request ? args[0] : args[1] || {};\n const createdSpan = plugin._createSpan(url, options);\n if (!createdSpan) {\n return original.apply(this, args);\n }\n const spanData = plugin._prepareSpanData(url);\n\n if (plugin.getConfig().measureRequestSize) {\n getFetchBodyLength(...args)\n .then(bodyLength => {\n if (!bodyLength) return;\n if (plugin._semconvStability & SemconvStability.OLD) {\n createdSpan.setAttribute(\n ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED,\n bodyLength\n );\n }\n if (plugin._semconvStability & SemconvStability.STABLE) {\n createdSpan.setAttribute(\n ATTR_HTTP_REQUEST_BODY_SIZE,\n bodyLength\n );\n }\n })\n .catch(error => {\n plugin._diag.warn('getFetchBodyLength', error);\n });\n }\n\n function endSpanOnError(span: Span, error: FetchError) {\n plugin._applyAttributesAfterFetch(span, options, error);\n plugin._endSpan(span, spanData, {\n status: error.status || 0,\n statusText: error.message,\n url,\n });\n }\n\n function endSpanOnSuccess(span: Span, response: Response) {\n plugin._applyAttributesAfterFetch(span, options, response);\n if (response.status >= 200 && response.status < 400) {\n plugin._endSpan(span, spanData, response);\n } else {\n plugin._endSpan(span, spanData, {\n status: response.status,\n statusText: response.statusText,\n url,\n });\n }\n }\n\n function withCancelPropagation(\n body: ReadableStream<Uint8Array> | null,\n readerClone: ReadableStreamDefaultReader<Uint8Array>\n ): ReadableStream<Uint8Array> | null {\n if (!body) return null;\n\n const reader = body.getReader();\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const { value, done } = await reader.read();\n if (done) {\n reader.releaseLock();\n controller.close();\n } else {\n controller.enqueue(value);\n }\n } catch (err) {\n controller.error(err);\n reader.cancel(err).catch(_ => {});\n\n try {\n reader.releaseLock();\n } catch {\n // Spec reference:\n // https://streams.spec.whatwg.org/#default-reader-release-lock\n //\n // releaseLock() only throws if called on an invalid reader\n // (i.e. reader.[[stream]] is undefined, meaning the lock is already released\n // or the reader was never associated). In normal use this cannot happen.\n // This catch is defensive only.\n }\n }\n },\n cancel(reason) {\n readerClone.cancel(reason).catch(_ => {});\n return reader.cancel(reason);\n },\n });\n }\n\n function onSuccess(\n span: Span,\n resolve: (value: Response | PromiseLike<Response>) => void,\n response: Response\n ): void {\n let proxiedResponse: Response | null = null;\n\n try {\n // TODO: Switch to a consumer-driven model and drop `resClone`.\n // Keeping eager consumption here to preserve current behavior and avoid breaking existing tests.\n // Context: discussion in PR #5894 → https://github.com/open-telemetry/opentelemetry-js/pull/5894\n const resClone = response.clone();\n const body = resClone.body;\n if (body) {\n const reader = body.getReader();\n const isNullBodyStatus =\n // 101 responses and protocol upgrading is handled internally by the browser\n response.status === 204 ||\n response.status === 205 ||\n response.status === 304;\n const wrappedBody = isNullBodyStatus\n ? null\n : withCancelPropagation(response.body, reader);\n\n const newResponse = new Response(wrappedBody, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n\n // Response url, type, and redirected are read-only properties that can't be set via constructor\n // Use a Proxy to forward them from the original response and maintain the wrapped body\n proxiedResponse = createResponseProxy(newResponse, response);\n\n const read = (): void => {\n reader.read().then(\n ({ done }) => {\n if (done) {\n endSpanOnSuccess(span, response);\n } else {\n read();\n }\n },\n error => {\n endSpanOnError(span, error);\n }\n );\n };\n read();\n } else {\n // some older browsers don't have .body implemented\n endSpanOnSuccess(span, response);\n }\n } finally {\n resolve(proxiedResponse ?? response);\n }\n }\n\n function onError(\n span: Span,\n reject: (reason?: unknown) => void,\n error: FetchError\n ) {\n try {\n endSpanOnError(span, error);\n } finally {\n reject(error);\n }\n }\n\n return new Promise((resolve, reject) => {\n return context.with(\n trace.setSpan(context.active(), createdSpan),\n () => {\n // Call request hook before injection so hooks cannot tamper with propagation headers.\n // Also, this means the hook will see `options.headers` in the same type as passed in,\n // rather than as a `Headers` instance set by `_addHeaders()`.\n plugin._callRequestHook(createdSpan, options);\n plugin._addHeaders(options, url);\n plugin._tasksCount++;\n\n return original\n .apply(\n self,\n options instanceof Request ? [options] : [url, options]\n )\n .then(\n onSuccess.bind(self, createdSpan, resolve),\n onError.bind(self, createdSpan, reject)\n );\n }\n );\n });\n };\n };\n }\n\n private _applyAttributesAfterFetch(\n span: Span,\n request: Request | RequestInit,\n result: Response | FetchError\n ) {\n const applyCustomAttributesOnSpan =\n this.getConfig().applyCustomAttributesOnSpan;\n if (applyCustomAttributesOnSpan) {\n safeExecuteInTheMiddle(\n () => applyCustomAttributesOnSpan(span, request, result),\n error => {\n if (!error) {\n return;\n }\n\n this._diag.error('applyCustomAttributesOnSpan', error);\n },\n true\n );\n }\n }\n\n private _callRequestHook(span: Span, request: Request | RequestInit) {\n const requestHook = this.getConfig().requestHook;\n if (requestHook) {\n safeExecuteInTheMiddle(\n () => requestHook(span, request),\n error => {\n if (!error) {\n return;\n }\n\n this._diag.error('requestHook', error);\n },\n true\n );\n }\n }\n\n /**\n * Prepares a span data - needed later for matching appropriate network\n * resources\n * @param spanUrl\n */\n private _prepareSpanData(spanUrl: string): SpanData {\n const startTime = core.hrTime();\n const entries: PerformanceResourceTiming[] = [];\n if (typeof PerformanceObserver !== 'function') {\n return { entries, startTime, spanUrl };\n }\n\n const observer = new PerformanceObserver(list => {\n const perfObsEntries = list.getEntries() as PerformanceResourceTiming[];\n perfObsEntries.forEach(entry => {\n if (entry.initiatorType === 'fetch' && entry.name === spanUrl) {\n entries.push(entry);\n }\n });\n });\n observer.observe({\n entryTypes: ['resource'],\n });\n return { entries, observer, startTime, spanUrl };\n }\n\n /**\n * implements enable function\n */\n override enable(): void {\n if (!hasBrowserPerformanceAPI) {\n this._diag.warn(\n 'this instrumentation is intended for web usage only, it does not instrument server-side fetch()'\n );\n return;\n }\n if (isWrapped(fetch)) {\n this._unwrap(globalThis, 'fetch');\n this._diag.debug('removing previous patch for constructor');\n }\n this._wrap(globalThis, 'fetch', this._patchConstructor());\n }\n\n /**\n * implements unpatch function\n */\n override disable(): void {\n if (!hasBrowserPerformanceAPI) {\n return;\n }\n this._unwrap(globalThis, 'fetch');\n this._usedResources = new WeakSet<PerformanceResourceTiming>();\n }\n}\n"]}
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/fetch.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n context,\n propagation,\n SpanKind,\n SpanStatusCode,\n trace,\n} from '@opentelemetry/api';\nimport type { Attributes, HrTime, Span } from '@opentelemetry/api';\nimport type { InstrumentationConfig } from '@opentelemetry/instrumentation';\nimport {\n SemconvStability,\n semconvStabilityFromStr,\n InstrumentationBase,\n safeExecuteInTheMiddle,\n} from '@opentelemetry/instrumentation';\nimport * as core from '@opentelemetry/core';\nimport * as web from '@opentelemetry/sdk-trace-web';\nimport { AttributeNames } from './enums/AttributeNames';\nimport {\n ATTR_HTTP_STATUS_CODE,\n ATTR_HTTP_HOST,\n ATTR_HTTP_USER_AGENT,\n ATTR_HTTP_SCHEME,\n ATTR_HTTP_URL,\n ATTR_HTTP_METHOD,\n ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED,\n ATTR_HTTP_REQUEST_BODY_SIZE,\n} from './semconv';\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 type { FetchError, FetchResponse, SpanData } from './types';\nimport {\n getFetchBodyLength,\n normalizeHttpRequestMethod,\n serverPortFromUrl,\n} from './utils';\nimport { VERSION } from './version';\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\nconst hasBrowserPerformanceAPI = typeof PerformanceObserver !== 'undefined';\n\nexport interface FetchCustomAttributeFunction {\n (\n span: Span,\n request: Request | RequestInit,\n result: Response | FetchError\n ): void;\n}\n\nexport interface FetchRequestHookFunction {\n (span: Span, request: Request | RequestInit): void;\n}\n\n/**\n * FetchPlugin Config\n */\nexport interface FetchInstrumentationConfig extends InstrumentationConfig {\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 clearTimingResources?: boolean;\n // urls which should include trace headers when origin doesn't match\n propagateTraceHeaderCorsUrls?: web.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?: FetchCustomAttributeFunction;\n /** Function for adding custom attributes or headers before the request is handled */\n requestHook?: FetchRequestHookFunction;\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 fetch plugin for auto instrumentation\n */\nexport class FetchInstrumentation extends InstrumentationBase<FetchInstrumentationConfig> {\n readonly component: string = 'fetch';\n readonly version: string = VERSION;\n moduleName = this.component;\n private _usedResources = new WeakSet<PerformanceResourceTiming>();\n private _tasksCount = 0;\n\n private _semconvStability: SemconvStability;\n\n // Note: Intentionally *not* using `_enabled` as the field name to avoid\n // any possible confusion with the `_enabled` field used on the *Node.js*\n // InstrumentationBase class.\n // Also not initializing the fields to `false` because the base class\n // constructor already call `enable` modifying their values and it will\n // set the instrumentaitons in a bas state (enabled, patched but with flags set to false)\n declare private _isEnabled: boolean;\n declare private _isFetchPatched: boolean;\n\n constructor(config: FetchInstrumentationConfig = {}) {\n super('@opentelemetry/instrumentation-fetch', VERSION, config);\n this._semconvStability = semconvStabilityFromStr(\n 'http',\n config?.semconvStabilityOptIn\n );\n }\n\n init(): void {}\n\n /**\n * Add cors pre flight child span\n * @param span\n * @param corsPreFlightRequest\n */\n private _addChildSpan(\n span: Span,\n corsPreFlightRequest: PerformanceResourceTiming\n ): void {\n const childSpan = this.tracer.startSpan(\n 'CORS Preflight',\n {\n startTime: corsPreFlightRequest[web.PerformanceTimingNames.FETCH_START],\n },\n trace.setSpan(context.active(), span)\n );\n const skipOldSemconvContentLengthAttrs = !(\n this._semconvStability & SemconvStability.OLD\n );\n web.addSpanNetworkEvents(\n childSpan,\n corsPreFlightRequest,\n this.getConfig().ignoreNetworkEvents,\n undefined,\n skipOldSemconvContentLengthAttrs\n );\n childSpan.end(\n corsPreFlightRequest[web.PerformanceTimingNames.RESPONSE_END]\n );\n }\n\n /**\n * Adds more attributes to span just before ending it\n * @param span\n * @param response\n */\n private _addFinalSpanAttributes(span: Span, response: FetchResponse): void {\n const parsedUrl = web.parseUrl(response.url);\n\n if (this._semconvStability & SemconvStability.OLD) {\n span.setAttribute(ATTR_HTTP_STATUS_CODE, response.status);\n if (response.statusText != null) {\n span.setAttribute(AttributeNames.HTTP_STATUS_TEXT, response.statusText);\n }\n span.setAttribute(ATTR_HTTP_HOST, parsedUrl.host);\n span.setAttribute(ATTR_HTTP_SCHEME, parsedUrl.protocol.replace(':', ''));\n if (typeof navigator !== 'undefined') {\n span.setAttribute(ATTR_HTTP_USER_AGENT, navigator.userAgent);\n }\n }\n\n if (this._semconvStability & SemconvStability.STABLE) {\n span.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, response.status);\n // TODO: Set server.{address,port} at span creation for sampling decisions\n // (a \"SHOULD\" requirement in semconv).\n span.setAttribute(ATTR_SERVER_ADDRESS, parsedUrl.hostname);\n const serverPort = serverPortFromUrl(parsedUrl);\n if (serverPort) {\n span.setAttribute(ATTR_SERVER_PORT, serverPort);\n }\n }\n }\n\n /**\n * Add headers\n * @param options\n * @param spanUrl\n */\n private _addHeaders(options: Request | RequestInit, spanUrl: string): void {\n if (\n !web.shouldPropagateTraceHeaders(\n spanUrl,\n this.getConfig().propagateTraceHeaderCorsUrls\n )\n ) {\n const headers: Partial<Record<string, unknown>> = {};\n propagation.inject(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\n if (options instanceof Request) {\n // This mutates `Request.headers` in-place, because it is read-only\n // (per https://developer.mozilla.org/en-US/docs/Web/API/Request/headers),\n // so we cannot (easily) replace it.\n propagation.inject(context.active(), options.headers, {\n set: (h, k, v) => h.set(k, typeof v === 'string' ? v : String(v)),\n });\n } else {\n // Otherwise, create a new Headers to avoid mutating the caller's\n // possibly re-used headers.\n const headers = new Headers(options.headers);\n propagation.inject(context.active(), headers, {\n set: (h, k, v) => h.set(k, typeof v === 'string' ? v : String(v)),\n });\n options.headers = headers;\n }\n }\n\n /**\n * Clears the resource timings and all resources assigned with spans\n * when {@link FetchPluginConfig.clearTimingResources} is\n * set to true (default false)\n * @private\n */\n private _clearResources() {\n if (this._tasksCount === 0 && this.getConfig().clearTimingResources) {\n performance.clearResourceTimings();\n this._usedResources = new WeakSet<PerformanceResourceTiming>();\n }\n }\n\n /**\n * Creates a new span\n * @param url\n * @param options\n */\n private _createSpan(\n url: string,\n options: Partial<Request | RequestInit> = {}\n ): Span | undefined {\n if (core.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 attributes = {} as Attributes;\n if (this._semconvStability & SemconvStability.OLD) {\n const method = (options.method || 'GET').toUpperCase();\n name = `HTTP ${method}`;\n attributes[AttributeNames.COMPONENT] = this.moduleName;\n attributes[ATTR_HTTP_METHOD] = method;\n attributes[ATTR_HTTP_URL] = url;\n }\n if (this._semconvStability & SemconvStability.STABLE) {\n const origMethod = options.method;\n const normMethod = normalizeHttpRequestMethod(options.method || 'GET');\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] = url;\n }\n\n return this.tracer.startSpan(name, {\n kind: SpanKind.CLIENT,\n attributes,\n });\n }\n\n /**\n * Finds appropriate resource and add network events to the span\n * @param span\n * @param resourcesObserver\n * @param endTime\n */\n private _findResourceAndAddNetworkEvents(\n span: Span,\n resourcesObserver: SpanData,\n endTime: HrTime\n ): void {\n let resources: PerformanceResourceTiming[] = resourcesObserver.entries;\n if (!resources.length) {\n if (!performance.getEntriesByType) {\n return;\n }\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 resources = performance.getEntriesByType(\n 'resource'\n ) as PerformanceResourceTiming[];\n }\n const resource = web.getResource(\n resourcesObserver.spanUrl,\n resourcesObserver.startTime,\n endTime,\n resources,\n this._usedResources,\n 'fetch'\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 web.addSpanNetworkEvents(\n span,\n mainRequest,\n this.getConfig().ignoreNetworkEvents,\n undefined,\n skipOldSemconvContentLengthAttrs\n );\n }\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 */\n private _markResourceAsUsed(resource: PerformanceResourceTiming): void {\n this._usedResources.add(resource);\n }\n\n /**\n * Finish span, add attributes, network events etc.\n * @param span\n * @param spanData\n * @param response\n */\n private _endSpan(span: Span, spanData: SpanData, response: FetchResponse) {\n const endTime = core.millisToHrTime(Date.now());\n const performanceEndTime = core.hrTime();\n this._addFinalSpanAttributes(span, response);\n\n if (this._semconvStability & SemconvStability.STABLE) {\n // https://github.com/open-telemetry/semantic-conventions/blob/main/docs/http/http-spans.md#status\n if (response.status >= 400) {\n span.setStatus({ code: SpanStatusCode.ERROR });\n span.setAttribute(ATTR_ERROR_TYPE, String(response.status));\n }\n }\n\n setTimeout(() => {\n spanData.observer?.disconnect();\n this._findResourceAndAddNetworkEvents(span, spanData, performanceEndTime);\n this._tasksCount--;\n this._clearResources();\n span.end(endTime);\n }, OBSERVER_WAIT_TIME_MS);\n }\n\n /**\n * Patches the constructor of fetch\n */\n private _patchConstructor(): (original: typeof fetch) => typeof fetch {\n return original => {\n const plugin = this;\n\n return function patchConstructor(\n this: typeof globalThis,\n ...args: Parameters<typeof fetch>\n ): Promise<Response> {\n if (!plugin._isEnabled) {\n return original.apply(this, args);\n }\n const self = this;\n const url = web.parseUrl(\n args[0] instanceof Request ? args[0].url : String(args[0])\n ).href;\n\n // Per the Fetch spec, when fetch() is called with a Request object\n // and a separate init object, the init properties override the\n // Request's properties. Merge them into a new Request so that\n // downstream consumers (hooks, header injection, the actual fetch\n // call) see the correct final values.\n // See: https://developer.mozilla.org/en-US/docs/Web/API/Request/Request#parameters\n let options: Request | RequestInit;\n if (args[0] instanceof Request) {\n options = args[1] != null ? new Request(args[0], args[1]) : args[0];\n } else {\n options = args[1] || {};\n }\n const createdSpan = plugin._createSpan(url, options);\n if (!createdSpan) {\n return original.apply(this, args);\n }\n const spanData = plugin._prepareSpanData(url);\n\n if (plugin.getConfig().measureRequestSize) {\n getFetchBodyLength(...args)\n .then(bodyLength => {\n if (!bodyLength) return;\n if (plugin._semconvStability & SemconvStability.OLD) {\n createdSpan.setAttribute(\n ATTR_HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED,\n bodyLength\n );\n }\n if (plugin._semconvStability & SemconvStability.STABLE) {\n createdSpan.setAttribute(\n ATTR_HTTP_REQUEST_BODY_SIZE,\n bodyLength\n );\n }\n })\n .catch(error => {\n plugin._diag.warn('getFetchBodyLength', error);\n });\n }\n\n function endSpanOnError(span: Span, error: FetchError) {\n plugin._applyAttributesAfterFetch(span, options, error);\n plugin._endSpan(span, spanData, {\n status: error.status || 0,\n statusText: error.message,\n url,\n });\n }\n\n function endSpanOnSuccess(span: Span, response: Response) {\n plugin._applyAttributesAfterFetch(span, options, response);\n if (response.status >= 200 && response.status < 400) {\n plugin._endSpan(span, spanData, response);\n } else {\n plugin._endSpan(span, spanData, {\n status: response.status,\n statusText: response.statusText,\n url,\n });\n }\n }\n\n function onSuccess(span: Span, response: Response): Response {\n try {\n // Clone the response and eagerly consume the clone to detect\n // when the body transfer completes. The original response is\n // returned to the caller untouched so that it passes internal\n // brand-checks required by APIs such as\n // WebAssembly.compileStreaming.\n // TODO: Switch to a consumer-driven model and drop `resClone`.\n // Keeping eager consumption here to preserve current behavior and avoid breaking existing tests.\n // Context: discussion in PR #5894 → https://github.com/open-telemetry/opentelemetry-js/pull/5894\n const resClone = response.clone();\n const body = resClone.body;\n if (body) {\n const reader = body.getReader();\n\n const read = (): void => {\n reader.read().then(\n ({ done }) => {\n if (done) {\n endSpanOnSuccess(span, response);\n } else {\n read();\n }\n },\n error => {\n endSpanOnError(span, error);\n }\n );\n };\n read();\n } else {\n // some older browsers don't have .body implemented\n endSpanOnSuccess(span, response);\n }\n } catch (error) {\n // Setup failed (e.g. clone() or getReader() threw).\n // End the span and clean up so _tasksCount doesn't leak.\n plugin._diag.error('Failed to read fetch response body', error);\n plugin._endSpan(span, spanData, {\n status: 0,\n url,\n });\n }\n return response;\n }\n\n function onError(span: Span, error: FetchError): never {\n try {\n endSpanOnError(span, error);\n } catch (e: unknown) {\n // endSpanOnError failed — fall back to ending the span\n // directly so _tasksCount doesn't leak.\n plugin._diag.error('Failed to end span on fetch error', e);\n plugin._endSpan(span, spanData, {\n status: error.status || 0,\n url,\n });\n }\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw error;\n }\n\n return context.with(\n trace.setSpan(context.active(), createdSpan),\n () => {\n // Call request hook before injection so hooks cannot tamper with propagation headers.\n // Also, this means the hook will see `options.headers` in the same type as passed in,\n // rather than as a `Headers` instance set by `_addHeaders()`.\n plugin._callRequestHook(createdSpan, options);\n plugin._addHeaders(options, url);\n plugin._tasksCount++;\n\n return original\n .apply(\n self,\n options instanceof Request ? [options] : [url, options]\n )\n .then(\n onSuccess.bind(self, createdSpan),\n onError.bind(self, createdSpan)\n );\n }\n );\n };\n };\n }\n\n private _applyAttributesAfterFetch(\n span: Span,\n request: Request | RequestInit,\n result: Response | FetchError\n ) {\n const applyCustomAttributesOnSpan =\n this.getConfig().applyCustomAttributesOnSpan;\n if (applyCustomAttributesOnSpan) {\n safeExecuteInTheMiddle(\n () => applyCustomAttributesOnSpan(span, request, result),\n error => {\n if (!error) {\n return;\n }\n\n this._diag.error('applyCustomAttributesOnSpan', error);\n },\n true\n );\n }\n }\n\n private _callRequestHook(span: Span, request: Request | RequestInit) {\n const requestHook = this.getConfig().requestHook;\n if (requestHook) {\n safeExecuteInTheMiddle(\n () => requestHook(span, request),\n error => {\n if (!error) {\n return;\n }\n\n this._diag.error('requestHook', error);\n },\n true\n );\n }\n }\n\n /**\n * Prepares a span data - needed later for matching appropriate network\n * resources\n * @param spanUrl\n */\n private _prepareSpanData(spanUrl: string): SpanData {\n const startTime = core.hrTime();\n const entries: PerformanceResourceTiming[] = [];\n if (typeof PerformanceObserver !== 'function') {\n return { entries, startTime, spanUrl };\n }\n\n const observer = new PerformanceObserver(list => {\n const perfObsEntries = list.getEntries() as PerformanceResourceTiming[];\n perfObsEntries.forEach(entry => {\n if (entry.initiatorType === 'fetch' && entry.name === spanUrl) {\n entries.push(entry);\n }\n });\n });\n observer.observe({\n entryTypes: ['resource'],\n });\n return { entries, observer, startTime, spanUrl };\n }\n\n /**\n * implements enable function\n */\n override enable(): void {\n if (!hasBrowserPerformanceAPI) {\n this._diag.warn(\n 'this instrumentation is intended for web usage only, it does not instrument server-side fetch()'\n );\n return;\n }\n\n if (this._isEnabled) {\n return;\n }\n this._isEnabled = true;\n\n if (this._isFetchPatched) {\n this._diag.debug('fetch constructor already patched');\n return;\n }\n this._isFetchPatched = true;\n this._wrap(globalThis, 'fetch', this._patchConstructor());\n }\n\n /**\n * deactivates fetch instrumentation\n */\n override disable(): void {\n if (!hasBrowserPerformanceAPI) {\n return;\n }\n if (!this._isEnabled) {\n return;\n }\n this._isEnabled = false;\n this._usedResources = new WeakSet<PerformanceResourceTiming>();\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { URLLike } from '@opentelemetry/sdk-trace-web';
1
+ import type { URLLike } from '@opentelemetry/sdk-trace-web';
2
2
  /**
3
3
  * Helper function to determine payload content length for fetch requests
4
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Much of the logic here overlaps with the same utils file in opentelemetry-instrumentation-xml-http-request\n// These may be unified in the future.\n\nimport { diag } from '@opentelemetry/api';\nimport { getStringListFromEnv } from '@opentelemetry/core';\nimport { URLLike } from '@opentelemetry/sdk-trace-web';\n\nconst DIAG_LOGGER = diag.createComponentLogger({\n namespace: '@opentelemetry/opentelemetry-instrumentation-fetch/utils',\n});\n\n/**\n * Helper function to determine payload content length for fetch requests\n *\n * The fetch API is kinda messy: there are a couple of ways the body can be passed in.\n *\n * In all cases, the body param can be some variation of ReadableStream,\n * and ReadableStreams can only be read once! We want to avoid consuming the body here,\n * because that would mean that the body never gets sent with the actual fetch request.\n *\n * Either the first arg is a Request object, which can be cloned\n * so we can clone that object and read the body of the clone\n * without disturbing the original argument\n * However, reading the body here can only be done async; the body() method returns a promise\n * this means this entire function has to return a promise\n *\n * OR the first arg is a url/string\n * in which case the second arg has type RequestInit\n * RequestInit is NOT cloneable, but RequestInit.body is writable\n * so we can chain it into ReadableStream.pipeThrough()\n *\n * ReadableStream.pipeThrough() lets us process a stream and returns a new stream\n * So we can measure the body length as it passes through the pie, but need to attach\n * the new stream to the original request\n * so that the browser still has access to the body.\n *\n * @param body\n * @returns promise that resolves to the content length of the body\n */\nexport function getFetchBodyLength(...args: Parameters<typeof fetch>) {\n if (args[0] instanceof URL || typeof args[0] === 'string') {\n const requestInit = args[1];\n if (!requestInit?.body) {\n return Promise.resolve();\n }\n if (requestInit.body instanceof ReadableStream) {\n const { body, length } = _getBodyNonDestructively(requestInit.body);\n requestInit.body = body;\n\n return length;\n } else {\n return Promise.resolve(getXHRBodyLength(requestInit.body));\n }\n } else {\n const info = args[0];\n if (!info?.body) {\n return Promise.resolve();\n }\n\n return info\n .clone()\n .text()\n .then(t => getByteLength(t));\n }\n}\n\nfunction _getBodyNonDestructively(body: ReadableStream) {\n // can't read a ReadableStream without destroying it\n // but we CAN pipe it through and return a new ReadableStream\n\n // some (older) platforms don't expose the pipeThrough method and in that scenario, we're out of luck;\n // there's no way to read the stream without consuming it.\n if (!body.pipeThrough) {\n DIAG_LOGGER.warn('Platform has ReadableStream but not pipeThrough!');\n return {\n body,\n length: Promise.resolve(undefined),\n };\n }\n\n let length = 0;\n let resolveLength: (l: number) => void;\n const lengthPromise = new Promise<number>(resolve => {\n resolveLength = resolve;\n });\n\n const transform = new TransformStream({\n start() {},\n async transform(chunk, controller) {\n const bytearray = (await chunk) as Uint8Array;\n length += bytearray.byteLength;\n\n controller.enqueue(chunk);\n },\n flush() {\n resolveLength(length);\n },\n });\n\n return {\n body: body.pipeThrough(transform),\n length: lengthPromise,\n };\n}\n\nfunction isDocument(value: unknown): value is Document {\n return typeof Document !== 'undefined' && value instanceof Document;\n}\n\n/**\n * Helper function to determine payload content length for XHR requests\n * @param body\n * @returns content length\n */\nexport function getXHRBodyLength(\n body: Document | XMLHttpRequestBodyInit\n): number | undefined {\n if (isDocument(body)) {\n return new XMLSerializer().serializeToString(document).length;\n }\n\n // XMLHttpRequestBodyInit expands to the following:\n if (typeof body === 'string') {\n return getByteLength(body);\n }\n\n if (body instanceof Blob) {\n return body.size;\n }\n\n if (body instanceof FormData) {\n return getFormDataSize(body);\n }\n\n if (body instanceof URLSearchParams) {\n return getByteLength(body.toString());\n }\n\n // ArrayBuffer | ArrayBufferView\n if (body.byteLength !== undefined) {\n return body.byteLength;\n }\n\n DIAG_LOGGER.warn('unknown body type');\n return undefined;\n}\n\nconst TEXT_ENCODER = new TextEncoder();\nfunction getByteLength(s: string): number {\n return TEXT_ENCODER.encode(s).byteLength;\n}\n\nfunction getFormDataSize(formData: FormData): number {\n let size = 0;\n for (const [key, value] of formData.entries()) {\n size += key.length;\n if (value instanceof Blob) {\n size += value.size;\n } else {\n size += value.length;\n }\n }\n return size;\n}\n\n/**\n * Normalize an HTTP request method string per `http.request.method` spec\n * https://github.com/open-telemetry/semantic-conventions/blob/main/docs/http/http-spans.md#http-client-span\n */\nexport function normalizeHttpRequestMethod(method: string): string {\n const knownMethods = getKnownMethods();\n const methUpper = method.toUpperCase();\n if (methUpper in knownMethods) {\n return methUpper;\n } else {\n return '_OTHER';\n }\n}\n\nconst DEFAULT_KNOWN_METHODS = {\n CONNECT: true,\n DELETE: true,\n GET: true,\n HEAD: true,\n OPTIONS: true,\n PATCH: true,\n POST: true,\n PUT: true,\n TRACE: true,\n // QUERY from https://datatracker.ietf.org/doc/draft-ietf-httpbis-safe-method-w-body/\n QUERY: true,\n};\nlet knownMethods: { [key: string]: boolean };\nfunction getKnownMethods() {\n if (knownMethods === undefined) {\n const cfgMethods = getStringListFromEnv(\n 'OTEL_INSTRUMENTATION_HTTP_KNOWN_METHODS'\n );\n if (cfgMethods && cfgMethods.length > 0) {\n knownMethods = {};\n cfgMethods.forEach(m => {\n knownMethods[m] = true;\n });\n } else {\n knownMethods = DEFAULT_KNOWN_METHODS;\n }\n }\n return knownMethods;\n}\n\nconst HTTP_PORT_FROM_PROTOCOL: { [key: string]: string } = {\n 'https:': '443',\n 'http:': '80',\n};\nexport function serverPortFromUrl(url: URLLike): number | undefined {\n const serverPort = Number(url.port || HTTP_PORT_FROM_PROTOCOL[url.protocol]);\n // Guard with `if (serverPort)` because `Number('') === 0`.\n if (serverPort && !isNaN(serverPort)) {\n return serverPort;\n } else {\n return undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Much of the logic here overlaps with the same utils file in opentelemetry-instrumentation-xml-http-request\n// These may be unified in the future.\n\nimport { diag } from '@opentelemetry/api';\nimport { getStringListFromEnv } from '@opentelemetry/core';\nimport type { URLLike } from '@opentelemetry/sdk-trace-web';\n\nconst DIAG_LOGGER = diag.createComponentLogger({\n namespace: '@opentelemetry/opentelemetry-instrumentation-fetch/utils',\n});\n\n/**\n * Helper function to determine payload content length for fetch requests\n *\n * The fetch API is kinda messy: there are a couple of ways the body can be passed in.\n *\n * In all cases, the body param can be some variation of ReadableStream,\n * and ReadableStreams can only be read once! We want to avoid consuming the body here,\n * because that would mean that the body never gets sent with the actual fetch request.\n *\n * Either the first arg is a Request object, which can be cloned\n * so we can clone that object and read the body of the clone\n * without disturbing the original argument\n * However, reading the body here can only be done async; the body() method returns a promise\n * this means this entire function has to return a promise\n *\n * OR the first arg is a url/string\n * in which case the second arg has type RequestInit\n * RequestInit is NOT cloneable, but RequestInit.body is writable\n * so we can chain it into ReadableStream.pipeThrough()\n *\n * ReadableStream.pipeThrough() lets us process a stream and returns a new stream\n * So we can measure the body length as it passes through the pie, but need to attach\n * the new stream to the original request\n * so that the browser still has access to the body.\n *\n * @param body\n * @returns promise that resolves to the content length of the body\n */\nexport function getFetchBodyLength(...args: Parameters<typeof fetch>) {\n if (args[0] instanceof URL || typeof args[0] === 'string') {\n const requestInit = args[1];\n if (!requestInit?.body) {\n return Promise.resolve();\n }\n if (requestInit.body instanceof ReadableStream) {\n const { body, length } = _getBodyNonDestructively(requestInit.body);\n requestInit.body = body;\n\n return length;\n } else {\n return Promise.resolve(getXHRBodyLength(requestInit.body));\n }\n } else {\n const info = args[0];\n if (!info?.body) {\n return Promise.resolve();\n }\n\n return info\n .clone()\n .text()\n .then(t => getByteLength(t));\n }\n}\n\nfunction _getBodyNonDestructively(body: ReadableStream) {\n // can't read a ReadableStream without destroying it\n // but we CAN pipe it through and return a new ReadableStream\n\n // some (older) platforms don't expose the pipeThrough method and in that scenario, we're out of luck;\n // there's no way to read the stream without consuming it.\n if (!body.pipeThrough) {\n DIAG_LOGGER.warn('Platform has ReadableStream but not pipeThrough!');\n return {\n body,\n length: Promise.resolve(undefined),\n };\n }\n\n let length = 0;\n let resolveLength: (l: number) => void;\n const lengthPromise = new Promise<number>(resolve => {\n resolveLength = resolve;\n });\n\n const transform = new TransformStream({\n start() {},\n async transform(chunk, controller) {\n const bytearray = (await chunk) as Uint8Array;\n length += bytearray.byteLength;\n\n controller.enqueue(chunk);\n },\n flush() {\n resolveLength(length);\n },\n });\n\n return {\n body: body.pipeThrough(transform),\n length: lengthPromise,\n };\n}\n\nfunction isDocument(value: unknown): value is Document {\n return typeof Document !== 'undefined' && value instanceof Document;\n}\n\n/**\n * Helper function to determine payload content length for XHR requests\n * @param body\n * @returns content length\n */\nexport function getXHRBodyLength(\n body: Document | XMLHttpRequestBodyInit\n): number | undefined {\n if (isDocument(body)) {\n return new XMLSerializer().serializeToString(document).length;\n }\n\n // XMLHttpRequestBodyInit expands to the following:\n if (typeof body === 'string') {\n return getByteLength(body);\n }\n\n if (body instanceof Blob) {\n return body.size;\n }\n\n if (body instanceof FormData) {\n return getFormDataSize(body);\n }\n\n if (body instanceof URLSearchParams) {\n return getByteLength(body.toString());\n }\n\n // ArrayBuffer | ArrayBufferView\n if (body.byteLength !== undefined) {\n return body.byteLength;\n }\n\n DIAG_LOGGER.warn('unknown body type');\n return undefined;\n}\n\nconst TEXT_ENCODER = new TextEncoder();\nfunction getByteLength(s: string): number {\n return TEXT_ENCODER.encode(s).byteLength;\n}\n\nfunction getFormDataSize(formData: FormData): number {\n let size = 0;\n for (const [key, value] of formData.entries()) {\n size += key.length;\n if (value instanceof Blob) {\n size += value.size;\n } else {\n size += value.length;\n }\n }\n return size;\n}\n\n/**\n * Normalize an HTTP request method string per `http.request.method` spec\n * https://github.com/open-telemetry/semantic-conventions/blob/main/docs/http/http-spans.md#http-client-span\n */\nexport function normalizeHttpRequestMethod(method: string): string {\n const knownMethods = getKnownMethods();\n const methUpper = method.toUpperCase();\n if (methUpper in knownMethods) {\n return methUpper;\n } else {\n return '_OTHER';\n }\n}\n\nconst DEFAULT_KNOWN_METHODS = {\n CONNECT: true,\n DELETE: true,\n GET: true,\n HEAD: true,\n OPTIONS: true,\n PATCH: true,\n POST: true,\n PUT: true,\n TRACE: true,\n // QUERY from https://datatracker.ietf.org/doc/draft-ietf-httpbis-safe-method-w-body/\n QUERY: true,\n};\nlet knownMethods: { [key: string]: boolean };\nfunction getKnownMethods() {\n if (knownMethods === undefined) {\n const cfgMethods = getStringListFromEnv(\n 'OTEL_INSTRUMENTATION_HTTP_KNOWN_METHODS'\n );\n if (cfgMethods && cfgMethods.length > 0) {\n knownMethods = {};\n cfgMethods.forEach(m => {\n knownMethods[m] = true;\n });\n } else {\n knownMethods = DEFAULT_KNOWN_METHODS;\n }\n }\n return knownMethods;\n}\n\nconst HTTP_PORT_FROM_PROTOCOL: { [key: string]: string } = {\n 'https:': '443',\n 'http:': '80',\n};\nexport function serverPortFromUrl(url: URLLike): number | undefined {\n const serverPort = Number(url.port || HTTP_PORT_FROM_PROTOCOL[url.protocol]);\n // Guard with `if (serverPort)` because `Number('') === 0`.\n if (serverPort && !isNaN(serverPort)) {\n return serverPort;\n } else {\n return undefined;\n }\n}\n"]}
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.213.0";
1
+ export declare const VERSION = "0.215.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,18 +1,7 @@
1
1
  /*
2
2
  * Copyright The OpenTelemetry Authors
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * https://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
3
+ * SPDX-License-Identifier: Apache-2.0
15
4
  */
16
5
  // this is autogenerated file, see scripts/version-update.js
17
- export const VERSION = '0.213.0';
6
+ export const VERSION = '0.215.0';
18
7
  //# sourceMappingURL=version.js.map
@@ -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.213.0';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,4DAA4D;AAC5D,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '0.215.0';\n"]}
@@ -1,7 +1,8 @@
1
1
  import type { Span } from '@opentelemetry/api';
2
- import { InstrumentationBase, InstrumentationConfig } from '@opentelemetry/instrumentation';
2
+ import type { InstrumentationConfig } from '@opentelemetry/instrumentation';
3
+ import { InstrumentationBase } from '@opentelemetry/instrumentation';
3
4
  import * as web from '@opentelemetry/sdk-trace-web';
4
- import { FetchError } from './types';
5
+ import type { FetchError } from './types';
5
6
  export interface FetchCustomAttributeFunction {
6
7
  (span: Span, request: Request | RequestInit, result: Response | FetchError): void;
7
8
  }
@@ -40,6 +41,8 @@ export declare class FetchInstrumentation extends InstrumentationBase<FetchInstr
40
41
  private _usedResources;
41
42
  private _tasksCount;
42
43
  private _semconvStability;
44
+ private _isEnabled;
45
+ private _isFetchPatched;
43
46
  constructor(config?: FetchInstrumentationConfig);
44
47
  init(): void;
45
48
  /**
@@ -111,7 +114,7 @@ export declare class FetchInstrumentation extends InstrumentationBase<FetchInstr
111
114
  */
112
115
  enable(): void;
113
116
  /**
114
- * implements unpatch function
117
+ * deactivates fetch instrumentation
115
118
  */
116
119
  disable(): void;
117
120
  }