【译文】Node.js的后期诊断和调试
发布于 7 年前 作者 waiterjames 2885 次浏览 来自 分享

当你希望得知自己的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安装,如下: image.png

你一旦把node-report加入到你的APP中,它将自动监听未处理的异常以及致命错误事件,然后引发报告的生成。另一个可以触发报告的生成的方式是在Node.js进程发送一个USR2 信号。

node-report的实际应用 异常诊断 为了简洁性考虑,假设你的某个APP中有以下的入口: image.png

一旦触发了/exception 路由处理程序,这串代码就会引发异常。为了确保我们能够获取诊断信息,如前面所展示的那样,我们需要将node-report模块添加至APP里面。 image.png

现在让我们看看调用这个函数后将发生什么。我们的报告刚刚已经被编写进了一个文件里了。 image.png

当你打开这个文件时候,你将看到类似于下面的信息: image.png

你可以把这部分当做是你的诊断总结的页眉,它包括:

  • 导致报告生成的主要事件
  • Node.js APP当初是如何启动的(node demo/exception.js)
  • 使用的Node.js 是哪个版本
  • 主操作系统
  • node-report自身的版本

堆栈跟踪(stack traces) 报告接下来的部分包含了捕获的堆栈跟踪,不仅针对JavaScript,还有native的部分。 image.png

你在JavaScript的部分将看到:

  • 堆栈跟踪(哪个function用line numbers调用了哪个)
  • 发生异常的地方 在Native部分,你会看到同样的东西——只是这次在Node.js Native代码中 image.png 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中内存处理的操作,您可以查看以下的文章:

系统信息 此部分包括以下内容:

  • 环境变量
  • 资源限制(例如非机密档案、CPU时间或者最大存储容量)
  • 加载库

针对致命错误的诊断 node-report的模块也可以在一个致命错误发生时候提供帮助,比方说你的APP内存耗尽的情况。 默认情况下,你会收到类似于下面的出错信息: image.png 如果把这则信息单独拿出来看,它并没有多大作用。你没有上下文,也不知道APP的状态。但是有了node-report以后,它的作用就显现出来了。

首先,在生成的后期诊断总结中,你将获得一个更具描述的事件: image.png 其次,你会得到native堆栈跟踪——它将帮你更好地了解为什么这个配置没有成功。

对阻塞操作的诊断 假设以下的循环正在阻塞你的事件循环event loop。这将是个执行过程中的噩梦。 image.png 使用了node-report以后,即使你的进程非常繁忙,你也可以通过发送USR2信号的方式来请求报告。只要你做了这步骤,你将接收到堆栈跟踪,然后在一分钟内看到你的APP都在哪里花费了时间。

node-report的应用程序接口(API) 以编程的方式触发报告生成 JavaScript API也可以触发报告的生成。这种情况和被自动触发的情况是一样的——报告将被保存在一份文件中。 image.png 关闭自动触发 如果你不想要使用引起报告生成的自动触发因素(比如说致命错误或者未捕获的异常),你可以选择退出——需要要求API及文件名可以被指定。

image.png

1 回复

发个广告:基于Node.js 开发的开源APP数据分析平台 http://www.count.ly/ Countly 代表一种新类型的互动协作技术, 基于Node.js 和MongoDB数据库建立开放插件式架构的Web和移动解决方案,方便二次开发又允许公司掌握自己的数据。如果有Countly相关的技术问题,欢迎随时联系 Countly (hello@count.ly)。

回到顶部