From 23cd68b7eb756fd5cc7e5ad43b8b31c32f6664f8 Mon Sep 17 00:00:00 2001 From: Ryan Hinchey Date: Thu, 11 Mar 2021 11:13:53 -0500 Subject: [PATCH] fix: adding web worker and ssr support --- .../src/platform/browser/environment.ts | 4 +++- .../src/fetch.ts | 17 ++++++++++++++--- packages/opentelemetry-web/src/utils.ts | 14 +++++++++++--- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/packages/opentelemetry-core/src/platform/browser/environment.ts b/packages/opentelemetry-core/src/platform/browser/environment.ts index ea9514e4acb..30a6814d3d0 100644 --- a/packages/opentelemetry-core/src/platform/browser/environment.ts +++ b/packages/opentelemetry-core/src/platform/browser/environment.ts @@ -25,7 +25,9 @@ import { * Gets the environment variables */ export function getEnv(): Required { - const _window = window as typeof window & RAW_ENVIRONMENT; + const _window = (typeof window === 'undefined' + ? self + : window) as typeof window & RAW_ENVIRONMENT; const globalEnv = parseEnvironment(_window); return Object.assign({}, DEFAULT_ENVIRONMENT, globalEnv); } diff --git a/packages/opentelemetry-instrumentation-fetch/src/fetch.ts b/packages/opentelemetry-instrumentation-fetch/src/fetch.ts index 5aa369d82b9..b263c110152 100644 --- a/packages/opentelemetry-instrumentation-fetch/src/fetch.ts +++ b/packages/opentelemetry-instrumentation-fetch/src/fetch.ts @@ -32,7 +32,17 @@ import { VERSION } from './version'; // hard to say how long it should really wait, seems like 300ms is // safe enough const OBSERVER_WAIT_TIME_MS = 300; -const urlNormalizingA = document.createElement('a'); + +// Used to normalize relative URLs +let a: HTMLAnchorElement | undefined; +const getUrlNormalizingAnchor = () => { + if (!a) { + a = document.createElement('a'); + } + + return a; +}; + /** * FetchPlugin Config */ @@ -359,11 +369,12 @@ export class FetchInstrumentation extends InstrumentationBase< const observer: PerformanceObserver = new PerformanceObserver(list => { const perfObsEntries = list.getEntries() as PerformanceResourceTiming[]; - urlNormalizingA.href = spanUrl; + const urlNormalizingAnchor = getUrlNormalizingAnchor(); + urlNormalizingAnchor.href = spanUrl; perfObsEntries.forEach(entry => { if ( entry.initiatorType === 'fetch' && - entry.name === urlNormalizingA.href + entry.name === urlNormalizingAnchor.href ) { entries.push(entry); } diff --git a/packages/opentelemetry-web/src/utils.ts b/packages/opentelemetry-web/src/utils.ts index 3e4e45cb8c4..8c6a1a0e866 100644 --- a/packages/opentelemetry-web/src/utils.ts +++ b/packages/opentelemetry-web/src/utils.ts @@ -29,7 +29,14 @@ import { import { HttpAttribute } from '@opentelemetry/semantic-conventions'; // Used to normalize relative URLs -const urlNormalizingA = document.createElement('a'); +let a: HTMLAnchorElement | undefined; +const getUrlNormalizingAnchor = () => { + if (!a) { + a = document.createElement('a'); + } + + return a; +}; /** * Helper function to be able to use enum as typed key in type and in interface when using forEach @@ -125,8 +132,9 @@ export function getResource( initiatorType?: string ): PerformanceResourceTimingInfo { // de-relativize the URL before usage (does no harm to absolute URLs) - urlNormalizingA.href = spanUrl; - spanUrl = urlNormalizingA.href; + const urlNormalizingAnchor = getUrlNormalizingAnchor(); + urlNormalizingAnchor.href = spanUrl; + spanUrl = urlNormalizingAnchor.href; const filteredResources = filterResourcesForSpan( spanUrl,