监控系统简介:使用 Prometheus 与 Grafana
注:本文雖以 Docker 進行演示,但 Docker 并不是必須的,相關軟件也可以直接安裝到計算機上
背景
如果我們是Web應用的開發者,會對響應時間、接口的穩定性等比較敏感,在站點尚未部署到生產環境時,我們有充足的時間來進行調試、分析哪些接口需要優化。但當應用發布后,想要繼續跟蹤,可能需要通過日志記錄請求和響應時間、記錄響應狀態碼等,然后通過其它工具進行分析外,或是與其它一些分析工具進行集成。
另外現在十分流行的大屏:比如最近曝光的12306監控中心,大屏上顯示出的當日售出車票數量、移動端和Web端訂票比例、線路熱度等信息;還有每年雙十一,各大電商的大屏顯示出交易總金額、熱賣榜等等。
可以發現,上面列出的各點皆為指標:響應時間、成功率等我們可以理解為技術指標,當日售出車票數量、交易總金額等則是業務指標。當我們定義好指標后,需要有收集這些指標的方式,我們采用監控的方式來采集數據。當然,若是某些值超出了閾值,還需要及時發出警報,但這不在本文的討論范圍內了。最后再將監控到的內容進行展示(可視化),就需要用到本文的兩個主角 —— Prometheus 和 Grafana。
Prometheus
Prometheus is an open-source systems monitoring and alerting toolkit
--?Prometheus Overview
Prometheus 是一款開源的監控和警報工具包
—— 譯自?Prometheus Overview
為什么選擇 Prometheus
Prometheus 的幾大特點:
多維數據模型,時間序列數據由指標名稱和鍵/值對標識
提供能在多維度上靈活查詢的 PromQL 語言
不依賴分布式存儲,單服務器節點自治(single server nodes are autonomous)
基于 HTTP PULL(拉取)的方式采集時序數據
可通過中間網關推送時序數據
可通過服務發現或靜態配置要采集的目標服務器
支持多種圖表和儀表盤
相比 InfluxDB 等時序數據庫,Prometheus 內置了時序、監控和通知等功能。
安裝Exporter和Prometheus
首先安裝 Exporter,Exporter 將監控的各種指標以 HTTP 的方式暴露出來。這里通過 Docker 來安裝和運行
docker run -d -p 9100:9100 prom/node-exporter然后就能通過 http://localhost:9100 來訪問它,點擊下方的?Metrics?鏈接,頁面上就會將相關指標以文本的形式展示出來。
安裝 Prometheus 前需要先將配置文件準備好,新建一個?prometheus.yml?文件
global:scrape_interval: 15sscrape_configs:- job_name: prometheusstatic_configs:- targets: ['localhost:9090']labels:instance: prometheus- job_name: node_exporterstatic_configs:- targets: ['10.0.0.150:9100']labels:instance: node_exporterscrape_interval?為抓取間隔時間,下面配置了兩個 job,并以?static_configs?的方式配置了兩個目標:?localhost:9090?(后面要安裝的 Prometheus,意思是監控自己)和?10.0.0.150:9100(監控 node_exporter。注意,這里的 10.0.0.150 是計算機的內網 IP,請根據實際情況修改)
接下來安裝 Prometheus,因為?prometheus.yml?配置文件需要映射到 Docker 容器中,記得把硬盤設置為共享
docker run -d -p 9090:9090 -v "D:\docker\prometheus\prometheus.yml:/etc/prometheus/prometheus.yml" --name prometheus prom/prometheus通過瀏覽器訪問 http://localhost:9090 就能訪問 Prometheus 了,我們先看一下監控的目標是否已經上線,訪問 http://localhost:9090/targets 應該能看到 node_exporter 和 prometheus 兩個目標。State 是?Up?表示已經上線,如果是?Unknown?可以稍等一會兒再刷新。Labels 部分顯示了配置文件中配置的 job 以及 instance,后面查詢的時候會用到。
當到了抓取的時間,Prometheus 就會去訪問目標的 /metrics 頁面將相關指標采集并儲存。
指標類型
Prometheus 提供了四種指標類型
Counter?計數器,只增不減,重啟后清零。可用于記錄請求數量、已完成任務的數量、錯誤數量等。
Gauge?儀表盤,可增可減。可用于記錄當前溫度、當前內存占用值等。
Histogram?直方圖
Summary?摘要
關于直方圖和摘要,都用于統計和分析樣本的分布情況,這里引用?prometheus-book?中關于它們的介紹:
在大多數情況下人們都傾向于使用某些量化指標的平均值,例如CPU的平均使用率、頁面的平均響應時間。這種方式的問題很明顯,以系統API調用的平均響應時間為例:如果大多數API請求都維持在100ms的響應時間范圍內,而個別請求的響應時間需要5s,那么就會導致某些WEB頁面的響應時間落到中位數的情況,而這種現象被稱為長尾問題。
為了區分是平均的慢還是長尾的慢,最簡單的方式就是按照請求延遲的范圍進行分組。例如,統計延遲在0~10ms之間的請求數有多少而10~20ms之間的請求數又有多少。通過這種方式可以快速分析系統慢的原因。Histogram和Summary都是為了能夠解決這樣問題的存在,通過Histogram和Summary類型的監控指標,我們可以快速了解監控樣本的分布情況。
——?prometheus-book?使用Histogram和Summary分析數據分布情況
之前我們訪問過 http://localhost:9100/metrics 指標頁面,節選如下:
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code. # TYPE promhttp_metric_handler_requests_total counter promhttp_metric_handler_requests_total{code="200"} 162 promhttp_metric_handler_requests_total{code="500"} 0 promhttp_metric_handler_requests_total{code="503"} 0# TYPE?一行末尾體現了指標類型,非?#?開頭的行內容為:指標名稱、標簽(花括號內的部分)和樣本值。Prometheus 以時間序列的方式儲存數據,即每個樣本是按照時間順序儲存的,在 Prometheus 儲存的這些樣本內容中包含了:指標,時間戳及樣本值。
PromQL
PromQL 是 Prometheus 的查詢語言,我們訪問 http://localhost:9090 時能看到查詢頁面。在?Expression?中輸入
promhttp_metric_handler_requests_total并按下回車,可以看到這樣的結果,這段 PromQL 將該指標的指標和樣本值進行了返回
因為?node_exporter?和?prometheus?都提供了名為?promhttp_metric_handler_requests_total?的指標,若想只看?node_exporter?的該指標,則在 PromQL 中加上花括號來過濾 Labels 即可:
promhttp_metric_handler_requests_total{instance="node_exporter"}當然,PromQL 的內容遠不止這些,待日后再記錄。
Grafana
Grafana 是一款數據可視化工具,先來直觀的感受一下吧,也可以訪問 Grafana Live Demo 體驗。
好了,先來安裝 Grafana,這里映射了一個本地文件夾到容器中
docker run -d -p 3000:3000 -v "D:\docker\grafana:/var/lib/grafana" --name grafana grafana/grafana然后通過 http://localhost:3000 訪問 Grafana,默認用戶名密碼均為 admin。
首先進入 Home 頁面,選擇 Add data source 添加我們的 Prometheus 作為 Grafana 的數據源。需要注意的是,如果和我一樣使用 Docker,那么 Prometheus 的 URL 不能寫 localhost,需要填寫計算機的內網 IP 。
我們已經通過 Prometheus 采集了一批數據樣本,現在只需要添加一個新報表來呈現。在左側欄中依次選擇 Create - Dashboard,然后選擇 Add Query(如果顯示的是 Panel,把鼠標移動到 Panel Title 上,會出現菜單,選擇 Edit 來編輯它)。
將數據源(Query)修改為剛剛添加的 Prometheus 后,Metrics 中輸入和剛剛在 Prometheus 里一樣的 PromQL 語句?promhttp_metric_handler_requests_total{instance="node_exporter"}?然后按下回車,可視化的數據就生成了。
本文到此就結束了,簡單的介紹了 Prometheus 和 Grafana。后面還會介紹往 ASP.NET 中添加指標,并讓 Prometheus 來抓取,以及 PromQL 等的詳細內容。
總結
以上是生活随笔為你收集整理的监控系统简介:使用 Prometheus 与 Grafana的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在 .NET 程序万种死法中有效的生
- 下一篇: 祝福!微软 46 周年生日快乐!