使用 StatsD + InfluxDB + Grafana 搭建 Node.js 監控系統 (二)

文章來源:https://zhuanlan.zhihu.com/p/26981364?group_id=850365065449328641web

上一篇主要講了 StatsD + InfluxDB + Grafana 的搭建並用 Grafana 建立了兩種圖表(Graph):chrome

api 每一個接口的請求量
api 每一個接口的響應時間
這一篇主要講講兩個深刻使用 Grafana 的方式:api

如何將 Grafana 跟 ELK 緊密的結合起來
Grafana 監控報警app

Grafana + ELK

在觀察 Grafana 監控時,發現某個 api 接口響應時間忽然有一個尖刺,這個時候的表情是:
tupian1工具

不過別急,我以前寫過一篇《Koa 請求日誌打點工具》講了如何打點 Koa 應用,將慢日誌收集到 ELK,能夠看到具體某個請求每一步 yield 表達式的執行耗時。那如何將 Grafana 和 ELK 中的打點日誌結合起來呢?咱們深刻研究下 Grafana,會發現一個可用的功能:Grafana 的圖表能夠添加 link,以下:測試

tupian2

上圖選項的意思是:當鼠標懸浮在圖表的左上角時,會彈出一個名爲 Go to shimo 的連接,點擊會跳轉到 https://shimo.im。記住勾選上 Include time range,這是關鍵所在。ui

Kibana-RequestId-Link

勾選 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 這個接口的響應時間圖表:

tupian3

能夠看出,在 09:17 和 09:19 左右分別有一個尖刺(響應時間大於500ms),點擊 Go to kibana 跳轉到 Kibana,以下:

tupian4

有兩條慢日誌,且時間點和響應時間都吻合(這裏沒有錯誤請求日誌)。咱們點擊第二條慢日誌的 requestId,跳轉到以下:

tupian5

能夠看出從請求到來到結束執行了 18 步,大部分 step 執行時間都很短,但在 step=17 這一步執行了 1190ms,點擊左邊展開查看具體信息:

tupian6

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 都以下所示:

tupian7

Email addresses 中 email 地址以分號隔開。點擊 Send Test 測試是否能收到郵件。

注意:須要配置 Grafana 的使用郵箱地址。

回到具體的監控圖表,進入編輯頁面,有一個 Alert tab 頁,以下:

tupian8

上圖選項的意思是:給 file.star 接口加一個監控報警,每 60s 檢查一次,若是過去 5m 平均響應時間大於 500ms 則發送報警郵件。Notifications 能夠設置發送到哪些 channel,這裏設置只發送到 admin 這個 channel,能夠在 Message 裏填寫詳細的描述,State history 保存了全部報警歷史。

tupian9

對應的咱們須要修改建立響應時間圖表的腳本,添加 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,以下所示:

tupian10

最後

咱們正在招聘!

[[北京/武漢] 石墨文檔 作最美產品 - 尋找中國最有才華的工程師加入](https://www.v2ex.com/t/313389)

相關文章
相關標籤/搜索