Easy-Monitor v3.0 Node.js Runtime 插件,输出性能日志,并且可以进行实时的运行时状态采样。
点击访问 控制台 Demo 进行体验,完整的性能监控部署文档:https://www.yuque.com/hyj1991/easy-monitor
xprofiler 插件支持三大主流操作系统:
支持的 node.js runtime 版本:
更低的版本因为在此项目创建时已经不在官方 LTS 计划中,故正常情况下不再支持。
需要在 node-v12.x
以下的版本中使用,可以使用 v1.x-staging
分支的的最新版本:1.4.0
执行如下命令安装插件
npm i xprofiler --save --xprofiler_binary_host_mirror=https://npm.taobao.org/mirrors/xprofiler
如果淘宝镜像暂时没同步的话,也可以执行阿里云镜像:
npm i xprofiler --save --xprofiler_binary_host_mirror=http://devtoolx.com/xprofiler
这里使用了
@xprofiler/node-pre-gyp
帮助开发者无需进行本地编译即可使用此插件,默认插件位于 Github Release 页面,国内访问可能较慢,你也可以自行镜像到其它位置加速安装。
在您的项目入口顶部引入即可,性能分析日志默认输出在 os.tmpdir()
下
// 推荐以模块函数形式使用
const xprofiler = require('xprofiler');
xprofiler.start();
// 这里也可以直接使用
require('xprofiler')();
此时插件会以 1min/次 的频率输出嵌入的宿主 Node.js 进程的性能日志到文件中,默认为 os.tmpdir()
目录下 xprofiler-${YYYYMMDD}.log
文件。
本插件提供方以下的可配置参数:
os.tmpdir()
60s
1
0
false
true
30
xprofiler
启动时检测错误时是否需要 throw,默认 true
enable_auto_incr_heap_limit
开启后,每次自动增加的堆上限大小,默认为 256
(MB)true
true
true
false
false
false
您可以通过环境变量或者在 JavaScript 代码中引入插件时传入配置的方式来使用这些配置,具体如下所示:
log_dir
log_interval
log_level
log_type
log_format_alinode
patch_http
patch_http_timeout
check_throw
auto_incr_heap_limit_size
enable_log_uv_handles
enable_fatal_error_hook
enable_fatal_error_report
enable_fatal_error_coredump
enable_http_profiling
enable_auto_incr_heap_limit
const xprofiler = require('xprofiler');
xprofiler.start({
log_dir: '/path/to/your/logdir', // 性能分析日志输出目录
log_interval: 120, // 采样间隔 120s
enable_log_uv_handles: false, // 不输出 uv 句柄分类详情
log_format_alinode: true, // 以 alinode 的格式输出日志
log_level: 0 // 只输出 info 日志
// 其它提供的可选配置
});
配置覆盖顺序为 用户传入参数的优先级最高,环境变量次之,简单的使用代码来表示参数覆盖规则为:
const defaultConfig = {
log_dir: os.tmpdir(),
log_interval: 60, // seconds
log_level: 1,
log_type: 0,
log_format_alinode: false,
patch_http: true,
patch_http_timeout: 30, // seconds,
check_throw: true,
auto_incr_heap_limit_size: 128 // MB,
enable_log_uv_handles: true,
enable_fatal_error_hook: true,
enable_fatal_error_report: true,
enable_fatal_error_coredump: false,
enable_http_profiling: false,
enable_auto_incr_heap_limit: false,
};
const xprofilerConfig = Object.assign({}, defaultConfig, envConfig, userConfig);
详细配置覆盖规则的测试可以参见 config.test.js
本插件按照固定的格式来输出性能分析日志,但是也目前为了兼容已有的 alinode 运行时日志,提供了对 alinode 的支持,通过 log_format_alinode: true
配置或者 XPROFILER_LOG_FORMAT_ALINODE=YES
环境变量来启用 alinode 日志。两种日志文件名区别如下:
默认的 xprofiler 和 alinode 两种日志的主要区别在日志前缀上(当然输出的部分内容也不尽相同),其中 xprofiler 日志前缀如下:
"[YYYY-MM-DD HH:mm:ss] [日志级别] [日志类型] [pid] [xprofiler 版本] 日志详情"
如果设置为 alinode 日志格式输出,日志前缀则为:
"[YYYY-MM-DD HH:mm:ss.usec] [日志级别] [日志类型] [pid] 日志详情"
插件 xprofiler 多采集一个输出日志信息时的版本,目的是方便服务端统计当前各个 xprofiler 插件版本以及当前对应的应用信息,以帮助找到负责人来推动核心插件版本的升级。
本插件和 alinode 的另一个区别是 xprofiler 默认的日志目录为 os.tmpdir()
对应的目录,而非 alinode 原生默认的 /tmp
,原因是为了兼容 windows;并且上述的 node.js api 本身已经跨平台且安全,也避免了一些容器环境下人为将 /tmp
目录映射到挂载磁盘带来的问题。
当然您也可以通过更改 log_dir
配置或者 XPROFILER_LOG_DIR
环境变量来切换日志输出的目录,只需要确保你的 node.js 应用和采集器有权限读写该目录即可。
如果您配置了 log_format_alinode: true
,即按照 alinode 的格式输出日志,那么直接使用官方提供的 agenthub 即可采集上报插件生成的日志,值得注意的是,此时需将 agenthub 的配置项 logdir
配置为插件 xprofiler 的 log_dir
对应的服务器路径。
如果全局安装 xprofiler 则可以使用 xprofctl
命令,如下所示:
npm i xprofiler -g
此命令可以对安装并启用了 xprofiler 插件的 node.js 进程进行一些操作,安装后执行 xprofctl -h
可以查看其用法:
xprofctl <action> -p <pid> [-w <thread_id>] [-t profiling_time]
命令:
xprofctl start_cpu_profiling 启动 cpu 采样
xprofctl stop_cpu_profiling 生成 cpuprofile
xprofctl start_heap_profiling 启动 heap 采样
xprofctl stop_heap_profiling 生成 heapprofile
xprofctl start_gc_profiling 启动 gc 采样
xprofctl stop_gc_profiling 生成 gcprofile
xprofctl heapdump 生成 heapsnapshot
xprofctl diag_report 生成诊断报告
xprofctl check_version 获取 xprofiler 版本号
xprofctl get_config 获取 xprofiler 配置
xprofctl set_config 设置 xprofiler 配置
选项:
-p, --pid 进程 pid [必需]
-w, --worker_thread_id 线程 id [可选]
-h, --help 显示帮助信息 [布尔]
-v, --version 显示版本号 [布尔]
示例:
xprofctl start_cpu_profiling -p 29156 触发进程 29156 开始进行 cpu 采样
xprofctl check_version -p 29156 获取进程 29156 使用的插件版本
copyright 2019
参见 文档 - 整体架构
xprofiler 每个 commit 都会通过 github actions 进行在 windows/linux/macos 下的编译以及单元测试,如果您在使用中依旧出现意外的 crash,可以反馈到 Issue 列表 进行跟踪处理。
在项目根目录下执行如下命令即可获取单元测试与代码覆盖率状况:
npm run cov
master 分支的代码覆盖率情况可以参见 codecov badge。
我们将在 review 后选择合并至本仓库内,贡献者也会加入到本项目的协作者列表中。