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

你認爲Node.js應用程序能夠擁有的最重要的功能是什麼? 是花哨的全文模糊匹配搜索,仍是用socket進行實時聊天呢? 你能告訴我能夠添加到Node.js應用中的最高級,最驚人和最吸引人的功能是什麼麼?javascript

想知道個人麼?高性能和不間斷服務。高性能應用程序須要作好如下三點:html

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

在第1部分,Node.js要監控的關鍵指標中,咱們討論了您應該監控的關鍵Node.js指標,以便了解應用程序的運行情況。 我還解釋了你應該避免的Node.js中的錯誤作法,例如阻塞線程和形成內存泄漏,還有一些巧妙的技巧能夠用來提升應用程序的性能,好比使用集羣模塊建立工做進程和將長時間運行的任務從主線程分離開來用獨立線程運行。java

在本文中,我將描述如何使用5種不一樣的開源工具監控Node.js應用程序。它們可能沒有像SematextDatadog那樣功能全面,但它們是開源產品,能夠徹底由本身控制。node

Appmetrics

Node應用指標監控看板顯示了運行中的Node.js應用程序的性能數據。這是一個簡單的模塊,在Node.js入口文件的頂部應用並初始化。你能夠經過在終端中運行如下命令從npm安裝。git

$ npm install appmetrics-dash
複製代碼

Appmetrics提供了一個很是易於使用的Web儀表板。爲了得到全部由應用程序建立的HTTP服務的儀表板,你須要作的是在app.js(或者以其餘命名的入口文件)文件中添加如下代碼段。github

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

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

  • CPU Profiling
  • HTTP傳入請求
  • HTTP吞吐量
  • 平均響應時間(前5名)
  • CPU
  • 內存
  • 堆(Heap)
  • 事件循環時間(Event Loop Times)
  • 環境
  • 其餘請求
  • HTTP出站請求

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

Express Status Monitor

Express.js是當前Node.js開發人員的的首選框架。 Express Status Monitor是一個很是簡單的獨立模塊,您能夠將其添加到Express應用。它公開了一個/status路由,在Socket.io和Chart.js的幫助下報告實時服務器指標。npm

從npm安裝便可。api

$ npm install express-status-monitor
複製代碼

安裝完這個模塊以後,你須要在其餘中間件或者路由以前添加它。

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

以後一旦你運行你的應用,你就能夠經過/status路由檢查你的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圖表

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
複製代碼

在程序運行時,使用壓測工具運行負載測試。

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

一旦完成運行,中止服務器和Clinic.js Doctor將打開您能夠查看的報告。

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

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方案進行包裝

性能指標對於讓用戶滿意相當重要。在本文中,我向您展現瞭如何使用5種不一樣的開源工具向Node.js應用程序添加監視。 在瞭解了本系列第1部分Node.js要監控的關鍵指標以後,添加工具來監控現實生活中的應用程序是天然的學習進程。 本系列的最後一部分將介紹使用Sematext進行生產環境下Node.js監控

若是你想查看示例代碼,這裏是一個包含全部的實例代碼 repo。你還能夠克隆下來並選擇任何工具打開。

若是你須要更多軟件的全棧可觀察性,請查看Sematext。 咱們正在推進開源咱們的產品併產生影響。

原文:Node.js Open-Source Monitoring Tools

參考資料

相關文章
相關標籤/搜索