隨著容器技術的迅速發展,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='https://www.cnblogs.com/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直接切換即可,

其他參考/學習資料:
- What is Prometheus?
- Collect Docker metrics with Prometheus
- Prometheus 入門與實踐
v原始碼地址
https://github.com/toutouge/javademosecond/tree/master/hellolearn
作 者:請叫我頭頭哥
出 處:http://www.cnblogs.com/toutou/
關于作者:專注于基礎平臺的專案開發,如有問題或建議,請多多賜教!
著作權宣告:本文著作權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文鏈接,
特此宣告:所有評論和私信都會在第一時間回復,也歡迎園子的大大們指正錯誤,共同進步,或者直接私信我
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角【推薦】一下,您的鼓勵是作者堅持原創和持續寫作的最大動力!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/260877.html
標籤:其他
