【譯】生產環境下的Node.js——開源監控工具

Make_a_decision發表於2019-06-04

你認為Node.js應用程式可以擁有的最重要的功能是什麼? 是花哨的全文模糊匹配搜尋,還是用socket進行實時聊天呢? 你能告訴我可以新增到Node.js應用中的最高階,最驚人和最吸引人的功能是什麼麼?

想知道我的麼?高效能和不間斷服務。高效能應用程式需要做好以下三點:

  1. 最短的停機時間;
  2. 可預測的資源使用率;
  3. 根據負載有效擴充套件

在第1部分,Node.js要監控的關鍵指標中,我們討論了您應該監控的關鍵Node.js指標,以便了解應用程式的執行狀況。 我還解釋了你應該避免的Node.js中的錯誤做法,例如阻塞執行緒和造成記憶體洩漏,還有一些巧妙的技巧可以用來提高應用程式的效能,比如使用叢集模組建立工作程式和將長時間執行的任務從主執行緒分離開來用獨立執行緒執行。

在本文中,我將描述如何使用5種不同的開源工具監控Node.js應用程式。它們可能沒有像SematextDatadog那樣功能全面,但它們是開源產品,可以完全由自己控制。

【譯】生產環境下的Node.js——開源監控工具

Appmetrics

Node應用指標監控看板顯示了執行中的Node.js應用程式的效能資料。這是一個簡單的模組,在Node.js入口檔案的頂部應用並初始化。你可以通過在終端中執行以下命令從npm安裝。

$ npm install appmetrics-dash
複製程式碼

Appmetrics提供了一個非常易於使用的Web儀表板。為了獲得所有由應用程式建立的HTTP服務的儀表板,你需要做的是在app.js(或者以其他命名的入口檔案)檔案中新增以下程式碼段。

// Before all other 'require' statements
require('appmetrics-dash').attach()
複製程式碼

之後你將通過這個請求路徑/appmetrics-dash中看到大量有用的指標。

  • CPU Profiling
  • HTTP傳入請求
  • HTTP吞吐量
  • 平均響應時間(前5名)
  • CPU
  • 記憶體
  • 堆(Heap)
  • 事件迴圈時間(Event Loop Times)
  • 環境
  • 其他請求
  • HTTP出站請求

此工具不僅顯示指標。它允許您直接從儀表板生成Node.js報告和堆快照(Heap Snapshots)。 除此之外,您還可以使用Flame Graphs,非常酷的開源工具。

【譯】生產環境下的Node.js——開源監控工具

Express Status Monitor

Express.js是當前Node.js開發人員的的首選框架。 Express Status Monitor是一個非常簡單的獨立模組,您可以將其新增到Express應用。它公開了一個/status路由,在Socket.io和Chart.js的幫助下報告實時伺服器指標。

從npm安裝即可。

$ npm install express-status-monitor
複製程式碼

安裝完這個模組之後,你需要在其他中介軟體或者路由之前新增它。

app.use(require('express-status-monitor')())
複製程式碼

之後一旦你執行你的應用,你就可以通過/status路由檢查你的Node.js指標。

【譯】生產環境下的Node.js——開源監控工具

Prometheus

除非你生活在原始時代,不然你一定聽說過Prometheus。這是目前我們能使用的最著名的開源監控工具。Prometheus 100%開源並由社群驅動。所有的元件在遵從Apache 2 License開源協議並可以從GitHub下載。它是由CNCF(Cloud Native Computing Foundation)管理並已經畢業成員專案之一,跟它同樣的成員專案包括KubernetesFluentd等。

要開始使用Prometheus進行監控,您需要下載最新版本並進行安裝。

$ tar xvfz prometheus-\*.tar.gz
$ cd prometheus-\*
複製程式碼

然後通過執行可執行檔案啟動它,但在執行此命令之前,需要建立一個prometheus.yml檔案。 它是一個配置檔案,用於配置在哪些targets上,通過抓取HTTP端點資料監控哪些指標。

# prometheus.yml
scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 1s
    static_configs:
      - targets: ['127.0.0.1:3000']
        labels:
          service: 'test-prom'
          group: 'production'
複製程式碼

現在你可以使用Prometheus了。

$ ./prometheus --config.file=prometheus.yml
複製程式碼

但是,我很懶,而且我非常喜歡Docker。 所以我的做法是執行官方的Prometheus Docker映象,避免下載它的所有麻煩。

Prometheus and Docker

首先,進到Node.js應用程式的根目錄。在這裡,建立一個prometheus-data目錄並將prometheus.yml檔案放入其中。完成此操作後,執行Prometheus Docker容器。

獲取正式的Prometheus Docker映象並使用docker run命令執行該映象。

$ docker run -d \
    --name prometheus \
    --network="host" \
    -v "$(pwd)/prometheus-data":/prometheus-data \
    prom/prometheus \
    --config.file=/prometheus-data/prometheus.yml
複製程式碼

我選擇使用-network =“host”執行容器,讓Prometheus容器可以通過本機localhost地址訪問,並且這樣做,Node.js應用程式的也能通過本機HTTP埠訪問到。否則,如果你將Prometheus和Node.js分別執行在容器內,則需要在兩者之間建立一個網路,以便彼此之間只能相互訪問到。

-v選項用於將prometheus-data目錄從主機對映到容器內的同名目錄。

在Prometheus容器執行後,需要在Node.js應用程式中新增配置的程式碼以暴露一個監控資料介面。 首先需要從npm安裝適用於Node.js的Prometheus客戶端

$ npm install prom-client
複製程式碼

接在新增相關Prometheus相關配置程式碼

// after all 'require' statements
const client = require('prom-client')
const collectDefaultMetrics = client.collectDefaultMetrics
collectDefaultMetrics({ timeout: 1000 })
app.get('/metrics', (req, res) => {
  res.set('Content-Type', client.register.contentType)
  res.end(client.register.metrics())
})
複製程式碼

接下來你只需執行Node.js應用之後,通過http://localhost:9090/graph就可以看到Prometheus圖表

【譯】生產環境下的Node.js——開源監控工具

Clinic.js

Clinic.js包含三個工具,可幫助診斷和查明Node.js效能問題。它的使用非常簡單。你需要做的就是從npm安裝模組並執行它。它將為您生成報告,使故障排除變得更加容易。

使用如下命令安裝Clinic.js

$ npm install clinic
複製程式碼

一旦安裝完畢,就可以選擇要生成的報告型別了。你可以選擇以下三種報告型別。

  • Doctor
    1. 通過注入探針來收集指標
    2. 評估健康和啟發式
    3. 提供修復推薦
  • Bubbleprof- 一種全新的,完全獨特的方法來分析Node.js程式碼
    1. 使用async_hooks收集指標
    2. 跟蹤操作之間的延遲
    3. 建立氣泡圖
  • Flame - 使用火焰圖揭示程式碼中的瓶頸和熱路徑
    1. 通過CPU取樣收集指標
    2. 跟蹤棧頂頻率
    3. 建立火焰圖

讓我們從執行Doctor並測試node.js應用程式開始。

$ clinic doctor -- node app.js
複製程式碼

在程式執行時,使用壓測工具執行負載測試。

【譯】生產環境下的Node.js——開源監控工具

$ loadtest -n 1000 -c 100 [http://localhost:3000/api](http://localhost:3000/api)
複製程式碼

一旦完成執行,停止伺服器和Clinic.js Doctor將開啟您可以檢視的報告。

使用相同的方法,您可以執行Bubbleprof或Flame並獲取相應工具的圖形報告。

【譯】生產環境下的Node.js——開源監控工具

【譯】生產環境下的Node.js——開源監控工具

PM2

使用PM2在生產中執行Node.js應用程式變得更加容易。 它是一個程式管理器,可以輕鬆地讓您以叢集模式執行應用程式。通俗來說,它將為您的主機每個CPU核心都生成一個程式。

首先安裝PM2

$ npm install pm2 -g
複製程式碼

安裝完成後,如果您的主原始檔是app.js,則通過在終端中執行此命令來生成PM2守護程式。

$ pm2 start app.js -i 0
複製程式碼

-i 0標誌例項個數。這將以叢集模式執行Node.js應用程式,其中數字0表示CPU核心數。你可以手動輸入你想要的任何數字,但讓PM2計算核心個數並自動產生相應個數的工作程式更簡單些。

使用PM2檢視Node.js監控資料也很容易

$ pm2 monit
複製程式碼

此命令將在終端中開啟儀表板。在這裡,您可以監視程式,日誌,迴圈延遲,程式記憶體和CPU。

【譯】生產環境下的Node.js——開源監控工具

使用開源工具將監控Node.js方案進行包裝

效能指標對於讓使用者滿意至關重要。在本文中,我向您展示瞭如何使用5種不同的開源工具向Node.js應用程式新增監視。 在瞭解了本系列第1部分Node.js要監控的關鍵指標之後,新增工具來監控現實生活中的應用程式是自然的學習程式。 本系列的最後一部分將介紹使用Sematext進行生產環境下Node.js監控

如果你想檢視示例程式碼,這裡是一個包含所有的例項程式碼 repo。你還可以克隆下來並選擇任何工具開啟。

如果你需要更多軟體的全棧可觀察性,請檢視Sematext。 我們正在推動開源我們的產品併產生影響。

原文:Node.js Open-Source Monitoring Tools

參考資料

相關文章