文章來源:https://zhuanlan.zhihu.com/p/26981364?group_id=850365065449328641web
上一篇主要講了 StatsD + InfluxDB + Grafana 的搭建並用 Grafana 建立了兩種圖表(Graph):chrome
api 每一個接口的請求量
api 每一個接口的響應時間
這一篇主要講講兩個深刻使用 Grafana 的方式:api
如何將 Grafana 跟 ELK 緊密的結合起來
Grafana 監控報警app
在觀察 Grafana 監控時,發現某個 api 接口響應時間忽然有一個尖刺,這個時候的表情是:
工具
不過別急,我以前寫過一篇《Koa 請求日誌打點工具》講了如何打點 Koa 應用,將慢日誌收集到 ELK,能夠看到具體某個請求每一步 yield 表達式的執行耗時。那如何將 Grafana 和 ELK 中的打點日誌結合起來呢?咱們深刻研究下 Grafana,會發現一個可用的功能:Grafana 的圖表能夠添加 link,以下:測試
上圖選項的意思是:當鼠標懸浮在圖表的左上角時,會彈出一個名爲 Go to shimo 的連接,點擊會跳轉到 https://shimo.im。記住勾選上 Include time range,這是關鍵所在。ui
勾選 Include time range 會在 querystring 裏添加 from=xxx&to=xxx,並且當選取範圍時 Grafana 的 time range 格式跟 Kibana 的還不太同樣。因而我寫了一個 Chrome 插件 kibana-requestId-link,解決了兩個問題:this
一、轉換 time range 格式。即從 Grafana 帶到 Kibana 的 time range(from 和 to)轉化成 Kibana 認識的 time range,並重定向。
二、給 requestId 添加 link。點擊後跳轉到限定在相同時間範圍內經過該 requestId 查詢的結果,省了本身再粘貼複製到 Kibana 查詢一遍的過程。
該插件已發佈到 Chrome App Store,下載地址。google
安裝完插件後,咱們還須要修改初始化 Grafana 響應時間圖表的腳本,將:lua
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))" } ]
這裏有兩點須要說明:
一、url 裏默認 time:(from:now-1h,mode:quick,to:now),kibana-requestId-link 插件會將這個值替換掉。
二、query_string 裏查詢語句爲:
app:"api" AND routerName:"xxx" AND _exists_:"sumOfTake"
這裏是針對咱們業務 api 的 lucene 查詢語句。app 限定爲 api 的日誌,routerName 代表是哪一個接口,_exists_:"sumOfTake" 代表是請求最後一步的 log(由於只有慢日誌和錯誤日誌的最後一步才加了 sumOfTake 字段)。一句話解釋:查詢某個時間段內, api 某個接口的全部慢請求和錯誤請求。
舉個真實的例子,過去一小時 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 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,以下所示:
咱們正在招聘!
[[北京/武漢] 石墨文檔 作最美產品 - 尋找中國最有才華的工程師加入](https://www.v2ex.com/t/313389)