From 6e1f442d26c537feb3d3cd7df9c3abc4ec7c7309 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Og=C3=B3rek?= Date: Thu, 27 Feb 2020 09:36:49 +0100 Subject: [PATCH] ref: Create crossPlatformPerformance layer with better typings and fallback for edge-cases --- CHANGELOG.md | 5 ++++- packages/apm/src/span.ts | 20 ++++++++++++-------- packages/node/test/transports/http.test.ts | 2 -- packages/node/test/transports/https.test.ts | 2 -- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43184495bca7..a95d3ebb00f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,10 @@ ## Unreleased -- none +- [core] ref: Remove unused `sentry_timestamp` header (#2458) +- [node] ref: Drop Node v6, add Node v12 to test matrix, move all scripts to Node v12 (#2455) +- [apm] fix: Use monotonic clock to compute durations (#2441) +- [utils] ref: Prevent instantiating unnecessary Date objects in `timestampWithMs` (#2442) ## 5.12.5 diff --git a/packages/apm/src/span.ts b/packages/apm/src/span.ts index ff76920b1bec..372364d10263 100644 --- a/packages/apm/src/span.ts +++ b/packages/apm/src/span.ts @@ -13,14 +13,18 @@ import { uuid4, } from '@sentry/utils'; -const global = getGlobalObject(); - -const performanceNow = (() => { +const crossPlatformPerformance: Pick = (() => { if (isNodeEnv()) { - const { performance } = dynamicRequire(module, 'perf_hooks'); - return performance.now; + const { performance } = dynamicRequire(module, 'perf_hooks') as { performance: Performance }; + return performance; } - return global.performance.now.bind(global.performance); + return ( + getGlobalObject().performance || { + now(): number { + return Date.now(); + }, + } + ); })(); // TODO: Should this be exported? @@ -109,7 +113,7 @@ export class Span implements SpanInterface, SpanContext { * Works with Node.js v8.5.0 or higher. * https://nodejs.org/api/perf_hooks.html#perf_hooks_performance_now */ - private readonly _startTimestampMonotonic: number = performanceNow(); + private readonly _startTimestampMonotonic: number = crossPlatformPerformance.now(); /** * Finish timestamp of the span. @@ -291,7 +295,7 @@ export class Span implements SpanInterface, SpanContext { return undefined; } - const durationSeconds = (performanceNow() - this._startTimestampMonotonic) / 1000; + const durationSeconds = (crossPlatformPerformance.now() - this._startTimestampMonotonic) / 1000; this.timestamp = this.startTimestamp + durationSeconds; if (this.spanRecorder === undefined) { diff --git a/packages/node/test/transports/http.test.ts b/packages/node/test/transports/http.test.ts index 534413ae5a00..e194d687d739 100644 --- a/packages/node/test/transports/http.test.ts +++ b/packages/node/test/transports/http.test.ts @@ -97,8 +97,6 @@ describe('HTTPTransport', () => { const now = Date.now(); const mock = jest .spyOn(Date, 'now') - // Initialize _disabledUntil attribute - .mockReturnValueOnce(now) // Check for first event .mockReturnValueOnce(now) // Setting disabledUntil diff --git a/packages/node/test/transports/https.test.ts b/packages/node/test/transports/https.test.ts index 9c7f2bdf4bbe..9d82d4592e8d 100644 --- a/packages/node/test/transports/https.test.ts +++ b/packages/node/test/transports/https.test.ts @@ -103,8 +103,6 @@ describe('HTTPSTransport', () => { const now = Date.now(); const mock = jest .spyOn(Date, 'now') - // Initialize _disabledUntil attribute - .mockReturnValueOnce(now) // Check for first event .mockReturnValueOnce(now) // Setting disabledUntil