- 断言测试
- 异步上下文跟踪
- 异步钩子
- 缓冲(Buffer)
- C++ 插件
- 使用 Node-API 的 C/C++ 插件
- C++ 嵌入 Node环境
- 子进程(Child processes)
- 集群(Cluster)
- 命令行选项
- 控制台(Console)
- 核心包(Corepack)
- 加密(Crypto)
- 调试器(Debugger)
- 已弃用的 API
- 诊断通道(Diagnostics Channel)
- 域名系统(DNS)
- 域(Domain)
- 错误(Errors)
- 事件(Events)
- 文件系统(File system)
- 全局变量(Globals)
- HTTP
- HTTP/2
- HTTPS
- 检查器(Inspector)
- 国际化
- 模块:CommonJS 模块
- 模块:ECMAScript 模块
- 模块:
node:module
API - 模块:packages 模块
- 网络(Net)
- 系统(OS)
- 路径(Path)
- 性能挂钩(Performance hooks)
- 性能挂钩(Permissions)
- 进程(Process)
- Punycode 国际化域名编码
- 查询字符串(Query strings)
- 命令行库(Readline)
- REPL 交互式编程环境
- 诊断报告
- 单个可执行应用程序
- Stream 流
- 字符串解码器
- 单元测试
- 定时器(Timers)
- 传输层安全/SSL
- 跟踪事件
- TTY
- UDP/数据报
- URL
- 实用程序
- V8
- 虚拟机
- WebAssembly
- Web加密 API(Web Crypto API)
- 网络流 API(Web Streams API)
- 工作线程(Worker threads)
- zlib
Node.js v18.18.2 文档
- Node.js v18.18.2
- ► 目录
-
►
索引
- 断言测试
- 异步上下文跟踪
- 异步钩子
- 缓冲(Buffer)
- C++ 插件
- 使用 Node-API 的 C/C++ 插件
- C++ 嵌入 Node环境
- 子进程(Child processes)
- 集群(Cluster)
- Command-line options
- Console
- Corepack
- Crypto
- Debugger
- Deprecated APIs
- Diagnostics Channel
- DNS
- Domain
- Errors
- Events
- File system
- Globals
- HTTP
- HTTP/2
- HTTPS
- Inspector
- Internationalization
- Modules: CommonJS modules
- Modules: ECMAScript modules
- Modules:
node:module
API - Modules: Packages
- Net
- 系统(OS)
- 路径(Path)
- Performance hooks
- Permissions
- 进程(Process)
- Punycode
- Query strings
- 命令行库(Readline)
- REPL 交互式编程环境
- Report
- Single executable applications
- Stream
- String decoder
- Test runner
- Timers
- TLS/SSL
- Trace events
- TTY
- UDP/datagram
- URL
- Utilities
- V8
- VM
- WASI
- Web Crypto API
- Web Streams API
- Worker threads
- Zlib
- ► 其他版本
- ► 选项
目录
跟踪事件#
源代码: 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
:启用线程池同步操作的跟踪数据捕获,例如blob
、zlib
、crypto
和node_api
。node.threadpoolwork.async
:启用线程池异步操作的跟踪数据捕获,例如blob
、zlib
、crypto
和node_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()
方法的跟踪数据捕获。v8
:V8事件与 GC、编译和执行相关。node.http
:启用 http 请求/响应的跟踪数据捕获。
默认情况下,启用node
、node.async_hooks
和v8
类别。
node --trace-event-categories v8,node,node.async_hooks server.js
Node.js 的早期版本需要使用--trace-events-enabled
标志来启用跟踪事件。此要求已被删除。但是,
仍可以使用
--trace-events-enabled
标志,并且默认情况下会启用node
、node.async_hooks
和v8
跟踪事件类别。
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
为了确保在
SIGINT
、SIGTERM
或SIGBREAK
等信号事件之后正确生成日志文件,请确保代码中具有适当的处理程序,例如作为:
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();