SpringBoot進階教程(七十一)詳解Prometheus+Grafana
- 2021 年 2 月 18 日
- 筆記
- Spring Boot, springboot
隨著容器技術的迅速發展,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訪問 //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訪問 //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: //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訪問 //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源碼地址
//github.com/toutouge/javademosecond/tree/master/hellolearn
作 者:請叫我頭頭哥
出 處://www.cnblogs.com/toutou/
關於作者:專註於基礎平台的項目開發。如有問題或建議,請多多賜教!
版權聲明:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
特此聲明:所有評論和私信都會在第一時間回復。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援部落客:如果您覺得文章對您有幫助,可以點擊文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!