使用 StatsD + InfluxDB + Grafana 搭建 Node.js 监控系统 (二)
文章來源:zhuanlan.zhihu.com/p/26981364?…
上一篇主要講了 StatsD + InfluxDB + Grafana 的搭建并用 Grafana 創(chuàng)建了兩種圖表(Graph):
這一篇主要講講兩個(gè)深入使用 Grafana 的方式:
Grafana + ELK
在觀察 Grafana 監(jiān)控時(shí),發(fā)現(xiàn)某個(gè) api 接口響應(yīng)時(shí)間突然有一個(gè)尖刺,這個(gè)時(shí)候的表情是:
不過別急,我之前寫過一篇《Koa 請(qǐng)求日志打點(diǎn)工具》講了如何打點(diǎn) Koa 應(yīng)用,將慢日志收集到 ELK,可以看到具體某個(gè)請(qǐng)求每一步 yield 表達(dá)式的執(zhí)行耗時(shí)。那如何將 Grafana 和 ELK 中的打點(diǎn)日志結(jié)合起來呢?我們深入研究下 Grafana,會(huì)發(fā)現(xiàn)一個(gè)可用的功能:Grafana 的圖表可以添加 link,如下:
上圖選項(xiàng)的意思是:當(dāng)鼠標(biāo)懸浮在圖表的左上角時(shí),會(huì)彈出一個(gè)名為 Go to shimo 的鏈接,點(diǎn)擊會(huì)跳轉(zhuǎn)到 shimo.im。記住勾選上 Include time range,這是關(guān)鍵所在。
Kibana-RequestId-Link
勾選 Include time range 會(huì)在 querystring 里添加 from=xxx&to=xxx,而且當(dāng)選取范圍時(shí) Grafana 的 time range 格式跟 Kibana 的還不太一樣。于是我寫了一個(gè) Chrome 插件 kibana-requestId-link,解決了兩個(gè)問題:
該插件已發(fā)布到 Chrome App Store,下載地址。
安裝完插件后,我們還需要修改初始化 Grafana 響應(yīng)時(shí)間圖表的腳本,將:
links: [] 復(fù)制代碼改為:
"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))" } ] 復(fù)制代碼這里有兩點(diǎn)需要說明:
舉個(gè)真實(shí)的例子,過去一小時(shí) file.star 這個(gè)接口的響應(yīng)時(shí)間圖表:
可以看出,在 09:17 和 09:19 左右分別有一個(gè)尖刺(響應(yīng)時(shí)間大于500ms),點(diǎn)擊 Go to kibana 跳轉(zhuǎn)到 Kibana,如下:
有兩條慢日志,且時(shí)間點(diǎn)和響應(yīng)時(shí)間都吻合(這里沒有錯(cuò)誤請(qǐng)求日志)。我們點(diǎn)擊第二條慢日志的 requestId,跳轉(zhuǎn)到如下:
可以看出從請(qǐng)求到來到結(jié)束執(zhí)行了 18 步,大部分 step 執(zhí)行時(shí)間都很短,但在 step=17 這一步執(zhí)行了 1190ms,點(diǎn)擊左邊展開查看具體信息:
url 表明是哪個(gè)接口,fn 表明 yield 表達(dá)式是 this.me.addStarredFile(file, { individualHooks: true }),filename 表明代碼在 /data/app/api/controllers/file.js:439:4,status 是 afterYield 表明這個(gè) yield 表達(dá)式執(zhí)行的時(shí)間(beforeYield 表示上個(gè) yield 表達(dá)式執(zhí)行之后到這個(gè) yield 表達(dá)式執(zhí)行之前),take 表明執(zhí)行了 1190ms。
Grafana 監(jiān)控報(bào)警
Grafana v4 版本加入了報(bào)警(Alert)功能。
首先,點(diǎn)擊左上角圖標(biāo)彈出選項(xiàng)菜單->Alerting->Alert List->Configure notifications。如果沒有 channel,點(diǎn)擊 New Channel 創(chuàng)建一個(gè)。創(chuàng)建或修改 channel 都如下所示:
Email addresses 中 email 地址以分號(hào)隔開。點(diǎn)擊 Send Test 測(cè)試是否能收到郵件。
注意:需要配置 Grafana 的使用郵箱地址。
回到具體的監(jiān)控圖表,進(jìn)入編輯頁面,有一個(gè) Alert tab 頁,如下:
上圖選項(xiàng)的意思是:給 file.star 接口加一個(gè)監(jiān)控報(bào)警,每 60s 檢查一次,如果過去 5m 平均響應(yīng)時(shí)間大于 500ms 則發(fā)送報(bào)警郵件。Notifications 可以設(shè)置發(fā)送到哪些 channel,這里設(shè)置只發(fā)送到 admin 這個(gè) channel,可以在 Message 里填寫詳細(xì)的描述,State history 保存了所有報(bào)警歷史。
對(duì)應(yīng)的我們需要修改創(chuàng)建響應(yīng)時(shí)間圖表的腳本,添加 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 %> 響應(yīng)時(shí)間", "noDataState": "no_data", "notifications": [] }, ... "id": <%= panelId %> } 復(fù)制代碼注意:這里的 A 即之前 mean 的 refId。收到的報(bào)警郵件會(huì)帶有當(dāng)前監(jiān)控圖表的 screenshot,如下所示:
最后
我們正在招聘!
[北京/武漢] 石墨文檔 做最美產(chǎn)品 - 尋找中國最有才華的工程師加入總結(jié)
以上是生活随笔為你收集整理的使用 StatsD + InfluxDB + Grafana 搭建 Node.js 监控系统 (二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重构随笔——重构的原则
- 下一篇: Atitit 面向对象编程(OOP)、面