首頁 > 軟體

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

2021-02-18 22:00:18

隨著容器技術的迅速發展,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/
關於作者:專注於基礎平臺的專案開發。如有問題或建議,請多多賜教!
版權宣告:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。
特此宣告:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信
聲援博主:如果您覺得文章對您有幫助,可以點選文章右下角推薦一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!


IT145.com E-mail:sddin#qq.com