Node.js v20.20.6 文档


跟踪事件#>

【Trace events】

稳定性: 1 - 实验性

源代码: lib/trace_events.js

node:trace_events 模块提供了一种机制,用于集中 V8、Node.js 核心和用户空间代码生成的跟踪信息。

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

可以通过使用 --trace-event-categories 命令行标志或 node:trace_events 模块来启用跟踪。 --trace-event-categories 标志接受用逗号分隔的类别名称列表。

【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:】

  • node:一个空占位符。
  • node.async_hooks:启用捕获详细的 async_hooks 跟踪数据。async_hooks 事件具有唯一的 asyncId 和特殊的 triggerId triggerAsyncId 属性。
  • node.bootstrap:启用捕获 Node.js 启动里程碑。
  • node.console:启用捕获 console.time()console.count() 的输出。
  • node.threadpoolwork.sync:启用对线程池同步操作的跟踪数据捕获,例如 blobzlibcryptonode_api
  • node.threadpoolwork.async:启用对线程池异步操作的追踪数据捕获,例如 blobzlibcryptonode_api
  • node.dns.native:启用 DNS 查询的跟踪数据捕获。
  • node.net.native:启用网络跟踪数据的捕获。
  • node.environment:启用捕获 Node.js 环境里程碑。
  • node.fs.sync:启用对文件系统同步方法的跟踪数据捕获。
  • node.fs_dir.sync:启用对文件系统同步目录方法的跟踪数据捕获。
  • node.fs.async:启用对文件系统异步方法的跟踪数据捕获。
  • node.fs_dir.async:启用对文件系统异步目录方法的跟踪数据捕获。
  • node.perf:启用 性能 API 测量的捕获。
    • node.perf.usertiming:仅启用捕获性能 API 用户时间的度量和标记。
    • node.perf.timerify:只允许捕获 Performance API timerify 的测量值。
  • node.promises.rejections:启用捕获跟踪未处理的 Promise 拒绝数量以及之后处理的拒绝的跟踪数据。
  • node.vm.script:启用对 node:vm 模块的 runInNewContext()runInContext()runInThisContext() 方法的跟踪数据捕获。
  • v8V8 事件与垃圾回收、编译和执行相关。
  • node.http:启用对 HTTP 请求/响应的跟踪数据捕获。
  • node.module_timer:启用对 CJS 模块加载的跟踪数据捕获。

默认情况下,nodenode.async_hooksv8 类别是启用的。

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

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

之前版本的 Node.js 需要使用 --trace-events-enabled 标志来启用跟踪事件。这个要求已经被移除了。然而,--trace-events-enabled 标志仍然可以使用,并默认启用 nodenode.async_hooksv8 跟踪事件类别。

【Prior versions of Node.js required the use of the --trace-events-enabled flag to enable trace events. This requirement has been removed. However, the --trace-events-enabled flag may still be used and will enable the node, 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 

或者,可以使用 node:trace_events 模块启用跟踪事件:

【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' categoryconst { 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

在启用跟踪的情况下运行 Node.js 会生成日志文件,这些文件可以在 Chrome 的 chrome://tracing 标签页中打开。

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

日志文件默认名为 node_trace.${rotation}.log,其中 ${rotation} 是递增的日志轮换 ID。文件路径模式可以通过 --trace-event-file-pattern 指定,该参数接受一个模板字符串,支持 ${rotation}${pid}

【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 

为了确保在 SIGINTSIGTERMSIGBREAK 等信号事件之后日志文件能够正确生成,请确保在代码中有适当的处理程序,例如:

【To guarantee that the log file is properly generated after signal events like SIGINT, 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
}); 

追踪系统使用与 process.hrtime() 相同的时间源。 然而,trace-event 的时间戳是以微秒表示的,而 process.hrtime() 返回的是纳秒。

【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.】

该模块的功能在 Worker 线程中不可用。

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

node:trace_events 模块#>

【The node:trace_events module】

Tracing 对象#>

Tracing object】

Tracing 对象用于启用或禁用一组类别的追踪。实例是通过 trace_events.createTracing() 方法创建的。

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

创建时,Tracing 对象是禁用的。调用 tracing.enable() 方法会将类别添加到已启用的跟踪事件类别集合中。调用 tracing.disable() 将会从已启用的跟踪事件类别集合中移除这些类别。

【When created, the Tracing object is disabled. Calling the tracing.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#>

Tracing 对象所涵盖的跟踪事件类别的逗号分隔列表。

【A comma-separated list of the trace event categories covered by this Tracing object.】

tracing.disable()#>

禁用此 Tracing 对象。

【Disables this Tracing object.】

只有未被其他已启用的 Tracing 对象覆盖且未被 --trace-event-categories 标志指定的跟踪事件类别才会被禁用。

【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()#>

启用此 Tracing 对象,用于 Tracing 对象涵盖的类别集合。

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

tracing.enabled#>
  • <boolean> 仅当 Tracing 对象已启用时为 true

trace_events.createTracing(options)#>

  • options <Object>
    • categories <string[]> 跟踪类别名称的数组。数组中的值在可能的情况下会被强制转换为字符串。如果值无法被强制转换,则会抛出错误。
  • 返回:<Tracing>

为给定的 categories 创建并返回一个 Tracing 对象。

【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()#>

返回所有当前启用的跟踪事件类别的逗号分隔列表。当前启用的跟踪事件类别集合由所有当前启用的 Tracing 对象的_并集_以及使用 --trace-event-categories 标志启用的任何类别决定。

【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.】

给定下面的文件 test.js,命令 node --trace-event-categories node.perf test.js 将在控制台打印 'node.async_hooks,node.perf'

【Given the file test.js below, the command node --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('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();
Node.js 中文网 - 粤ICP备13048890号