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官方文檔中的架構圖:

SpringBoot進階教程(七十一)詳解Prometheus+Grafana

從上圖可以看出,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"} 時,返回結果如下:

SpringBoot進階教程(七十一)詳解Prometheus+Grafana

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 ,效果如下:

SpringBoot進階教程(七十一)詳解Prometheus+Grafana

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 ,效果如下:

SpringBoot進階教程(七十一)詳解Prometheus+Grafana

SpringBoot進階教程(七十一)詳解Prometheus+Grafana

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 ,效果如下:

SpringBoot進階教程(七十一)詳解Prometheus+Grafana

打開之後的登錄介面用默認帳號/密碼admin登錄即可,會引導你修改密碼,這裡由於是本地測試的,就不設置了,直接skip跳過。

4. Add data source

點開Configuration(齒輪圖標)->Data Source,然後點擊Add data source按鈕。然後選擇Prometheus則進入到Prometheus數據源配置。

SpringBoot進階教程(七十一)詳解Prometheus+Grafana

 

 

 SpringBoot進階教程(七十一)詳解Prometheus+Grafana

注意,access中選擇Browser,配置好Prometheus點擊save & test,彈出提示”Data source is working”即可。

4. Create Dashboard

回到首頁,在創建(加號圖標)中點擊Dashboard,然後點擊Add new panel按鈕。然後點擊Panel Title,點擊標題下拉框中的Edit。

SpringBoot進階教程(七十一)詳解Prometheus+Grafana

 

 

 SpringBoot進階教程(七十一)詳解Prometheus+Grafana

這裡我們添加記憶體和cpu資訊,點擊保存,輸入dashboard名稱—cpu&memory(自定義)。回到首頁即可看到我們保存的cpu&memory。

SpringBoot進階教程(七十一)詳解Prometheus+Grafana

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. 驗證效果

SpringBoot進階教程(七十一)詳解Prometheus+Grafana

注意:開啟actuator後要注意要防護,開啟actuator的服務千萬不能直接對外。常見的方法可以新增一個過濾器對 /actuator 路徑過濾,只允許內網IP地址訪問。

如果不知道如何在springboot過濾攔截的話,可以看看這個。傳送門:SpringBoot入門教程(十一)過濾器和攔截器

4. 部署springboot

部署好了以後,重啟docker實例,並查看效果。

如果不知道如何部署springboot的話,可以看看這個。傳送門:SpringBoot入門教程(二)CentOS部署SpringBoot項目從0到1

SpringBoot進階教程(七十一)詳解Prometheus+Grafana

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']

SpringBoot進階教程(七十一)詳解Prometheus+Grafana

6. import模板

上文中我們已經演示了如何在dashboard中逐條添加指標,逐條添加就是熟悉一下指標格式。同樣的,Grafana也提供了很多功能強大的模板(更多模板可以在這找),這裡我們直接引入一個酷炫一點的模板。更多模板可以在這裡找到。

SpringBoot進階教程(七十一)詳解Prometheus+Grafana

 

SpringBoot進階教程(七十一)詳解Prometheus+Grafana

點擊+號 –> Import –> 輸入模板鏈接或ID –> 點擊Load。

SpringBoot進階教程(七十一)詳解Prometheus+Grafana

 

 SpringBoot進階教程(七十一)詳解Prometheus+Grafana

Name和Unique identifier (uid)可以自定義,也可以用默認的。

點擊import,效果如下:

SpringBoot進階教程(七十一)詳解Prometheus+Grafana

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直接切換即可。

SpringBoot進階教程(七十一)詳解Prometheus+Grafana

其他參考/學習資料:

v源碼地址

//github.com/toutouge/javademosecond/tree/master/hellolearn

作  者:請叫我頭頭哥

出  處://www.cnblogs.com/toutou/

關於作者:專註於基礎平台的項目開發。如有問題或建議,請多多賜教!

版權聲明:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。

特此聲明:所有評論和私信都會在第一時間回復。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信

聲援部落客:如果您覺得文章對您有幫助,可以點擊文章右下角推薦一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!