当前位置: 首页 > 科技观察

使用Node.js中的诊断报告快速跟踪问题

时间:2023-03-17 20:40:15 科技观察

诊断报告是Node.jsv14.x提供的稳定功能,在某些情况下会生成JSON格式的诊断报告,可用于开发、测试、生产环境。报告提供有价值的信息,包括:JavaScript和本机堆栈信息、堆统计信息、平台信息、资源使用情况等,以帮助用户快速跟踪问题。生成诊断报告提供了多种触发诊断报告的机会,包括:由API调用触发、由未捕获的异常触发、由用户信号触发以及由导致应用程序终止的致命错误触发。API触发对writeReport()方法的调用,该方法将立即生成诊断报告。只有当您需要诊断报告以获取所需信息时,才可以编写此方法。constprocess=require('process');process.report.writeReport();上报默认目录:Node.js进程当前工作目录上报默认名称:YYYYMMDD.HHMMSS.PID.SEQUENCE.txtUncaughtError程序遇到未捕获时触发捕获错误时主动触发,需要在启动服务时加上--report-uncaught-exception标志,例如:node--report-uncaught-exceptionapp.js//app.jsthrownewError('testerror')signal触发正在运行的Node.js进程在接收到特定信号后生成诊断报告。默认信号是-SIGUSR2,启动服务时也加上了--report-on-signal标志。//app.jsconsole.log(`processid:${process.pid}`)setInterval(()=>{},1000);启动服务节点--report-on-signalapp.js然后触发信号kill-SIGUSR255800会看到如下信息:processid:3512WritingNode.jsreporttofile:report.20210113.211250.3512.0.001.jsonNode.jsreportcompletedSignal-basedreportWindows系统目前不支持生成。通常不需要修改触发报告的信号。如果-SIGUSR2信号已经被用于其他目的,可以通过--report-signal标志修改,例如,在启动服务时:node--report-on-signal--report-signalSIGPIPEapp。js致命错误导致应用程序终止并在启动服务时触发--report-on-fatalerror标志。当程序中出现一些致命错误时,比如内存泄漏、Node.js运行时的内部错误等,也会触发诊断报告的生成。下面是一个触发内存泄漏的例子:constformat=bytes=>(bytes/1024/1024).toFixed(2)+'MB';constprint=()=>{constmemoryUsage=process.memoryUsage();console。log(`heapTotal:${format(memoryUsage.heapTotal)},heapUsed:${format(memoryUsage.heapUsed)}`);}consttotal=[];setInterval(()=>{total.push(newArray(20,1024,1024));print();},1000)用例分析事件循环定时器(timer)句柄信息以下代码每10秒执行一次,启动后可以通过上面提到的信号获取诊断报告。console.log(processid:${process.pid})setInterval(()=>{},1000*10);诊断报告中会有很多信息,我们需要看定时器的信息,定时器属于事件循环的其中一个阶段,所以位于libuv数组中,如下报告所示它的句柄信息is_active是active,firesInMsFromNow是多久会触发定时器,当前的例子大概需要9秒的时间来执行。"libuv":[{"type":"timer","is_active":true,"is_referenced":true,"address":"0x0000000105804100","re??peat":0,"firesInMsFromNow":9067,"expired":false}]参考资料:使用DiagnosticReport诊断工具(report-toolkit)轻松识别Node.js应用中的问题report-toolkit是IBM开发的一款用于简化Node.js诊断报告使用的工具。使用它在某些情况下,可以帮助我们快速定位问题。首先全局安装,下面的命令会生成全局可执行命令rtknpminstallreport-toolkit--globalinspect命令inspect命令用于自动发现Node.js诊断报告中潜在的问题。如果检测到问题,它会输出一条消息,可能是警告。constformat=function(bytes){return(bytes/1024/1024).toFixed(2)+'MB';};constprint=function(){constmemoryUsage=process.memoryUsage();console.log(`heapTotal:${format(memoryUsage.heapTotal)},heapUsed:${format(memoryUsage.heapUsed)}`);}consttotal=[];setInterval(function(){total.push(newArray(20*1024*1024));//Largememoryusageprint();},1000)执行node--report-on-fatalerrortest.js一段时间后会报avaScriptheapoutofmemory错误,同时会生成诊断报告,如下就是我们使用的rtk诊断工具测试结果如下:diff命令diff命令,顾名思义,就是用来比较多个报告之间的差异。诊断报告工具report-toolkit的更多使用指南,请参考report-toolkit快速入门。ReferenceNode.jsVersion14:NewDiagnosticTools,Features,andPerformanceEnhancementsEasilyidentifyproblemsinNode.jsapplicationswithDiagnosticReportIntroducingreport-toolkitforNode.jsDiagnosticReportsNode.jslatestv14.x诊断报告