Filnk實時數倉(Prometheus監控)

第 1 章 Prometheus入門

  Prometheus受啓發於Google的Brogmon監控系統(類似的Kubernetes是從Google的Brog系統演變而來),從2012年開始由前Google工程師在Soundcloud以開源軟件的形式進行研發,而且於2015年早期對外發布早期版本。前端

  2016年5月繼Kubernetes以後成爲第二個正式加入CNCF基金會的項目,同年6月正式發佈1.0版本。2017年末發佈了基於全新存儲層的2.0版本,能更好地與容器平臺、雲平臺配合。node

  Prometheus做爲新一代的雲原生監控系統,目前已經有超過650+位貢獻者參與到Prometheus的研發工做上,而且超過120+項的第三方集成。linux

1.1 Prometheus的特色

  Prometheus是一個開源的完整監控解決方案,其對傳統監控系統的測試和告警模型進行了完全的顛覆,造成了基於中央化的規則計算、統一分析和告警的新模型。 相比於傳統監控系統Prometheus具備如下優勢:ios

  1)易於使用管理

    (1)Prometheus核心部分只有一個單獨的二進制文件,不存在任何的第三方依賴(數據庫,緩存等等)。惟一須要的就是本地磁盤,所以不會有潛在級聯故障的風險。web

    (2)Prometheus基於Pull模型的架構方式,能夠在任何地方(本地電腦,開發環境,測試環境)搭建咱們的監控系統。docker

    (3)對於一些複雜的狀況,還可使用Prometheus服務發現(Service Discovery)的能力動態管理監控目標。數據庫

  2)監控服務的內部運行狀態

    Pometheus鼓勵用戶監控服務的內部狀態,基於Prometheus豐富的Client庫,用戶能夠輕鬆的在應用程序中添加對Prometheus的支持,從而讓用戶能夠獲取服務和應用內部真正的運行狀態。apache

  3)強大的數據模型

    全部採集的監控數據均以指標(metric)的形式保存在內置的時間序列數據庫當中(TSDB)。全部的樣本除了基本的指標名稱之外,還包含一組用於描述該樣本特徵的標籤。以下所示:json

http_request_status{code='200',content_path='/api/path',environment='produment'} => [value1@timestamp1,value2@timestamp2...]
http_request_status{code='200',content_path='/api/path2',environment='produment'} => [value1@timestamp1,value2@timestamp2...]

    每一條時間序列由指標名稱(Metrics Name)以及一組標籤(Labels)惟一標識。每條時間序列按照時間的前後順序存儲一系列的樣本值。vim

    (1)http_request_status:指標名稱(Metrics Name)

    (2){code='200',content_path='/api/path',environment='produment'}:表示維度的標籤,基於這些Labels咱們能夠方便地對監控數據進行聚合,過濾,裁剪。

    (3)[value1@timestamp1,value2@timestamp2...]:按照時間的前後順序 存儲的樣本值。

  4)強大的查詢語言PromQL

    Prometheus內置了一個強大的數據查詢語言PromQL。 經過PromQL能夠實現對監控數據的、聚查詢合。同時PromQL也被應用於數據可視化(如Grafana)以及告警當中。

    經過PromQL能夠輕鬆回答相似於如下問題:

    (1)在過去一段時間中95%應用延遲時間的分佈範圍?

    (2)預測在4小時後,磁盤空間佔用大體會是什麼狀況?

    (3)CPU佔用率前5位的服務有哪些?(過濾)

  5)高效

    對於監控系統而言,大量的監控任務必然致使有大量的數據產生。而Prometheus能夠高效地處理這些數據,對於單一Prometheus Server實例而言它能夠處理:

    (1)數以百萬的監控指標

    (2)每秒處理數十萬的數據點

  6)可擴展

    能夠在每一個數據中心、每一個團隊運行獨立的Prometheus Sevrer。Prometheus對於聯邦集羣的支持,可讓多個Prometheus實例產生一個邏輯集羣,當單實例Prometheus Server處理的任務量過大時,經過使用功能分區(sharding)+聯邦集羣(federation)能夠對其進行擴展。

  7)易於集成

    使用Prometheus能夠快速搭建監控服務,而且能夠很是方便地在應用程序中進行集成。目前支持:Java,JMX,Python,Go,Ruby,.Net,Node.js等等語言的客戶端SDK,基於這些SDK能夠快速讓應用程序歸入到 Prometheus的監控當中,或者開發本身的監控數據收集程序。同時這些客戶端收集的監控數據,不只僅支持 Prometheus,還能支持Graphite這些其餘的監控工具。同時Prometheus還支持與其餘的監控系統進行集成:Graphite, Statsd, Collected, Scollector, muini, Nagios等。 Prometheus社區還提供了大量第三方實現的監控數據採集支持:JMX,CloudWatch,EC2,MySQL,PostgresSQL,Haskell,Bash,SNMP,Consul,Haproxy,Mesos,Bind,CouchDB,Django,Memcached,RabbitMQ,Redis,RethinkDB,Rsyslog等等。

  8)可視化

    Prometheus Server中自帶的Prometheus UI,能夠方便地直接對數據進行查詢,而且支持直接以圖形化的形式展現數據。同時Prometheus還提供了一個獨立的基於Ruby On Rails的Dashboard解決方案 Promdash。

    最新的Grafana可視化工具也已經提供了完整的Prometheus支持,基於Grafana能夠建立更加精美的監控圖標。基於Prometheus提供的API還能夠實現本身的監控可視化UI。

  9)開放性

    一般來講當咱們須要監控一個應用程序時,通常須要該應用程序提供對相應監控系統協議的支持,所以應用程序會與所選擇的監控系統進行綁定。爲了減小這種綁定所帶來的限制,對於決策者而言要麼你就直接在應用中集成該監控系統的支持,要麼就在外部建立單獨的服務來適配不一樣的監控系統。

    而對於Prometheus來講,使用Prometheus的client library的輸出格式不止支持Prometheus的格式化數據,也能夠輸出支持其它監控系統的格式化數據,好比Graphite。 所以你甚至能夠在不使用Prometheus的狀況下,採用Prometheus的client library來讓你的應用程序支持監控數據採集。

1.2 Prometheus的架構

2.1 採集層

  採集層分爲兩類,一類是生命週期較短的做業,還有一類是生命週期較長的做業。

  1)短做業:直接經過API,在退出時間指標推送給Pushgateway。

  2)長做業:Retrieval組件直接從Job或者Exporter拉取數據。

  3)Prometheus Server,裏面包含了存儲引擎和計算引擎

  4)Retrieval組件爲取數組件,它會主動從Pushgateway或者Exporter拉取指標數據。

  5)Service discovery,能夠動態發現要監控的目標。

  6)TSDB,數據核心存儲與查詢。

  7)HTTP server,對外提供HTTP服務。

2.2 存儲計算層

2.3 應用層

  應用層主要分爲兩種,一種是AlertManager,另外一種是數據可視化。

  1)AlertManager

    對接Pagerduty,是一套付費的監控報警系統。可實現短信報警、5分鐘無人ack打電話通知、仍然無人ack,通知值班人員Manager,Emial,發送郵件

  2)數據可視化

    (1)Prometheus build-in WebUI

    (2)Grafana

    (3)其餘基於API開發的客戶端

第 2 章 Prometheus的安裝

  官網地址:https://prometheus.io/

  下載地址:https://prometheus.io/download/

2.1 安裝和配置Pushgateway

  Prometheus在正常狀況下是採用拉模式從產生metric的做業或者exporter(好比專門監控主機的NodeExporter)拉取監控數據。可是咱們要監控的是Flink on YARN做業,想要讓Prometheus自動發現做業的提交、結束以及自動拉取數據顯然是比較困難的。

  PushGateway就是一個中轉組件,經過配置Flink on YARN做業將metric推到PushGatewayPrometheus再從PushGateway拉取就能夠了。

2.2.1 解壓

tar -zxvf /opt/software/monitor/pushgateway-1.4.0.linux-amd64.tar.gz -C /opt/module/

2.2.2 修改目錄

cd /opt/module
mv pushgateway-1.4.0.linux-amd64 pushgateway-1.4.0

2.2.3 啓動Pushgateway

nohup /opt/module/pushgateway-1.4.0/pushgateway --web.listen-address 0.0.0.0:9091 >/opt/module/pushgateway-1.4.0/pushgateway.log 2>&1 &

2.2.4 查看webui:http://hadoop164:9091/#

2.2 安裝Node Explorer

  在Prometheus的架構設計中,Prometheus Server並不直接服務監控特定的目標,其主要任務負責數據的收集,存儲而且對外提供數據查詢支持。所以爲了可以可以監控到某些東西,如主機的CPU使用率,咱們須要使用到Exporter。Prometheus週期性的從Exporter暴露的HTTP服務地址(一般是/metrics)拉取監控樣本數據。

  Exporter能夠是一個相對開放的概念,其能夠是一個獨立運行的程序獨立於監控目標之外,也能夠是直接內置在監控目標中。只要可以Prometheus提供標準格式的監控樣本數據便可。

  爲了可以採集到主機的運行指標如CPU, 內存,磁盤等信息。咱們可使用Node Exporter。Node Exporter一樣採用Golang編寫,而且不存在任何的第三方依賴,只須要下載,解壓便可運行。能夠從https://prometheus.io/download/ 獲取最新的node exporter版本的二進制包。

2.2.1 解壓

tar -zxvf /opt/software/monitor/node_exporter-1.1.2.linux-amd64.tar.gz -C /opt/module/

2.2.2 修改目錄

cd /opt/module
mv node_exporter-1.1.2.linux-amd64 node_exporter-1.1.2

2.2.3 分發到其餘節點

cd /opt/module
xsync node_exporter-1.1.2/

2.2.4 三臺節點啓動Node Explorer

xcall "nohup /opt/module/node_exporter-1.1.2/node_exporter >node.log 2>&1 &"

2.2.5 webui查看啓動狀況

  1)http://hadoop162:9100/

  2)http://hadoop163:9100/

  3)http://hadoop164:9100/

2.3 Prometheus Server

  Prometheus基於Golang編寫,編譯後的軟件包,不依賴於任何的第三方依賴。只須要下載對應平臺的二進制包,解壓而且添加基本的配置便可正常啓動Prometheus Server。

2.3.1 解壓

tar -zxvf /opt/software/monitor/prometheus-2.26.0.linux-amd64.tar.gz -C /opt/module/ 

2.3.2 修改目錄名

cd /opt/module
mv prometheus-2.26.0.linux-amd64 prometheus-2.26.0

2.3.3 修改配置文件 prometheus.yml

vim /opt/module/prometheus-2.26.0/prometheus.yml

 

scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['hadoop164:9090']
  # 添加 PushGateway 監控配置
  - job_name: 'pushgateway'
    static_configs:
    - targets: ['hadoop164:9091']
      labels:
        instance: pushgateway

  # 添加 Node Exporter 監控配置
  - job_name: 'node exporter'
    static_configs:
    - targets: ['hadoop162:9100', 'hadoop163:9100', 'hadoop164:9100']
      labels:
        instance: node exporter

  配置說明:

    (1)global配置塊:控制Prometheus服務器的全局配置

    (2)scrape_interval:配置拉取數據的時間間隔,默認爲1分鐘。

    (3)evaluation_interval:規則驗證(生成alert)的時間間隔,默認爲1分鐘。

    (4)rule_files配置塊:規則配置文件

    (5)scrape_configs配置塊:配置採集目標相關, prometheus監視的目標。Prometheus自身的運行信息能夠經過HTTP訪問,因此Prometheus能夠監控本身的運行數據。

    (6)job_name:監控做業的名稱

    (7)static_configs:表示靜態目標配置,就是固定從某個target拉取數據

    (8)targets:指定監控的目標,其實就是從哪兒拉取數據。Prometheus會從http://hadoop1:9090/metrics上拉取數據。

2.3.4 啓動Prometheus

nohup /opt/module/prometheus-2.26.0/prometheus --config.file=prometheus.yml > /opt/module/prometheus-2.26.0/prometheus.log 2>&1 &

2.3.5 webui查看啓動狀況

  1)瀏覽器輸入:http://hadoop164:9090/

  2)選擇Status -> Targets

  3)prometheus、pushgateway和node exporter都是up狀態,表示安裝啓動成功

第 3 章 Flink集成Prometheus

  Flink 提供的 Metrics 能夠在 Flink 內部收集一些指標,經過這些指標讓開發人員更好地理解做業或集羣的狀態。因爲集羣運行後很難發現內部的實際情況,跑得慢或快,是否異常等,開發人員沒法實時查看全部的 Task 日誌。好比做業很大或者有不少做業的狀況下,該如何處理?此時 Metrics 能夠很好的幫助開發人員瞭解做業的當前情況。

  從Flink的源碼結構咱們能夠看到,Flink官方支持Prometheus,而且提供了對接Prometheus的jar包,很方便就能夠集成。

3.1 copy jarflink的lib目錄下

cd /opt/module/flink-yarn
cp plugins/metrics-prometheus/flink-metrics-prometheus-1.13.1.jar ./lib

3.2 修改flink配置

cd /opt/module/flink-yarn/conf
vim flink-conf.yaml
#添加以下配置與Prometheus集成
##### 與Prometheus集成配置 #####
metrics.reporter.promgateway.class: org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporter
# PushGateway的主機名與端口號
metrics.reporter.promgateway.host: hadoop164
metrics.reporter.promgateway.port: 9091
# Flink metric在前端展現的標籤(前綴)與隨機後綴
metrics.reporter.promgateway.jobName: flink-metrics
metrics.reporter.promgateway.randomJobNameSuffix: true
metrics.reporter.promgateway.deleteOnShutdown: false

3.3 運行一個Flink Job

/opt/module/flink-yarn/bin/yarn-session.sh -d
/opt/module/flink-yarn/bin/flink run -c com.yuange.flinkrealtime.app.dwd.DwdLogApp /opt/module/applog/flink-realtime-1.0-SNAPSHOT.jar

3.4 Prometheus ui監控Flink Job

  1)瀏覽器輸入: http://hadoop164:9090/

  2)選擇一個要監控的flink指標

  3)點擊執行

第 4 章 Prometheus集成Grafana

4.1 爲何須要集成Granfana

  1)Prometheus自帶的ui圖形不夠豐富

  2)Prometheus自帶的ui設置不能保存

  3)Prometheus自帶ui不支持自動刷新

  4)Granfana ui更真豐富

  5)Granfana ui 的設置能保存, 下次直接打開就能夠查看

  6)Granfana ui展現更專業和酷炫

4.2 安裝和配置Granfana

4.2.1 下載Grafana安裝包

  官方倉庫:https://dl.grafana.com/oss/release/grafana-7.4.3-1.x86_64.rpm

  國內鏡像:https://repo.huaweicloud.com/grafana/7.4.3/grafana-7.4.3-1.x86_64.rpm

wget https://repo.huaweicloud.com/grafana/7.4.3/grafana-7.4.3-1.x86_64.rpm -P /opt/software

4.2.2 安裝Grafana

  1)若是是使用的docker容器須要安裝下面的依賴(若是是虛擬機跳過這個步驟)

sudo yum install -y /sbin/service fontconfig freetype urw-fonts

  2)安裝Granfana

sudo rpm -ivh /opt/software/grafana-7.4.3-1.x86_64.rpm

4.2.3 啓動Grafana

sudo systemctl start grafana-server

4.2.4 訪問Grafana web ui

  1)地址:http://hadoop164:3000/login

  2)默認用戶名和免密都是admin

4.3 添加數據源Prometheus

  點擊DataSource, 能夠看到出現了Prometheus

4.4 手動添加DashBoard

  配置儀表監控項

  監控多個指標

 

4.5 直接添加Flink模板

  手動一個個添加Dashboard比較繁瑣,Grafana社區鼓勵用戶分享Dashboard,經過https://grafana.com/dashboards網站,能夠找到大量可直接使用的Dashboard模板。Grafana中全部的Dashboard經過JSON進行共享,下載而且導入這些JSON文件,就能夠直接使用這些已經定義好的Dashboard:

  1)進入官網,搜索Flink模板:

  2)選擇本身喜歡的模板(800+下載的這個模板相對指標較多)

  3)選中跳轉頁面後,點擊 Download JSON:

  4)上次json文件

  5)正常提交job,便可在grafana看到相關監控項的狀況。

  6)代碼裏env.execute(「做業名」),最好指定不一樣的做業名用於區分,不指定會使用默認的做業名:Flink Streaming Job,在Grafana頁面就沒法區分不一樣job!!!

4.6 添加Node Exporter模板

  1)使用這個比較酷炫的模板: https://grafana.com/grafana/dashboards/8919

  2)複製下載連接

 

  3)導入模板

  4)查看效果圖

相關文章
相關標籤/搜索