2021-05-12 14:32:11
SpringBoot進階教學(七十一)詳解Prometheus+Grafana
隨著容器技術的迅速發展,Kubernetes已然成為大家追捧的容器叢集管理系統。Prometheus作為生態圈Cloud Native Computing Foundation(簡稱:CNCF)中的重要一員。Prometheus是一套開源的系統監控報警框架。它啟發於Google的borgmon監控系統,由工作在SoundCloud的google前員工在2012年建立,作為社群開源專案進行開發,並於2015年正式釋出。2016年,Prometheus正式加入Cloud Native Computing Foundation,成為受歡迎度僅次於Kubernetes的專案。
vPrometheus特點
作為新一代的監控框架,Prometheus具有以下特點:
1. 強大的多維度資料模型:
(1) 時間序列資料通過metric名和鍵值對來區分。
(2) 所有的metrics都可以設定任意的多維標籤。
(3) 資料模型更隨意,不需要刻意設定為以點分隔的字串。
(4) 可以對資料模型進行聚合,切割和切片操作。
(5) 支援雙精度浮點型別,標籤可以設為全unicode。
2. 靈活而強大的查詢語句(PromQL):在同一個查詢語句,可以對多個metrics進行乘法、加法、連線、取分數位等操作。
3. 易於管理: Prometheus server是一個單獨的二進位制檔案,可直接在本地工作,不依賴於分散式儲存。
4. 高效:平均每個取樣點僅佔 3.5 bytes,且一個Prometheus server可以處理數百萬的metrics。
5. 使用 pull 模式採集時間序列資料,這樣不僅有利於本機測試而且可以避免有問題的伺服器推播壞的metrics。
6. 可以採用push gateway的方式把時間序列資料推播至Prometheus server 端。
7. 可以通過服務發現或者靜態設定去獲取監控的targets。
8. 有多種視覺化圖形介面。
9. 易於伸縮。
需要指出的是,由於資料採集可能會有丟失,所以Prometheus不適用對採集資料要100%準確的情形。但如果用於記錄時間序列資料,Prometheus具有很大的查詢優勢,此外,Prometheus適用於微服務的體系架構。
vPrometheus組成及架構
Prometheus官方檔案中的架構圖:
從上圖可以看出,Prometheus的主要模組包括:Prometheus server, exporters, Pushgateway, PromQL, Alertmanager 以及圖形介面。
Prometheus生態圈中包含了多個元件,其中許多元件是可選的:
1. Prometheus Server: 用於收集和儲存時間序列資料。
2. Client Library: 使用者端庫,為需要監控的服務生成相應的metrics並暴露給Prometheus server。當Prometheus server來 pull 時,直接返回實時狀態的metrics。
3. Push Gateway: 主要用於短期的jobs。由於這類jobs存在時間較短,可能在Prometheus來pull之前就消失了。為此,這次jobs可以直接向Prometheus server端推播它們的metrics。這種方式主要用於服務層面的metrics,對於機器層面的metrices,需要使用node exporter。
4. Exporters: 用於暴露已有的第三方服務的metrics給Prometheus。
5. Alertmanager: 從Prometheus server端接收到alerts後,會進行去除重複資料,分組,並路由到對收的接受方式,發出報警。常見的接收方式有:電子郵件,pagerduty,OpsGenie, webhook等。
6. 一些其他的工具。
其大概的工作流程是:
1. Prometheus server定期從設定好的jobs或者exporters中拉metrics,或者接收來自Pushgateway發過來的metrics,或者從其他的Prometheus server中拉metrics。
2. Prometheus server在本地儲存收集到的metrics,並執行已定義好的alert.rules,記錄新的時間序列或者向Alertmanager推播警報。
3. Alertmanager根據組態檔,對接收到的警報進行處理,發出告警。
4. 在圖形介面中,視覺化採集資料。
vPrometheus相關概念
下面將對Prometheus中的資料模型,metric型別以及instance和job等概念進行介紹,以便讀者在Prometheus的設定和使用中可以有一個更好的理解。
資料模型
Prometheus中儲存的資料為時間序列,是由metric的名字和一系列的標籤(鍵值對)唯一標識的,不同的標籤則代表不同的時間序列。
- metric 名字:該名字應該具有語意,一般用於表示metric的功能,例如:httprequests_total, 表示http請求的總數。其中,metric名字由ASCII字元,數位,下劃線,以及冒號組成,且必須滿足正規表示式
[a-zA-Z:][a-zA-Z0-9_:]*
。 - 標籤:使同一個時間序列有了不同維度的識別。例如
httprequests_total{method="Get"}
表示所有http請求中的Get請求。當method="post"
時,則為新的一個metric。標籤中的鍵由ASCII字元,數位,以及下劃線組成,且必須滿足正規表示式[a-zA-Z:][a-zA-Z0-9_:]*
。 - 樣本:實際的時間序列,每個序列包括一個float64的值和一個毫秒級的時間戳。
- 格式:
{=,…}
,例如:http_requests_total{method="POST",endpoint="/api/tracks"}
。
四種Metric型別
Prometheus 使用者端庫主要提供四種主要的 metric 型別:
1. Counter一種累加的 metric,典型的應用如:請求的個數,結束的任務數, 出現的錯誤數等等。
例子:查詢 http_requests_total{method="get", job="Prometheus", handler="query"}
返回8,10秒後,再次查詢,則返回14。
2. Gauge一種常規的metric,典型的應用如:溫度,執行的goroutines的個數;可以任意加減。
例子: go_goroutines{instance="172.17.0.2″, job="Prometheus"}
返回值147,10秒後返回124。
3. Histogram可以理解為柱狀圖,典型的應用如:請求持續時間,響應大小;可以對觀察結果取樣,分組及統計。
例子:查詢 http_request_duration_microseconds_sum{job="Prometheus", handler="query"}
時,返回結果如下:
4. Summary類似於Histogram, 典型的應用如:請求持續時間,響應大小;提供觀測值的count和sum功能;提供百分位的功能,即可以按百分比劃分跟蹤結果。
instance和jobs
instance: 一個單獨scrape的目標, 一般對應於一個程序。
jobs: 一組同種型別的instances(主要用於保證可延伸性和可靠性),例如:
job和instance的關係:
job: api-server
instance 1: 1.2.3.4:5670
instance 2: 1.2.3.4:5671
instance 3: 5.6.7.8:5670
instance 4: 5.6.7.8:5671
當scrape目標時,Prometheus會自動給這個scrape的時間序列附加一些標籤以便更好的分別,例如: instance,job。
注意:以上段落均出自《Prometheus入門與實踐》, 感興趣的可以看看原文。
vPrometheus安裝
1. 下載所需映象
docker pull prom/node-exporter docker pull prom/prometheus docker pull grafana/grafana
2. 啟動node-exporter
docker run -d -p 9100:9100 -v "/proc:/host/proc:ro" -v "/sys:/host/sys:ro" -v "/:/rootfs:ro" --net="host" prom/node-exporter
3. 驗證node-exporter
url存取 http://toutou.com:9100/metrics
,效果如下:
Node exporter主要用於暴露metrics給Prometheus,其中metrics包括:cpu的負載,記憶體的使用情況,網路等。有了這些就可以做資料展示了
4. 啟動prometheus
mkdir /data/prometheus
mkdir config
cd /data/prometheus/config
vim prometheus.yml
# 全域性設定,可以被覆蓋
global:
# 預設值為 15s,用於設定每次資料收集的間隔
scrape_interval: 15s
# 估算規則的預設週期 每15秒計算一次規則
evaluation_interval: 15s
# 設定報警規則
#rule_files:
#- "first_rules.yml"
#抓取設定列表
scrape_configs:
# 一定要全域性唯一, 採集 Prometheus 自身的 metrics
- job_name: prometheus
# 靜態目標的設定
static_configs:
#這個自帶的預設監控prometheus所在機器的prometheus狀態
- targets: ['localhost:9090']
labels:
instance: prometheus
# 一定要全域性唯一, 採集 Prometheus 自身的 metrics
- job_name: linux
static_configs:
# 本機 node_exporter 的 endpoint
- targets: ['localhost:9100']
labels:
# 新新增的標籤,可以自定義
instance: toutoudemo
docker run -d
-p 9090:9090
-v /data/prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml
--name pr
prom/prometheus
5. 驗證prometheus
url存取 http://toutou.com:9090/graph
,效果如下:
vGrafana安裝
1. 上文中已經拉取了grafana的映象,這裡直接啟動即可
建立/data/app/grafana/data資料夾儲存資料,建立好了以後啟動grafana。
docker run -d
-p 3000:3000
--name=grafana
-v /data/app/grafana/data:/var/lib/grafana
grafana/grafana
我們發現執行以後,docker範例並沒有起來,於是我們用 docker logs grafana
檢視了docker紀錄檔。
[root@localhost data]# docker logs grafana
GF_PATHS_DATA='/var/lib/grafana' is not writable.
You may have issues with file permissions, more information here: http://docs.grafana.org/installation/docker/#migration-from-a-previous-version-of-the-docker-container-to-5-1-or-later
mkdir: can't create directory '/var/lib/grafana/plugins': Permission denied
因為grafana使用者會在這個目錄寫入檔案,所以需要設定許可權
2. /data/app/grafana/data設定許可權
chmod 777 -R /data/app/grafana/data
3. 驗證grafana
url存取 http://toutou.com:3000
,效果如下:
開啟之後的登入介面用預設賬號/密碼admin登入即可,會引導你修改密碼,這裡由於是本地測試的,就不設定了,直接skip跳過。
4. Add data source
點開Configuration(齒輪圖示)->Data Source,然後點選Add data source按鈕。然後選擇Prometheus則進入到Prometheus資料來源設定。
注意,access中選擇Browser,設定好Prometheus點選save & test,彈出提示"Data source is working"即可。
4. Create Dashboard
回到首頁,在建立(加號圖示)中點選Dashboard,然後點選Add new panel按鈕。然後點選Panel Title,點選標題下拉框中的Edit。
這裡我們新增記憶體和cpu資訊,點選儲存,輸入dashboard名稱---cpu&memory(自定義)。回到首頁即可看到我們儲存的cpu&memory。
vSpringboot整合Prometheus+Grafana監控
1. 新增參照
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>
2. 新增application.properties
management.endpoints.web.exposure.include=prometheus
3. 驗證效果
注意:開啟actuator後要注意要防護,開啟actuator的服務千萬不能直接對外。常見的方法可以新增一個過濾器對 /actuator
路徑過濾,只允許內網IP地址存取。
如果不知道如何在springboot過濾攔截的話,可以看看這個。傳送門:SpringBoot入門教學(十一)過濾器和攔截器
4. 部署springboot
部署好了以後,重啟docker範例,並檢視效果。
如果不知道如何部署springboot的話,可以看看這個。傳送門:SpringBoot入門教學(二)CentOS部署SpringBoot專案從0到1
5. prometheus.yml中新增job
global: # 全域性設定,可以被覆蓋 scrape_interval: 15s # 預設值為 15s,用於設定每次資料收集的間隔 external_labels: # 所有時間序列和警告與外部通訊時用的外部標籤 monitor: 'codelab-monitor' rule_files: # 警告規則設定檔案 - '/etc/prometheus/alert.rules' # 用於設定 scrape 的 endpoint 設定需要 scrape 的 targets 以及相應的引數 scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'prometheus' # 一定要全域性唯一, 採集 Prometheus 自身的 metrics # 覆蓋全域性的 scrape_interval scrape_interval: 5s static_configs: # 靜態目標的設定 - targets: ['localhost:9090'] - job_name: 'node' # 一定要全域性唯一, 採集本機的 metrics,需要在本機安裝 node_exporter scrape_interval: 10s static_configs: - targets: ['127.0.0.1:9100'] - job_name: 'hellolearn' # 一定要全域性唯一, 採集本機的 metrics,需要在本機安裝 node_exporter scrape_interval: 10s metrics_path: /actuator/prometheus #params: #format: ["prometheus"] static_configs: - targets: ['127.0.0.1:8301']
6. import模板
上文中我們已經演示瞭如何在dashboard中逐條新增指標,逐條新增就是熟悉一下指標格式。同樣的,Grafana也提供了很多功能強大的模板(更多模板可以在這找),這裡我們直接引入一個酷炫一點的模板。更多模板可以在這裡找到。
點選+號 --> Import --> 輸入模板連結或ID --> 點選Load。
Name和Unique identifier (uid)可以自定義,也可以用預設的。
點選import,效果如下:
7. 設定多個應用
若是想設定多個應用,在prometheus.yml中新增job_name,新增好了之後重啟docker即可。
- job_name: 'hellolearn' # 一定要全域性唯一, 採集本機的 metrics,需要在本機安裝 node_exporter
scrape_interval: 10s
metrics_path: /actuator/prometheus
#params:
#format: ["prometheus"]
static_configs:
- targets: ['127.0.0.1:8301']
- job_name: 'hellolearn-6' # 一定要全域性唯一, 採集本機的 metrics,需要在本機安裝 node_exporter
scrape_interval: 10s
metrics_path: /actuator/prometheus
#params:
#format: ["prometheus"]
static_configs:
- targets: ['127.0.0.1:8306']
在Grafana的dashboard直接切換即可。
其他參考/學習資料:
v原始碼地址
https://github.com/toutouge/javademosecond/tree/master/hellolearn
作 者:請叫我頭頭哥
出 處:http://www.cnblogs.com/toutou/
關於作者:專注於基礎平臺的專案開發。如有問題或建議,請多多賜教!
版權宣告:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。
特此宣告:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援博主:如果您覺得文章對您有幫助,可以點選文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!
相關文章