Pandora.jsNode.js 应用监控管理器
Pandora.js 阿里巴巴产出的一个Node.js 应用监控管理器,可以让您对自己的 Node.js 应用了若指掌,我们的目标就是让应用可管理、可度量、可追踪。
同时,这也是阿里巴巴开源的第一个使用了类型系统的 Node.js 软件。它使用的是 TypeScript,为 Pandora.js 带来了前所未有的逻辑健壮性。
什么是 Pandora.js
就像前面提到的一样,Pandora.js 是一个 Node.js 应用监控管理器。它集成了多种类型的能力诸如:监控、链路追踪、调试、进程管理等等。一个一个讲太过凌乱,这里分为几个大范畴:
-
让业务更易追踪
-
基于 Open-tracing 实现了业务链路追踪系统。
-
实时追踪每个请求链路,让每次请求不再是黑盒。在运行时直观的看出接口或页面慢在哪里、错在哪里、超时在哪里。
-
可以实时追踪多种基础中间件的用量及错误,诸如: MySQL、Mongose、Redis 等等。
-
-
让应用更易度量
-
实现了软件行业上通用的 Metrics 系统。
-
自带多种监控指标实现,从操作系统指标到 Node.js Runtime,从 HTTP QPS 到中间件用量。
-
支持多种监控指标类型(Metrics 类型),您可以基于这些指标类型,轻松地建构您的业务监控指标。
-
-
让系统更加健壮
-
故障演练扩展,可以模拟大部分基础中间件的不可以用状态。这是从淘宝多次大促中沉淀下来的断网演习工具。
-
远程调试扩展,基于 Dashboard 的能力可以实时调试您的线上进程,线上业务问题不再抓瞎。
-
-
让应用更易管理
-
进程管理管理能力,提供了基础的进程守护和 Cluster 能力。
-
基础服务管理能力来满足中间件管理等场景,提供了依赖管理和标准的启停接口。
-
提供了进程间通信的基础能力。
-
上面提到的全部能力和数据,全部通过 RESTFul 接口或文本日志透出,您可以轻松的将其集成进您的监控管理系统。
业务链路追踪 - Trace
链路追踪是第一个要介绍的重量级特性,可以追踪每个业务请求的全过程,在运行时直观的看出接口或页面慢在哪里、错在哪里、超时在哪里。
听上去很厉害的样子,但实际使用起来很简单。您只需要简单的使用 Pandora.js 来启动您的应用,然后打开 Pandora.js dashboard 就可以看到您的业务链路的全部细节:
轻松识别慢链路和错误链路
调用了,哪里耗时多,一目了然
应用度量
默认的应用度量 - Built-in Metrics
Pandora.js 为您默认提供了近百项开箱即用的默认监控指标,让您轻松的开始监控您的应用。
默认提供了,Node.js Runtime 指标,操作系统指标,HTTP Incoming 指标等等。
Node.js 指标,包含大量运行时指标
操作系统指标,包含 Load、CPU、内存、磁盘、网络、TCP 等各种指标
自定义的应用度量 - Custom Metrics
应用运行在生产环境,我们有太多想要知道和观察的数据了。以往我们都是写很多日志文件,查看分析十分麻烦。Pandora.js 的 Metrics 提供了 Gauge(瞬时)、Counter(计数)、Meter(流速)、Histogram(直方图) 等多种度量类型,您可以轻易地完成大部分的应用或业务指标。
下面是一个例子:
根据 Email 去 Gravatar 获取用户的 Profile。然后我想统计有多少次成功了,多少次失败了。(这个例子在文章后面有附上)
const {MetricsClientUtil} = require('dorapan'); // dorapan 是 pandora 的一个客户端 sdk const client = MetricsClientUtil.getMetricsClient(); // 获得 Metrics 客户端 // 创建两个 Counter (计数)类型的指标 const successCounter = client.getCounter('custom', 'custom.gravatar.success'); const failCounter = client.getCounter('custom', 'custom.gravatar.fail'); // ...此处省略若干代码 const userAvatars = {}; const promises = []; for(const user of rows) { const profileUrl = gravatar.profile_url(user.email); promises.push(urllib.request(profileUrl, { followRedirect: true, dataType: 'json' }).then((res) => { if(typeof res.data === 'object') { successCounter.inc(1); userAvatars[user.email] = res.data; } else { failCounter.inc(1); } })); } await Promise.all(promises);
可以看到 Metrics 中已经出现了 Custom 分组:
当然还有更多的 Metrics 类型可以实践,请具体参见文档。
应用管理 - 兼容常用的启动模式
Pandora.js 提供了 fork 和 cluster 两种模式来启动应用,您只需要在初始化时简单选择:
$ pandora init app.js ? Which type do you like to generate ? (Use arrow keys) fork ❯ cluster