Skip to content

Commit

Permalink
perf_hooks: make nodeTiming a first-class object
Browse files Browse the repository at this point in the history
Render all properties of nodeTiming enumerable
so JSON.stringify and Object.keys can access them

Fixes: #35936

PR-URL: #35977
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
  • Loading branch information
Momtchil Momtchev authored and codebytere committed Nov 22, 2020
1 parent eefc6aa commit ed8af3a
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 33 deletions.
110 changes: 77 additions & 33 deletions lib/perf_hooks.js
Expand Up @@ -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',
Expand Down
7 changes: 7 additions & 0 deletions test/parallel/test-performance-eventlooputil.js
Expand Up @@ -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();

Expand Down

0 comments on commit ed8af3a

Please sign in to comment.