From ca87c86e7d0790186e00ef1387e6f621bf0fc05c Mon Sep 17 00:00:00 2001 From: Marten Hennoch Date: Mon, 9 Nov 2020 18:21:41 +0200 Subject: [PATCH 1/3] fix(plugin-fetch): check if PerformanceObserver exists before using it. --- packages/opentelemetry-plugin-fetch/src/fetch.ts | 12 +++++++++++- packages/opentelemetry-plugin-fetch/src/types.ts | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/opentelemetry-plugin-fetch/src/fetch.ts b/packages/opentelemetry-plugin-fetch/src/fetch.ts index 20b28ea833..c78db8824b 100644 --- a/packages/opentelemetry-plugin-fetch/src/fetch.ts +++ b/packages/opentelemetry-plugin-fetch/src/fetch.ts @@ -174,6 +174,9 @@ export class FetchPlugin extends core.BasePlugin> { ): void { let resources: PerformanceResourceTiming[] = resourcesObserver.entries; if (!resources.length) { + if (!performance.getEntriesByType) { + return; + } // fallback - either Observer is not available or it took longer // then OBSERVER_WAIT_TIME_MS and observer didn't collect enough // information @@ -225,7 +228,9 @@ export class FetchPlugin extends core.BasePlugin> { response: FetchResponse ) { const endTime = core.hrTime(); - spanData.observer.disconnect(); + if (spanData.observer) { + spanData.observer.disconnect(); + } this._addFinalSpanAttributes(span, response); setTimeout(() => { @@ -323,6 +328,11 @@ export class FetchPlugin extends core.BasePlugin> { private _prepareSpanData(spanUrl: string): SpanData { const startTime = core.hrTime(); const entries: PerformanceResourceTiming[] = []; + + if (typeof window.PerformanceObserver === 'undefined') { + return { entries, startTime, spanUrl }; + } + const observer: PerformanceObserver = new PerformanceObserver(list => { const entries = list.getEntries() as PerformanceResourceTiming[]; entries.forEach(entry => { diff --git a/packages/opentelemetry-plugin-fetch/src/types.ts b/packages/opentelemetry-plugin-fetch/src/types.ts index 4144aceaa1..7f2e5c6d73 100644 --- a/packages/opentelemetry-plugin-fetch/src/types.ts +++ b/packages/opentelemetry-plugin-fetch/src/types.ts @@ -39,7 +39,7 @@ export interface FetchError { */ export interface SpanData { entries: PerformanceResourceTiming[]; - observer: PerformanceObserver; + observer?: PerformanceObserver; spanUrl: string; startTime: api.HrTime; } From a55a8eeb2b23f58016e5f4bc705a6da726765c91 Mon Sep 17 00:00:00 2001 From: Marten Hennoch Date: Mon, 9 Nov 2020 18:21:41 +0200 Subject: [PATCH 2/3] fix(plugin-fetch): check if PerformanceObserverexists before using it --- .../opentelemetry-plugin-fetch/src/fetch.ts | 12 +++++++++++- .../opentelemetry-plugin-fetch/src/types.ts | 2 +- .../test/fetch.test.ts | 18 ++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/packages/opentelemetry-plugin-fetch/src/fetch.ts b/packages/opentelemetry-plugin-fetch/src/fetch.ts index 20b28ea833..c78db8824b 100644 --- a/packages/opentelemetry-plugin-fetch/src/fetch.ts +++ b/packages/opentelemetry-plugin-fetch/src/fetch.ts @@ -174,6 +174,9 @@ export class FetchPlugin extends core.BasePlugin> { ): void { let resources: PerformanceResourceTiming[] = resourcesObserver.entries; if (!resources.length) { + if (!performance.getEntriesByType) { + return; + } // fallback - either Observer is not available or it took longer // then OBSERVER_WAIT_TIME_MS and observer didn't collect enough // information @@ -225,7 +228,9 @@ export class FetchPlugin extends core.BasePlugin> { response: FetchResponse ) { const endTime = core.hrTime(); - spanData.observer.disconnect(); + if (spanData.observer) { + spanData.observer.disconnect(); + } this._addFinalSpanAttributes(span, response); setTimeout(() => { @@ -323,6 +328,11 @@ export class FetchPlugin extends core.BasePlugin> { private _prepareSpanData(spanUrl: string): SpanData { const startTime = core.hrTime(); const entries: PerformanceResourceTiming[] = []; + + if (typeof window.PerformanceObserver === 'undefined') { + return { entries, startTime, spanUrl }; + } + const observer: PerformanceObserver = new PerformanceObserver(list => { const entries = list.getEntries() as PerformanceResourceTiming[]; entries.forEach(entry => { diff --git a/packages/opentelemetry-plugin-fetch/src/types.ts b/packages/opentelemetry-plugin-fetch/src/types.ts index 4144aceaa1..7f2e5c6d73 100644 --- a/packages/opentelemetry-plugin-fetch/src/types.ts +++ b/packages/opentelemetry-plugin-fetch/src/types.ts @@ -39,7 +39,7 @@ export interface FetchError { */ export interface SpanData { entries: PerformanceResourceTiming[]; - observer: PerformanceObserver; + observer?: PerformanceObserver; spanUrl: string; startTime: api.HrTime; } diff --git a/packages/opentelemetry-plugin-fetch/test/fetch.test.ts b/packages/opentelemetry-plugin-fetch/test/fetch.test.ts index 647537f6c3..cb3287fcd7 100644 --- a/packages/opentelemetry-plugin-fetch/test/fetch.test.ts +++ b/packages/opentelemetry-plugin-fetch/test/fetch.test.ts @@ -583,4 +583,22 @@ describe('fetch', () => { ); }); }); + + describe('when PerformanceObserver is undefined', () => { + beforeEach(done => { + Object.defineProperty(window, 'PerformanceObserver', { + value: undefined, + }); + + prepareData(done, url, {}); + }); + + afterEach(() => { + clearData(); + }); + + it('should still create spans', () => { + assert.strictEqual(exportSpy.args.length, 2, 'no spans created'); + }); + }); }); From 301d999401cdec47f9fb813e1be080a24bba770c Mon Sep 17 00:00:00 2001 From: Marten Hennoch Date: Wed, 20 Jan 2021 00:05:02 +0200 Subject: [PATCH 3/3] fix: lint --- packages/opentelemetry-exporter-collector-grpc/test/helper.ts | 4 +--- .../opentelemetry-exporter-collector-proto/test/helper.ts | 4 +--- packages/opentelemetry-exporter-collector/test/helper.ts | 4 +--- packages/opentelemetry-web/src/utils.ts | 4 +--- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/packages/opentelemetry-exporter-collector-grpc/test/helper.ts b/packages/opentelemetry-exporter-collector-grpc/test/helper.ts index 1cede8a1ed..472120ba9e 100644 --- a/packages/opentelemetry-exporter-collector-grpc/test/helper.ts +++ b/packages/opentelemetry-exporter-collector-grpc/test/helper.ts @@ -93,9 +93,7 @@ export function mockObserver( return metric; } -export function mockValueRecorder(): metrics.Metric< - metrics.BoundValueRecorder -> & +export function mockValueRecorder(): metrics.Metric & ValueRecorder { const name = 'int-recorder'; const metric = diff --git a/packages/opentelemetry-exporter-collector-proto/test/helper.ts b/packages/opentelemetry-exporter-collector-proto/test/helper.ts index 89d154a2dd..abb4af5e7e 100644 --- a/packages/opentelemetry-exporter-collector-proto/test/helper.ts +++ b/packages/opentelemetry-exporter-collector-proto/test/helper.ts @@ -73,9 +73,7 @@ export function mockObserver( return metric; } -export function mockValueRecorder(): metrics.Metric< - metrics.BoundValueRecorder -> & +export function mockValueRecorder(): metrics.Metric & ValueRecorder { const name = 'int-recorder'; const metric = diff --git a/packages/opentelemetry-exporter-collector/test/helper.ts b/packages/opentelemetry-exporter-collector/test/helper.ts index fb038ebec2..922674b346 100644 --- a/packages/opentelemetry-exporter-collector/test/helper.ts +++ b/packages/opentelemetry-exporter-collector/test/helper.ts @@ -135,9 +135,7 @@ export function mockUpDownSumObserver( return metric; } -export function mockValueRecorder(): metrics.Metric< - metrics.BoundValueRecorder -> & +export function mockValueRecorder(): metrics.Metric & ValueRecorder { const name = 'int-recorder'; const metric = diff --git a/packages/opentelemetry-web/src/utils.ts b/packages/opentelemetry-web/src/utils.ts index 385cb1d05f..6b94959f96 100644 --- a/packages/opentelemetry-web/src/utils.ts +++ b/packages/opentelemetry-web/src/utils.ts @@ -125,9 +125,7 @@ export function getResource( startTimeHR: api.HrTime, endTimeHR: api.HrTime, resources: PerformanceResourceTiming[], - ignoredResources: WeakSet = new WeakSet< - PerformanceResourceTiming - >(), + ignoredResources: WeakSet = new WeakSet(), initiatorType?: string ): PerformanceResourceTimingInfo { // de-relativize the URL before usage (does no harm to absolute URLs)