1'use strict'; 2 3const common = require('../common'); 4 5common.skipIfInspectorDisabled(); 6common.skipIfWorker(); // https://github.com/nodejs/node/issues/22767 7 8const assert = require('assert'); 9const { performance } = require('perf_hooks'); 10const { Session } = require('inspector'); 11 12const session = new Session(); 13 14function post(message, data) { 15 return new Promise((resolve, reject) => { 16 session.post(message, data, (err, result) => { 17 if (err) 18 reject(new Error(JSON.stringify(err))); 19 else 20 resolve(result); 21 }); 22 }); 23} 24 25async function test() { 26 session.connect(); 27 28 const events = []; 29 let tracingComplete = false; 30 session.on('NodeTracing.dataCollected', (n) => { 31 assert.ok(n && n.params && n.params.value); 32 events.push(...n.params.value); // append the events. 33 }); 34 session.on('NodeTracing.tracingComplete', () => tracingComplete = true); 35 36 // Generate a node.perf event before tracing is enabled. 37 performance.mark('mark1'); 38 39 const traceConfig = { includedCategories: ['node.perf'] }; 40 await post('NodeTracing.start', { traceConfig }); 41 42 // Generate a node.perf event after tracing is enabled. This should be the 43 // mark event captured. 44 performance.mark('mark2'); 45 46 await post('NodeTracing.stop', { traceConfig }); 47 48 performance.mark('mark3'); 49 50 session.disconnect(); 51 52 assert.ok(tracingComplete); 53 54 const marks = events.filter((t) => null !== /node\.perf\.usertim/.exec(t.cat)); 55 assert.strictEqual(marks.length, 1); 56 assert.strictEqual(marks[0].name, 'mark2'); 57} 58 59test(); 60