使用 StatsD + InfluxDB + Grafana 搭建 Node.js 监控系统 (二)
文章來源:zhuanlan.zhihu.com/p/26981364?…
上一篇主要講了 StatsD + InfluxDB + Grafana 的搭建并用 Grafana 創建了兩種圖表(Graph):
這一篇主要講講兩個深入使用 Grafana 的方式:
Grafana + ELK
在觀察 Grafana 監控時,發現某個 api 接口響應時間突然有一個尖刺,這個時候的表情是:
不過別急,我之前寫過一篇《Koa 請求日志打點工具》講了如何打點 Koa 應用,將慢日志收集到 ELK,可以看到具體某個請求每一步 yield 表達式的執行耗時。那如何將 Grafana 和 ELK 中的打點日志結合起來呢?我們深入研究下 Grafana,會發現一個可用的功能:Grafana 的圖表可以添加 link,如下:
上圖選項的意思是:當鼠標懸浮在圖表的左上角時,會彈出一個名為 Go to shimo 的鏈接,點擊會跳轉到 shimo.im。記住勾選上 Include time range,這是關鍵所在。
Kibana-RequestId-Link
勾選 Include time range 會在 querystring 里添加 from=xxx&to=xxx,而且當選取范圍時 Grafana 的 time range 格式跟 Kibana 的還不太一樣。于是我寫了一個 Chrome 插件 kibana-requestId-link,解決了兩個問題:
該插件已發布到 Chrome App Store,下載地址。
安裝完插件后,我們還需要修改初始化 Grafana 響應時間圖表的腳本,將:
links: [] 復制代碼改為:
"links": [ { "title": "Go to kibana", "type": "absolute", "keepTime": true, "targetBlank": true, "url": "http://你的kibana地址/app/kibana#/discover?_g=(refreshInterval:(display:Off,pause:!f,value:0),time:(from:now-1h,mode:quick,to:now))&_a=(columns:!(routerName,sumOfTake,requestId),index:'logstash-*',interval:auto,query:(query_string:(analyze_wildcard:!t,query:'app:%22api%22%20AND%20routerName:%22<%= action %>%22%20AND%20_exists_:%22sumOfTake%22')),sort:!('@timestamp',asc))" } ] 復制代碼這里有兩點需要說明:
舉個真實的例子,過去一小時 file.star 這個接口的響應時間圖表:
可以看出,在 09:17 和 09:19 左右分別有一個尖刺(響應時間大于500ms),點擊 Go to kibana 跳轉到 Kibana,如下:
有兩條慢日志,且時間點和響應時間都吻合(這里沒有錯誤請求日志)。我們點擊第二條慢日志的 requestId,跳轉到如下:
可以看出從請求到來到結束執行了 18 步,大部分 step 執行時間都很短,但在 step=17 這一步執行了 1190ms,點擊左邊展開查看具體信息:
url 表明是哪個接口,fn 表明 yield 表達式是 this.me.addStarredFile(file, { individualHooks: true }),filename 表明代碼在 /data/app/api/controllers/file.js:439:4,status 是 afterYield 表明這個 yield 表達式執行的時間(beforeYield 表示上個 yield 表達式執行之后到這個 yield 表達式執行之前),take 表明執行了 1190ms。
Grafana 監控報警
Grafana v4 版本加入了報警(Alert)功能。
首先,點擊左上角圖標彈出選項菜單->Alerting->Alert List->Configure notifications。如果沒有 channel,點擊 New Channel 創建一個。創建或修改 channel 都如下所示:
Email addresses 中 email 地址以分號隔開。點擊 Send Test 測試是否能收到郵件。
注意:需要配置 Grafana 的使用郵箱地址。
回到具體的監控圖表,進入編輯頁面,有一個 Alert tab 頁,如下:
上圖選項的意思是:給 file.star 接口加一個監控報警,每 60s 檢查一次,如果過去 5m 平均響應時間大于 500ms 則發送報警郵件。Notifications 可以設置發送到哪些 channel,這里設置只發送到 admin 這個 channel,可以在 Message 里填寫詳細的描述,State history 保存了所有報警歷史。
對應的我們需要修改創建響應時間圖表的腳本,添加 alert 字段:
{ "alert": { "conditions": [ { "evaluator": { "params": [ 500 ], "type": "gt" }, "operator": { "type": "and" }, "query": { "params": [ "A", "5m", "now" ] }, "reducer": { "params": [], "type": "avg" }, "type": "query" } ], "executionErrorState": "alerting", "frequency": "60s", "handler": 1, "name": "<%= action %> 響應時間", "noDataState": "no_data", "notifications": [] }, ... "id": <%= panelId %> } 復制代碼注意:這里的 A 即之前 mean 的 refId。收到的報警郵件會帶有當前監控圖表的 screenshot,如下所示:
最后
我們正在招聘!
[北京/武漢] 石墨文檔 做最美產品 - 尋找中國最有才華的工程師加入總結
以上是生活随笔為你收集整理的使用 StatsD + InfluxDB + Grafana 搭建 Node.js 监控系统 (二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重构随笔——重构的原则
- 下一篇: Excel 【小型成绩分析系统初稿】(功