From feff38501a69f9860a6bc8f6647c3d5a2c8bc1c9 Mon Sep 17 00:00:00 2001 From: Momtchil Momtchev Date: Thu, 5 Nov 2020 14:11:44 +0100 Subject: [PATCH] perf_hooks: make nodeTiming a first-class object Render all properties of nodeTiming enumerable so JSON.stringify and Object.keys can access them Fixes: https://github.com/nodejs/node/issues/35936 PR-URL: https://github.com/nodejs/node/pull/35977 Reviewed-By: Anna Henningsen Reviewed-By: James M Snell Reviewed-By: Rich Trott --- lib/perf_hooks.js | 110 ++++++++++++------ .../test-performance-eventlooputil.js | 7 ++ 2 files changed, 84 insertions(+), 33 deletions(-) diff --git a/lib/perf_hooks.js b/lib/perf_hooks.js index 3fd7e7eded0352..a2a4cb4f7fa8a4 100644 --- a/lib/perf_hooks.js +++ b/lib/perf_hooks.js @@ -166,50 +166,94 @@ function getMilestoneTimestamp(milestoneIdx) { } class PerformanceNodeTiming extends PerformanceEntry { - get name() { - return 'node'; - } + constructor() { + super(); - get entryType() { - return 'node'; - } + ObjectDefineProperties(this, { + name: { + enumerable: true, + configurable: true, + value: 'node' + }, - get startTime() { - return 0; - } + entryType: { + enumerable: true, + configurable: true, + value: 'node' + }, - get duration() { - return now() - timeOrigin; - } + startTime: { + enumerable: true, + configurable: true, + value: 0 + }, - get nodeStart() { - return getMilestoneTimestamp(NODE_PERFORMANCE_MILESTONE_NODE_START); - } + duration: { + enumerable: true, + configurable: true, + get() { + return now() - timeOrigin; + } + }, - get v8Start() { - return getMilestoneTimestamp(NODE_PERFORMANCE_MILESTONE_V8_START); - } + nodeStart: { + enumerable: true, + configurable: true, + get() { + return getMilestoneTimestamp(NODE_PERFORMANCE_MILESTONE_NODE_START); + } + }, - get environment() { - return getMilestoneTimestamp(NODE_PERFORMANCE_MILESTONE_ENVIRONMENT); - } + v8Start: { + enumerable: true, + configurable: true, + get() { + return getMilestoneTimestamp(NODE_PERFORMANCE_MILESTONE_V8_START); + } + }, - get loopStart() { - return getMilestoneTimestamp(NODE_PERFORMANCE_MILESTONE_LOOP_START); - } + environment: { + enumerable: true, + configurable: true, + get() { + return getMilestoneTimestamp(NODE_PERFORMANCE_MILESTONE_ENVIRONMENT); + } + }, - get loopExit() { - return getMilestoneTimestamp(NODE_PERFORMANCE_MILESTONE_LOOP_EXIT); - } + loopStart: { + enumerable: true, + configurable: true, + get() { + return getMilestoneTimestamp(NODE_PERFORMANCE_MILESTONE_LOOP_START); + } + }, - get bootstrapComplete() { - return getMilestoneTimestamp(NODE_PERFORMANCE_MILESTONE_BOOTSTRAP_COMPLETE); - } + loopExit: { + enumerable: true, + configurable: true, + get() { + return getMilestoneTimestamp(NODE_PERFORMANCE_MILESTONE_LOOP_EXIT); + } + }, - get idleTime() { - return loopIdleTime(); - } + bootstrapComplete: { + enumerable: true, + configurable: true, + get() { + return getMilestoneTimestamp( + NODE_PERFORMANCE_MILESTONE_BOOTSTRAP_COMPLETE); + } + }, + idleTime: { + enumerable: true, + configurable: true, + get() { + return loopIdleTime(); + } + } + }); + } [kInspect]() { return { name: 'node', diff --git a/test/parallel/test-performance-eventlooputil.js b/test/parallel/test-performance-eventlooputil.js index 6e62a666443289..9ce7212729d574 100644 --- a/test/parallel/test-performance-eventlooputil.js +++ b/test/parallel/test-performance-eventlooputil.js @@ -22,6 +22,13 @@ if (nodeTiming.loopStart === -1) { { idle: 0, active: 0, utilization: 0 }); } +const nodeTimingProps = ['name', 'entryType', 'startTime', 'duration', + 'nodeStart', 'v8Start', 'environment', 'loopStart', + 'loopExit', 'bootstrapComplete', 'idleTime']; +for (const p of nodeTimingProps) + assert.ok(typeof JSON.parse(JSON.stringify(nodeTiming))[p] === + typeof nodeTiming[p]); + setTimeout(mustCall(function r() { const elu1 = eventLoopUtilization();