TLDR
Github: http://github.com/midwayjs/pandora, 欢迎 PR、Issue 和 Star.
Pandora.js 阿里巴巴产出的一个Node.js 应用监控管理器,可以让您对自己的 Node.js 应用了若指掌,我们的目标就是让应用可管理、可度量、可追踪。
我们自 2014 年开始使用 Node.js 并参与运维工作,Pandora.js 是淘宝 Midway 团队这些年对企业环境 Node.js 运维监控的一个沉淀与总结。在发展的过程中,我们大量使用了社区的开源软件,这次 Pandora.js 的开源是对社区的回馈。希望 Pandora.js 能让 Node.js 更好的应用在专业的商业场景上,给予它更好的基础监控运维能力去服务大规模商业场景。
同时,这也是阿里巴巴开源的第一个使用了类型系统的 Node.js 软件。它使用的是 TypeScript,为 Pandora.js 带来了前所未有的逻辑健壮性。
欢迎您来体验,同时更欢迎您基于 Pandora.js 建构您的 Node.js 运维基础设施。
什么是 Pandora.js
就像前面提到的一样,Pandora.js 是一个 Node.js 应用监控管理器。它集成了多种类型的能力诸如:监控、链路追踪、调试、进程管理等等。一个一个讲太过凌乱,这里分为几个大范畴:
- 让业务更易追踪
- 基于 Open-tracing 实现了业务链路追踪系统。
- 实时追踪每个请求链路,让每次请求不再是黑盒。在运行时直观的看出接口或页面慢在哪里、错在哪里、超时在哪里。
- 可以实时追踪多种基础中间件的用量及错误,诸如: MySQL、Mongose、Redis 等等。
- 让应用更易度量
- 实现了软件行业上通用的 Metrics 系统。
- 自带多种监控指标实现,从操作系统指标到 Node.js Runtime,从 HTTP QPS 到中间件用量。
- 支持多种监控指标类型(Metrics 类型),您可以基于这些指标类型,轻松地建构您的业务监控指标。
- 让系统更加健壮
- 故障演练扩展,可以模拟大部分基础中间件的不可以用状态。这是从淘宝多次大促中沉淀下来的断网演习工具。
- 远程调试扩展,基于 Dashboard 的能力可以实时调试您的线上进程,线上业务问题不再抓瞎。
- 让应用更易管理
- 进程管理管理能力,提供了基础的进程守护和 Cluster 能力。
- 基础服务管理能力来满足中间件管理等场景,提供了依赖管理和标准的启停接口。
- 提供了进程间通信的基础能力。
上面提到的全部能力和数据,全部通过 RESTFul 接口或文本日志透出,您可以轻松的将其集成进您的监控管理系统(为了更好的配套,在不远的将来我们也会将我们的私有监控管理平台开源)。
这样的概括还是有些枯燥与难以理解,接下来会通过 Pandora.js dashboard 的界面介绍几个主要特性,Pandora.js dashboard 是一个与 Pandora.js 相配套的单机可视化仪表。然后在文章的最后是一个可以跑起来的例子~
业务链路追踪 - 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 命令行工具:来启动和监控应用。
- Pandora.js dashboard:Pandora.js 的 单机版 GUI。
安装
您最好在 Linux 系统安装,同时 Pandora.js 依赖 Node.js >= 8.0.0 (也就是当前的 LTS 版本。我们在 macOS 上指标有部分实现也可以。如果您是 Windows 用户的话,我只能说欢迎 PR)。
- 安装 Pandora.js 命令行工具:
$ npm i pandora -g
安好后您会获得一个 pandora 命令。
- 安装 Pandora.js dashboard
$ npm i pandora-dashboard -g
然后您就可以启动 Pandora.js dashboard 了。
$ pandora start --name dashboard `pandora-dashboard-dir`
上面有个 command substitution pandora-dashboard-dir
,它是 Pandora.js 注入的一个全局命令。用来输出 Pandora.js dashboard 的目录,然后 Pandora.js 会把它当成一个普通的项目来启动。
安装完 Dashboard 之后打开 http://127.0.0.1:9081
,您可以看到 Dashboard 这个应用,这就是 Pandora.js dashborad 自己。
启动一个简单的 MySQL CRUD 的例子
我找到一个 Node.js 的 简单 MySQL CRUD 的例子来进行接下来的演示。当然我为了演示还做了一些修改。示例项目在 Github,Clone 它您也可以跑跑试试看。
在这个例子里主入口为 server.js
,在项目根目录运行下面的命令来初始化。
$ pandora init server.js
? Which type do you like to generate ? (Use arrow keys)
fork
❯ cluster
我选择了 Cluster,不过您可以选择任意一个,这两个选项的行为就像 PM2 一样。Fork 简单拉起 server.js ,而 Cluster 则用 Node.js 的 Cluster 模块启动 server.js (即 Master / Worker 模型)。
在初始化完后,将会生成一个 procfile.js
文件。这个文件用来定义项目结构,就像 PM2 的 Process file 一样。其实 procfile 就是 Process File 的简写。
然后我们运行 pandora start
来启动应用:
$ pandora start
Starting rest-crud at /xx/xxx/rest-crud
rest-crud started successfully! Run command [ pandora log rest-crud ] to get more information
先放问下 http://127.0.0.1:300/api/user
查看下简单的 CRUD 例子,稍微做点操作。
然后让我们无视 Run command [ pandora log rest-crud ]
这个提示,直接打开 http://127.0.0.1:9081/
,然后您将看到:
点击 Standard Output
按钮来查看控制台输出:
点击 Trace
查看所有的链路:
点击 Metrics
查看所有的 Metrics 指标:
这只是开始
Node.js 应用在运维方面依旧还是很薄弱,Pandora.js 所做的也只是一点点工作,帮忙开发者更加了解自己的应用,在问题来临时,不再迷惘,不再慌乱。
四年间,我们看到了 Node 的兴起,工具链的完善,也看到了应用场景的萎缩,产品的各种迭代和意外,唏嘘之余,依旧得做好分内之事,让 Node 在部门,在集团,乃至在业界都能有一些成长和突破,同时让自己看清和选择一条路,坚定的走下去。
最后,再一次欢迎您来体验,尝试基于 Pandora.js 来建构您的 Node.js 运维基础设施,让天下没有难管理的应用。
mark
来自 CNodeMD
mark 自豪地采用 CNodeJS ionic
前排支持~
祝愿和egg一样逐步发展壮大
占个位
还实现了链路追踪,我们大node越来越牛逼了,第二代PM2 感觉和alinode是竞争关系啊
@zy445566 Pandora 和 AliNode 不是一个层面的概念的,关注点不同。
@zy445566 alinode 和 pandora PM2,APM 之类的产品都不是相同层面的东西。Alinode 是和 N|Solid 及 IBM Node.js SDK 类似的产品,关注度更深度地帮助用户快速解决疑难问题。
Trace 类产品和 Alinode 只能说是互补的,Trace 对 CPU 飙高、内存泄漏、GC 问题并没有任何直接的帮助,很多系统问题不是体现在单次调用上的,而是在多次调用之间累计出来。
Trace 关注的是依赖的系统有没有问题,Alinode 关注的是自己的应用有没有问题。
Trace & Metric 这些功能在 egg 里是以插件的形式提供的,我们提供类似这样的约定,业务可以根据自己公司的情况做实现(实际情况看也是,每个公司的实现都会有不同)。那么 Egg 应用用 pandora 的好处是什么?
另外 pandora 作为一个底层的「Node.js 应用监控管理器」,为什么还会 hack Egg 的代码? https://github.com/midwayjs/pandora/blob/master/packages/hook/src/patch/EggLogger.ts#L24
Mark
本地运行的demo,简单模式下,这些追踪数据是怎么存储的?