Trace events | Node.js v23.11.0 Documentation (original) (raw)

Source Code: lib/trace_events.js

The node:trace_events module provides a mechanism to centralize tracing information generated by V8, Node.js core, and userspace code.

Tracing can be enabled with the --trace-event-categories command-line flag or by using the node:trace_events module. The --trace-event-categories flag accepts a list of comma-separated category names.

The available categories are:

By default the node, node.async_hooks, and v8 categories are enabled.

node --trace-event-categories v8,node,node.async_hooks server.js

Prior versions of Node.js required the use of the --trace-events-enabledflag to enable trace events. This requirement has been removed. However, the--trace-events-enabled flag may still be used and will enable thenode, node.async_hooks, and v8 trace event categories by default.

`node --trace-events-enabled

is equivalent to

node --trace-event-categories v8,node,node.async_hooks`

Alternatively, trace events may be enabled using the node:trace_events module:

`import { createTracing } from 'node:trace_events'; const tracing = createTracing({ categories: ['node.perf'] }); tracing.enable(); // Enable trace event capture for the 'node.perf' category

// do work

tracing.disable(); // Disable trace event capture for the 'node.perf' category const { createTracing } = require('node:trace_events'); const tracing = createTracing({ categories: ['node.perf'] }); tracing.enable(); // Enable trace event capture for the 'node.perf' category

// do work

tracing.disable(); // Disable trace event capture for the 'node.perf' category`

Running Node.js with tracing enabled will produce log files that can be opened in the chrome://tracingtab of Chrome.

The logging file is by default called node_trace.${rotation}.log, where${rotation} is an incrementing log-rotation id. The filepath pattern can be specified with --trace-event-file-pattern that accepts a template string that supports ${rotation} and ${pid}:

node --trace-event-categories v8 --trace-event-file-pattern '${pid}-${rotation}.log' server.js

To guarantee that the log file is properly generated after signal events likeSIGINT, SIGTERM, or SIGBREAK, make sure to have the appropriate handlers in your code, such as:

process.on('SIGINT', function onSigint() { console.info('Received SIGINT.'); process.exit(130); // Or applicable exit code depending on OS and signal });

The tracing system uses the same time source as the one used by process.hrtime(). However the trace-event timestamps are expressed in microseconds, unlike process.hrtime() which returns nanoseconds.

The features from this module are not available in Worker threads.

The node:trace_events module#

Added in: v10.0.0

Tracing object#

Added in: v10.0.0

The Tracing object is used to enable or disable tracing for sets of categories. Instances are created using the trace_events.createTracing()method.

When created, the Tracing object is disabled. Calling thetracing.enable() method adds the categories to the set of enabled trace event categories. Calling tracing.disable() will remove the categories from the set of enabled trace event categories.

tracing.categories#

Added in: v10.0.0

A comma-separated list of the trace event categories covered by thisTracing object.

tracing.disable()#

Added in: v10.0.0

Disables this Tracing object.

Only trace event categories not covered by other enabled Tracing objects and not specified by the --trace-event-categories flag will be disabled.

`import { createTracing, getEnabledCategories } from 'node:trace_events'; const t1 = createTracing({ categories: ['node', 'v8'] }); const t2 = createTracing({ categories: ['node.perf', 'node'] }); t1.enable(); t2.enable();

// Prints 'node,node.perf,v8' console.log(getEnabledCategories());

t2.disable(); // Will only disable emission of the 'node.perf' category

// Prints 'node,v8' console.log(getEnabledCategories()); const { createTracing, getEnabledCategories } = require('node:trace_events'); const t1 = createTracing({ categories: ['node', 'v8'] }); const t2 = createTracing({ categories: ['node.perf', 'node'] }); t1.enable(); t2.enable();

// Prints 'node,node.perf,v8' console.log(getEnabledCategories());

t2.disable(); // Will only disable emission of the 'node.perf' category

// Prints 'node,v8' console.log(getEnabledCategories());`

tracing.enable()#

Added in: v10.0.0

Enables this Tracing object for the set of categories covered by theTracing object.

tracing.enabled#

Added in: v10.0.0

trace_events.createTracing(options)#

Added in: v10.0.0

Creates and returns a Tracing object for the given set of categories.

import { createTracing } from 'node:trace_events'; const categories = ['node.perf', 'node.async_hooks']; const tracing = createTracing({ categories }); tracing.enable(); // do stuff tracing.disable(); const { createTracing } = require('node:trace_events'); const categories = ['node.perf', 'node.async_hooks']; const tracing = createTracing({ categories }); tracing.enable(); // do stuff tracing.disable();

trace_events.getEnabledCategories()#

Added in: v10.0.0

Returns a comma-separated list of all currently-enabled trace event categories. The current set of enabled trace event categories is determined by the union of all currently-enabled Tracing objects and any categories enabled using the --trace-event-categories flag.

Given the file test.js below, the commandnode --trace-event-categories node.perf test.js will print'node.async_hooks,node.perf' to the console.

`import { createTracing, getEnabledCategories } from 'node:trace_events'; const t1 = createTracing({ categories: ['node.async_hooks'] }); const t2 = createTracing({ categories: ['node.perf'] }); const t3 = createTracing({ categories: ['v8'] });

t1.enable(); t2.enable();

console.log(getEnabledCategories()); const { createTracing, getEnabledCategories } = require('node:trace_events'); const t1 = createTracing({ categories: ['node.async_hooks'] }); const t2 = createTracing({ categories: ['node.perf'] }); const t3 = createTracing({ categories: ['v8'] });

t1.enable(); t2.enable();

console.log(getEnabledCategories());`

Examples#

Collect trace events data by inspector#

`import { Session } from 'node:inspector'; const session = new Session(); session.connect();

function post(message, data) { return new Promise((resolve, reject) => { session.post(message, data, (err, result) => { if (err) reject(new Error(JSON.stringify(err))); else resolve(result); }); }); }

async function collect() { const data = []; session.on('NodeTracing.dataCollected', (chunk) => data.push(chunk)); session.on('NodeTracing.tracingComplete', () => { // done }); const traceConfig = { includedCategories: ['v8'] }; await post('NodeTracing.start', { traceConfig }); // do something setTimeout(() => { post('NodeTracing.stop').then(() => { session.disconnect(); console.log(data); }); }, 1000); }

collect(); 'use strict';

const { Session } = require('node:inspector'); const session = new Session(); session.connect();

function post(message, data) { return new Promise((resolve, reject) => { session.post(message, data, (err, result) => { if (err) reject(new Error(JSON.stringify(err))); else resolve(result); }); }); }

async function collect() { const data = []; session.on('NodeTracing.dataCollected', (chunk) => data.push(chunk)); session.on('NodeTracing.tracingComplete', () => { // done }); const traceConfig = { includedCategories: ['v8'] }; await post('NodeTracing.start', { traceConfig }); // do something setTimeout(() => { post('NodeTracing.stop').then(() => { session.disconnect(); console.log(data); }); }, 1000); }

collect();`