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
Prometheus是一個開源的完整監控解決方案,其對傳統監控系統的測試和告警模型進行了完全的顛覆,造成了基於中央化的規則計算、統一分析和告警的新模型。 相比於傳統監控系統Prometheus具備如下優勢:ios
(1)Prometheus核心部分只有一個單獨的二進制文件,不存在任何的第三方依賴(數據庫,緩存等等)。惟一須要的就是本地磁盤,所以不會有潛在級聯故障的風險。web
(2)Prometheus基於Pull模型的架構方式,能夠在任何地方(本地電腦,開發環境,測試環境)搭建咱們的監控系統。docker
(3)對於一些複雜的狀況,還可使用Prometheus服務發現(Service Discovery)的能力動態管理監控目標。數據庫
Pometheus鼓勵用戶監控服務的內部狀態,基於Prometheus豐富的Client庫,用戶能夠輕鬆的在應用程序中添加對Prometheus的支持,從而讓用戶能夠獲取服務和應用內部真正的運行狀態。apache
全部採集的監控數據均以指標(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...]:按照時間的前後順序 存儲的樣本值。
Prometheus內置了一個強大的數據查詢語言PromQL。 經過PromQL能夠實現對監控數據的、聚查詢合。同時PromQL也被應用於數據可視化(如Grafana)以及告警當中。
經過PromQL能夠輕鬆回答相似於如下問題:
(1)在過去一段時間中95%應用延遲時間的分佈範圍?
(2)預測在4小時後,磁盤空間佔用大體會是什麼狀況?
(3)CPU佔用率前5位的服務有哪些?(過濾)
對於監控系統而言,大量的監控任務必然致使有大量的數據產生。而Prometheus能夠高效地處理這些數據,對於單一Prometheus Server實例而言它能夠處理:
(1)數以百萬的監控指標
(2)每秒處理數十萬的數據點
能夠在每一個數據中心、每一個團隊運行獨立的Prometheus Sevrer。Prometheus對於聯邦集羣的支持,可讓多個Prometheus實例產生一個邏輯集羣,當單實例Prometheus Server處理的任務量過大時,經過使用功能分區(sharding)+聯邦集羣(federation)能夠對其進行擴展。
使用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等等。
Prometheus Server中自帶的Prometheus UI,能夠方便地直接對數據進行查詢,而且支持直接以圖形化的形式展現數據。同時Prometheus還提供了一個獨立的基於Ruby On Rails的Dashboard解決方案 Promdash。
最新的Grafana可視化工具也已經提供了完整的Prometheus支持,基於Grafana能夠建立更加精美的監控圖標。基於Prometheus提供的API還能夠實現本身的監控可視化UI。
一般來講當咱們須要監控一個應用程序時,通常須要該應用程序提供對相應監控系統協議的支持,所以應用程序會與所選擇的監控系統進行綁定。爲了減小這種綁定所帶來的限制,對於決策者而言要麼你就直接在應用中集成該監控系統的支持,要麼就在外部建立單獨的服務來適配不一樣的監控系統。
而對於Prometheus來講,使用Prometheus的client library的輸出格式不止支持Prometheus的格式化數據,也能夠輸出支持其它監控系統的格式化數據,好比Graphite。 所以你甚至能夠在不使用Prometheus的狀況下,採用Prometheus的client library來讓你的應用程序支持監控數據採集。
採集層分爲兩類,一類是生命週期較短的做業,還有一類是生命週期較長的做業。
1)短做業:直接經過API,在退出時間指標推送給Pushgateway。
2)長做業:Retrieval組件直接從Job或者Exporter拉取數據。
3)Prometheus Server,裏面包含了存儲引擎和計算引擎。
4)Retrieval組件爲取數組件,它會主動從Pushgateway或者Exporter拉取指標數據。
5)Service discovery,能夠動態發現要監控的目標。
6)TSDB,數據核心存儲與查詢。
7)HTTP server,對外提供HTTP服務。
應用層主要分爲兩種,一種是AlertManager,另外一種是數據可視化。
1)AlertManager
對接Pagerduty,是一套付費的監控報警系統。可實現短信報警、5分鐘無人ack打電話通知、仍然無人ack,通知值班人員Manager,Emial,發送郵件
2)數據可視化
(1)Prometheus build-in WebUI
(2)Grafana
(3)其餘基於API開發的客戶端
下載地址:https://prometheus.io/download/
Prometheus在正常狀況下是採用拉模式從產生metric的做業或者exporter(好比專門監控主機的NodeExporter)拉取監控數據。可是咱們要監控的是Flink on YARN做業,想要讓Prometheus自動發現做業的提交、結束以及自動拉取數據顯然是比較困難的。
PushGateway就是一個中轉組件,經過配置Flink on YARN做業將metric推到PushGateway,Prometheus再從PushGateway拉取就能夠了。
tar -zxvf /opt/software/monitor/pushgateway-1.4.0.linux-amd64.tar.gz -C /opt/module/
cd /opt/module
mv pushgateway-1.4.0.linux-amd64 pushgateway-1.4.0
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 &
在Prometheus的架構設計中,Prometheus Server並不直接服務監控特定的目標,其主要任務負責數據的收集,存儲而且對外提供數據查詢支持。所以爲了可以可以監控到某些東西,如主機的CPU使用率,咱們須要使用到Exporter。Prometheus週期性的從Exporter暴露的HTTP服務地址(一般是/metrics)拉取監控樣本數據。
Exporter能夠是一個相對開放的概念,其能夠是一個獨立運行的程序獨立於監控目標之外,也能夠是直接內置在監控目標中。只要可以向Prometheus提供標準格式的監控樣本數據便可。
爲了可以採集到主機的運行指標如CPU, 內存,磁盤等信息。咱們可使用Node Exporter。Node Exporter一樣採用Golang編寫,而且不存在任何的第三方依賴,只須要下載,解壓便可運行。能夠從https://prometheus.io/download/ 獲取最新的node exporter版本的二進制包。
tar -zxvf /opt/software/monitor/node_exporter-1.1.2.linux-amd64.tar.gz -C /opt/module/
cd /opt/module
mv node_exporter-1.1.2.linux-amd64 node_exporter-1.1.2
cd /opt/module
xsync node_exporter-1.1.2/
xcall "nohup /opt/module/node_exporter-1.1.2/node_exporter >node.log 2>&1 &"
Prometheus基於Golang編寫,編譯後的軟件包,不依賴於任何的第三方依賴。只須要下載對應平臺的二進制包,解壓而且添加基本的配置便可正常啓動Prometheus Server。
tar -zxvf /opt/software/monitor/prometheus-2.26.0.linux-amd64.tar.gz -C /opt/module/
cd /opt/module
mv prometheus-2.26.0.linux-amd64 prometheus-2.26.0
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上拉取數據。
nohup /opt/module/prometheus-2.26.0/prometheus --config.file=prometheus.yml > /opt/module/prometheus-2.26.0/prometheus.log 2>&1 &
1)瀏覽器輸入:http://hadoop164:9090/
2)選擇Status -> Targets
3)prometheus、pushgateway和node exporter都是up狀態,表示安裝啓動成功
Flink 提供的 Metrics 能夠在 Flink 內部收集一些指標,經過這些指標讓開發人員更好地理解做業或集羣的狀態。因爲集羣運行後很難發現內部的實際情況,跑得慢或快,是否異常等,開發人員沒法實時查看全部的 Task 日誌。好比做業很大或者有不少做業的狀況下,該如何處理?此時 Metrics 能夠很好的幫助開發人員瞭解做業的當前情況。
從Flink的源碼結構咱們能夠看到,Flink官方支持Prometheus,而且提供了對接Prometheus的jar包,很方便就能夠集成。
cd /opt/module/flink-yarn
cp plugins/metrics-prometheus/flink-metrics-prometheus-1.13.1.jar ./lib
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
/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
1)瀏覽器輸入: http://hadoop164:9090/
2)選擇一個要監控的flink指標
3)點擊執行
1)Prometheus自帶的ui圖形不夠豐富
2)Prometheus自帶的ui設置不能保存
3)Prometheus自帶ui不支持自動刷新
4)Granfana ui更真豐富
5)Granfana ui 的設置能保存, 下次直接打開就能夠查看
6)Granfana 在ui展現更專業和酷炫
官方倉庫: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
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
sudo systemctl start grafana-server
1)地址:http://hadoop164:3000/login
2)默認用戶名和免密都是admin
點擊DataSource, 能夠看到出現了Prometheus
配置儀表監控項
監控多個指標
手動一個個添加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!!!
1)使用這個比較酷炫的模板: https://grafana.com/grafana/dashboards/8919
2)複製下載連接
3)導入模板
4)查看效果圖