Pandora.js 專業的 Node.js 應用監控管理器,阿里開源

guangwong發表於2018-02-23

TLDR

Github: github.com/midwayjs/pa…, 歡迎 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 應用監控管理器。它整合了多種型別的能力諸如:監控、鏈路追蹤、除錯、程式管理等等。一個一個講太過凌亂,這裡分為幾個大範疇:

  1. 讓業務更易追蹤
    • 基於 Open-tracing 實現了業務鏈路追蹤系統。
    • 實時追蹤每個請求鏈路,讓每次請求不再是黑盒。在執行時直觀的看出介面或頁面慢在哪裡、錯在哪裡、超時在哪裡。
    • 可以實時追蹤多種基礎中介軟體的用量及錯誤,諸如: MySQL、Mongose、Redis 等等。
  2. 讓應用更易度量
    • 實現了軟體行業上通用的 Metrics 系統。
    • 自帶多種監控指標實現,從作業系統指標到 Node.js Runtime,從 HTTP QPS 到中介軟體用量。
    • 支援多種監控指標型別(Metrics 型別),您可以基於這些指標型別,輕鬆地建構您的業務監控指標。
  3. 讓系統更加健壯
    • 故障演練擴充套件,可以模擬大部分基礎中介軟體的不可以用狀態。這是從淘寶多次大促中沉澱下來的斷網演習工具。
    • 遠端除錯擴充套件,基於 Dashboard 的能力可以實時除錯您的線上程式,線上業務問題不再抓瞎。
  4. 讓應用更易管理
    • 程式管理管理能力,提供了基礎的程式守護和 Cluster 能力。
    • 基礎服務管理能力來滿足中介軟體管理等場景,提供了依賴管理和標準的啟停介面。
    • 提供了程式間通訊的基礎能力。

上面提到的全部能力和資料,全部通過 RESTFul 介面或文字日誌透出,您可以輕鬆的將其整合進您的監控管理系統(為了更好的配套,在不遠的將來我們也會將我們的私有監控管理平臺開源)。

這樣的概括還是有些枯燥與難以理解,接下來會通過 Pandora.js dashboard 的介面介紹幾個主要特性,Pandora.js dashboard 是一個與 Pandora.js 相配套的單機視覺化儀表。然後在文章的最後是一個可以跑起來的例子~

業務鏈路追蹤 - Trace

鏈路追蹤是第一個要介紹的重量級特性,可以追蹤每個業務請求的全過程,在執行時直觀的看出介面或頁面慢在哪裡、錯在哪裡、超時在哪裡。

聽上去很厲害的樣子,但實際使用起來很簡單。您只需要簡單的使用 Pandora.js 來啟動您的應用,然後開啟 Pandora.js dashboard 就可以看到您的業務鏈路的全部細節:

輕鬆識別慢鏈路和錯誤鏈路

undefined | center

呼叫了,哪裡耗時多,一目瞭然

undefined | center

應用度量

預設的應用度量 - Built-in Metrics

Pandora.js 為您預設提供了近百項開箱即用的預設監控指標,讓您輕鬆的開始監控您的應用。

預設提供了,Node.js Runtime 指標,作業系統指標,HTTP Incoming 指標等等。

Node.js 指標,包含大量執行時指標

undefined | center

作業系統指標,包含 Load、CPU、記憶體、磁碟、網路、TCP 等各種指標

undefined | center

自定義的應用度量 - 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 分組:

undefined | center

當然還有更多的 Metrics 型別可以實踐,請具體參見文件

一個簡單的例子

這個例子的演示依賴兩個部件:

  1. Pandora.js 命令列工具:來啟動和監控應用。
  2. Pandora.js dashboard:Pandora.js 的 單機版 GUI。

安裝

您最好在 Linux 系統安裝,同時 Pandora.js 依賴 Node.js >= 8.0.0 (也就是當前的 LTS 版本。我們在 macOS 上指標有部分實現也可以。如果您是 Windows 使用者的話,我只能說歡迎 PR)。

  1. 安裝 Pandora.js 命令列工具:
$ npm i pandora -g
複製程式碼

安好後您會獲得一個 pandora 命令。

  1. 安裝 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/,然後您將看到:

undefined | center

點選 Standard Output 按鈕來檢視控制檯輸出:

undefined | center

點選 Trace 檢視所有的鏈路:

undefined | center

點選 Metrics 檢視所有的 Metrics 指標:

undefined | center

這只是開始

Node.js 應用在運維方面依舊還是很薄弱,Pandora.js 所做的也只是一點點工作,幫忙開發者更加了解自己的應用,在問題來臨時,不再迷惘,不再慌亂。

四年間,我們看到了 Node 的興起,工具鏈的完善,也看到了應用場景的萎縮,產品的各種迭代和意外,唏噓之餘,依舊得做好分內之事,讓 Node 在部門,在集團,乃至在業界都能有一些成長和突破,同時讓自己看清和選擇一條路,堅定的走下去。

最後,再一次歡迎您來體驗,嘗試基於 Pandora.js 來建構您的 Node.js 運維基礎設施,讓天下沒有難管理的應用。

相關文章