当你希望得知自己的Node.js 应用在生产中出现什么问题的时候,后期诊断和调试的价值也就出现了。
原文链接:https://blog.risingstack.com/post-mortem-diagnostics-debugging-node-js-at-scale/
在这篇文章,我们将研究一份node报告(Node Report****)。它将有助于你做后期诊断和调试的核心项目。
** node-report诊断模块** 这个模块的用途是生成一份人类可读的诊断总结文件;它不仅可以应用在开发阶段,也可以应用在生产阶段。
生成的报告包含以下内容:
- JavaScript及native堆栈跟踪(stack traces)
- Heap统计数据
- 系统信息
- 资源使用
- 加载库
目前为止node-report支持AIX、Linux、MacOS、SmartOS和Windows上的Node.js v4、v6及v7。
把它添加到你的项目只需要一个npm安装,如下:
你一旦把node-report加入到你的APP中,它将自动监听未处理的异常以及致命错误事件,然后引发报告的生成。另一个可以触发报告的生成的方式是在Node.js进程发送一个USR2 信号。
node-report的实际应用 异常诊断 为了简洁性考虑,假设你的某个APP中有以下的入口:
一旦触发了/exception 路由处理程序,这串代码就会引发异常。为了确保我们能够获取诊断信息,如前面所展示的那样,我们需要将node-report模块添加至APP里面。
现在让我们看看调用这个函数后将发生什么。我们的报告刚刚已经被编写进了一个文件里了。
当你打开这个文件时候,你将看到类似于下面的信息:
你可以把这部分当做是你的诊断总结的页眉,它包括:
- 导致报告生成的主要事件
- Node.js APP当初是如何启动的(node demo/exception.js)
- 使用的Node.js 是哪个版本
- 主操作系统
- node-report自身的版本
堆栈跟踪(stack traces) 报告接下来的部分包含了捕获的堆栈跟踪,不仅针对JavaScript,还有native的部分。
你在JavaScript的部分将看到:
- 堆栈跟踪(哪个function用line numbers调用了哪个)
- 发生异常的地方 在Native部分,你会看到同样的东西——只是这次在Node.js Native代码中 Heap和垃圾收集(garbage collector)指标 你可以在heap指标中看到每个堆内存heap space在报告生成的过程中是如何执行的:
- 新空间new space
- 旧空间old space
- 代码空间 code space
- 图空间 map space
- 大物空间 large object space
这些指标包括:
- 内存容量 memory size
- 提交的内存大小committed memory size
- 存储量 capacity
- 使用的量 used size
- 剩余量 available size
为了更好的了解Node.js中内存处理的操作,您可以查看以下的文章:
- 在Node.js中找到内存泄漏
- Node.js垃圾收集解释 资源使用情况 此部分包含以下指标:
- CPU 使用情况
- 驻留集(resident set size)的大小
- 关于页面错误的信息
- 以及文件系统活动
系统信息 此部分包括以下内容:
- 环境变量
- 资源限制(例如非机密档案、CPU时间或者最大存储容量)
- 加载库
针对致命错误的诊断 node-report的模块也可以在一个致命错误发生时候提供帮助,比方说你的APP内存耗尽的情况。 默认情况下,你会收到类似于下面的出错信息: 如果把这则信息单独拿出来看,它并没有多大作用。你没有上下文,也不知道APP的状态。但是有了node-report以后,它的作用就显现出来了。
首先,在生成的后期诊断总结中,你将获得一个更具描述的事件: 其次,你会得到native堆栈跟踪——它将帮你更好地了解为什么这个配置没有成功。
对阻塞操作的诊断 假设以下的循环正在阻塞你的事件循环event loop。这将是个执行过程中的噩梦。 使用了node-report以后,即使你的进程非常繁忙,你也可以通过发送USR2信号的方式来请求报告。只要你做了这步骤,你将接收到堆栈跟踪,然后在一分钟内看到你的APP都在哪里花费了时间。
node-report的应用程序接口(API) 以编程的方式触发报告生成 JavaScript API也可以触发报告的生成。这种情况和被自动触发的情况是一样的——报告将被保存在一份文件中。 关闭自动触发 如果你不想要使用引起报告生成的自动触发因素(比如说致命错误或者未捕获的异常),你可以选择退出——需要要求API及文件名可以被指定。
发个广告:基于Node.js 开发的开源APP数据分析平台 http://www.count.ly/ Countly 代表一种新类型的互动协作技术, 基于Node.js 和MongoDB数据库建立开放插件式架构的Web和移动解决方案,方便二次开发又允许公司掌握自己的数据。如果有Countly相关的技术问题,欢迎随时联系 Countly (hello@count.ly)。