Pandora.js - Node.js 应用监控管理器


MIT
跨平台
JavaScript

软件简介

Pandora.js 阿里巴巴产出的一个Node.js 应用监控管理器,可以让您对自己的 Node.js
应用了若指掌,我们的目标就是让应用可管理、可度量、可追踪。

同时,这也是阿里巴巴开源的第一个使用了类型系统的 Node.js 软件。它使用的是 TypeScript,为 Pandora.js
带来了前所未有的逻辑健壮性。

什么是 Pandora.js

就像前面提到的一样,Pandora.js 是一个 Node.js
应用监控管理器。它集成了多种类型的能力诸如:监控、链路追踪、调试、进程管理等等。一个一个讲太过凌乱,这里分为几个大范畴:

  1. 让业务更易追踪

  2. 基于 Open-tracing 实现了业务链路追踪系统。

  3. 实时追踪每个请求链路,让每次请求不再是黑盒。在运行时直观的看出接口或页面慢在哪里、错在哪里、超时在哪里。

  4. 可以实时追踪多种基础中间件的用量及错误,诸如: MySQL、Mongose、Redis 等等。

  5. 让应用更易度量

  6. 实现了软件行业上通用的 Metrics 系统。

  7. 自带多种监控指标实现,从操作系统指标到 Node.js Runtime,从 HTTP QPS 到中间件用量。

  8. 支持多种监控指标类型(Metrics 类型),您可以基于这些指标类型,轻松地建构您的业务监控指标。

  9. 让系统更加健壮

  10. 故障演练扩展,可以模拟大部分基础中间件的不可以用状态。这是从淘宝多次大促中沉淀下来的断网演习工具。

  11. 远程调试扩展,基于 Dashboard 的能力可以实时调试您的线上进程,线上业务问题不再抓瞎。

  12. 让应用更易管理

  13. 进程管理管理能力,提供了基础的进程守护和 Cluster 能力。

  14. 基础服务管理能力来满足中间件管理等场景,提供了依赖管理和标准的启停接口。

  15. 提供了进程间通信的基础能力。

上面提到的全部能力和数据,全部通过 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