Node.js v18.18.2 文档


目录

跟踪事件#

稳定性:1 - 实验性

源代码: lib/trace_events.js

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

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

可用的类别有:

  • 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:仅允许捕获 Performance API 用户计时测量和标记。
    • node.perf.timerify:仅启用 Performance API 定时器测量的捕获。
  • node.promises.rejections:启用跟踪数据的捕获,跟踪未处理的 Promise 拒绝和拒绝后处理的数量。
  • node.vm.script :启用node:vm模块的 runInNewContext()runInContext()runInThisContext()方法的跟踪数据捕获。
  • v8V8事件与 GC、编译和执行相关。
  • node.http:启用 http 请求/响应的跟踪数据捕获。

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

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

Node.js 的早期版本需要使用--trace-events-enabled 标志来启用跟踪事件。此要求已被删除。但是, 仍可以使用 --trace-events-enabled标志,并且默认情况下会启用nodenode.async_hooksv8跟踪事件类别。

node --trace-events-enabled

# is equivalent to

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

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

const trace_events = require('node:trace_events');
const tracing = trace_events.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 选项卡中打开的日志文件。

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

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

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

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

跟踪系统使用与process.hrtime()使用的时间源相同的时间源。然而,跟踪事件时间戳以微秒表示,与返回纳秒的process.hrtime()不同。

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

node:trace_events模块#

Tracing对象#

Tracing对象用于启用或禁用对类别集的跟踪。实例是使用trace_events.createTracing() 方法创建的。

创建后,Tracing对象将被禁用。调用 tracing.enable()方法将类别添加到启用的跟踪事件类别集中。调用tracing.disable()将从启用的跟踪事件类别集中删除类别。

tracing.categories#

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

tracing.disable()#

禁用此Tracing对象。

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

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

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

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

// Prints 'node,v8'
console.log(trace_events.getEnabledCategories()); 
tracing.enable()#

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

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

trace_events.createTracing(options)#

  • options <对象>
    • categories <string[]>跟踪类别名称数组。如果可能,数组中包含的值将被强制转换为字符串。如果无法强制转换该值,则会抛出错误。
  • 返回:<跟踪>

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

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

trace_events.getEnabledCategories()#

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

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

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

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

console.log(trace_events.getEnabledCategories()); 

例子#

由检查员收集跟踪事件数据#

'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(); 

NodeJS中文文档为Read dev Docs平台提供托管,中文NodeJS文档均由英文版NodeJS文档翻译,版权属于nodejs.org