本文主要介紹的是Prometheus采集資料,通過Grafana加上PromQL語句實作資料可視化以及通過Alertmanage實作告警推送功能。溫馨提示,本篇文章特長,2w多的文字加上幾十張圖檔,建議收藏觀看。
Prometheus 是一套開源的系統監控報警架構。它啟發于 Google 的 borgmon 監控系統,由工作在 SoundCloud 的 google 前員工在 2012 年建立,作為社群開源項目進行開發,并于 2015 年正式釋出。2016 年,Prometheus 正式加入 Cloud Native Computing Foundation,成為受歡迎度僅次于 Kubernetes 的項目。
作為新一代的監控架構,Prometheus 具有以下特點:
強大的多元度資料模型: 時間序列資料通過 metric 名和鍵值對來區分。 所有的 metrics 都可以設定任意的多元标簽。
資料模型更随意,不需要刻意設定為以點分隔的字元串。 可以對資料模型進行聚合,切割和切片操作。
支援雙精度浮點類型,标簽可以設為全unicode。 靈活而強大的查詢語句(PromQL):在同一個查詢語句,可以對多個 metrics進行乘法、加法、連接配接、取分數位等操作。
易于管理: Prometheus server是一個單獨的二進制檔案,可直接在本地工作,不依賴于分布式存儲。 高效:平均每個采樣點僅占 3.5 bytes,且一個 Prometheus server 可以處理數百萬的 metrics。 使用 pull模式采集時間序列資料,這樣不僅有利于本機測試而且可以避免有問題的伺服器推送壞的 metrics。 可以采用 push gateway 的方式把時間序列資料推送至 Prometheus server 端。 可以通過服務發現或者靜态配置去擷取監控的 targets。
有多種可視化圖形界面。 易于伸縮。 需要指出的是,由于資料采集可能會有丢失,是以 Prometheus 不适用對采集資料要 100%
準确的情形。但如果用于記錄時間序列資料,Prometheus 具有很大的查詢優勢,此外,Prometheus 适用于微服務的體系架構。
示例圖:

在選擇Prometheus作為監控工具前,要明确它的适用範圍,以及不适用的場景。 Prometheus在記錄純數值時間序列方面表現非常好。它既适用于以伺服器為中心的監控,也适用于高動态的面向服務架構的監控。 在微服務的監控上,Prometheus對多元度資料采集及查詢的支援也是特殊的優勢。 Prometheus更強調可靠性,即使在故障的情況下也能檢視系統的統計資訊。權衡利弊,以可能丢失少量資料為代價確定整個系統的可用性。是以,它不适用于對資料準确率要求100%的系統,比如實時計費系統(涉及到錢)。
Prometheus Server:
Prometheus Server是Prometheus元件中的核心部分,負責實作對監控資料的擷取,存儲以及查詢。 Prometheus Server可以通過靜态配置管理監控目标,也可以配合使用Service Discovery的方式動态管理監控目标,并從這些監控目标中擷取資料。其次Prometheus Server需要對采集到的監控資料進行存儲,Prometheus Server本身就是一個時序資料庫,将采集到的監控資料按照時間序列的方式存儲在本地磁盤當中。最後Prometheus Server對外提供了自定義的PromQL語言,實作對資料的查詢以及分析。 Prometheus Server内置的Express Browser UI,通過這個UI可以直接通過PromQL實作資料的查詢以及可視化。 Prometheus Server的聯邦叢集能力可以使其從其他的Prometheus Server執行個體中擷取資料,是以在大規模監控的情況下,可以通過聯邦叢集以及功能分區的方式對Prometheus Server進行擴充。
Exporters:
Exporter将監控資料采集的端點通過HTTP服務的形式暴露給Prometheus Server,Prometheus Server通過通路該Exporter提供的Endpoint端點,即可擷取到需要采集的監控資料。 一般來說可以将Exporter分為2類: 直接采集:這一類Exporter直接内置了對Prometheus監控的支援,比如cAdvisor,Kubernetes,Etcd,Gokit等,都直接内置了用于向Prometheus暴露監控資料的端點。 間接采集:間接采集,原有監控目标并不直接支援Prometheus,是以我們需要通過Prometheus提供的Client Library編寫該監控目标的監控采集程式。例如: Mysql Exporter,JMX Exporter,Consul Exporter等。
PushGateway:
在Prometheus Server中支援基于PromQL建立告警規則,如果滿足PromQL定義的規則,則會産生一條告警,而告警的後續處理流程則由AlertManager進行管理。在AlertManager中我們可以與郵件,Slack等等内置的通知方式進行內建,也可以通過Webhook自定義告警處理方式。
Service Discovery:
服務發現在Prometheus中是特别重要的一個部分,基于Pull模型的抓取方式,需要在Prometheus中配置大量的抓取節點資訊才可以進行資料收集。有了服務發現後,使用者通過服務發現和注冊的工具對成百上千的節點進行服務注冊,并最終将注冊中心的位址配置在Prometheus的配置檔案中,大大簡化了配置檔案的複雜程度, 也可以更好的管理各種服務。 在衆多雲平台中(AWS,OpenStack),Prometheus可以 通過平台自身的API直接自動發現運作于平台上的各種服務,并抓取他們的資訊Kubernetes掌握并管理着所有的容器以及服務資訊,那此時Prometheus隻需要與Kubernetes打交道就可以找到所有需要監控的容器以及服務對象. Consul(官方推薦)等服務發現注冊軟體 通過DNS進行服務發現 通過靜态配置檔案(在服務節點規模不大的情況下)
Prometheus UI是Prometheus内置的一個可視化管理界面,通過Prometheus UI使用者能夠輕松的了解Prometheus目前的配置,監控任務運作狀态等。 通過Graph面闆,使用者還能直接使用PromQL實時查詢監控資料。通路ServerIP:9090/graph打開WEB頁面,通過PromQL可以查詢資料,可以進行基礎的資料展示。
如下所示,查詢主機負載變化情況,可以使用關鍵字node_load1可以查詢出Prometheus采集到的主機負載的樣本資料,這些樣本資料按照時間先後順序展示,形成了主機負載随時間變化的趨勢圖表:
Grafana是一個跨平台的開源的度量分析和可視化工具,可以通過将采集的資料查詢然後可視化的展示。Grafana提供了對prometheus的友好支援,各種工具幫助你建構更加炫酷的資料可視化。
可視化:快速和靈活的用戶端圖形具有多種選項。面闆插件為許多不同的方式可視化名額和日志。
報警:可視化地為最重要的名額定義警報規則。Grafana将持續評估它們,并發送通知。
通知:警報更改狀态時,它會發出通知。接收電子郵件通知。
動态儀表盤:使用模闆變量建立動态和可重用的儀表闆,這些模闆變量作為下拉菜單出現在儀表闆頂部。
混合資料源:在同一個圖中混合不同的資料源!可以根據每個查詢指定資料源。這甚至适用于自定義資料源。
注釋:注釋來自不同資料源圖表。将滑鼠懸停在事件上可以顯示完整的事件中繼資料和标記。
過濾器:過濾器允許您動态建立新的鍵/值過濾器,這些過濾器将自動應用于使用該資料源的所有查詢。
這裡我們使用上面Prometheus使用關鍵字node_load1來使用Grafana進行可視化,點選側邊欄的加号圖示,然後單擊Dashboard點選建立,然後把剛剛Prometheus使用的查詢語句放到Metries,點選右上角的apply即可。
上面的示例中我們通過prometheus+grafana通過PromQL進行了簡單的伺服器負載的監控可視化。我們也可以通過第三方提供可視化JSON檔案來幫助我們快速實作伺服器、Elasticsearch、MYSQL等等監控。這裡我們在grafana提供的第三方dashboards的位址https://grafana.com/grafana/dashboards來下載下傳對應的json檔案然後導入到grafana實作伺服器的監控。
監控伺服器的示例圖:
除了服務端的監控,可以監控應用服務。Prometheus 監控應用的方式非常簡單,隻需要程序暴露了一個用于擷取目前監控樣本資料的 HTTP 通路位址。這樣的一個程式稱為Exporter,Exporter 的執行個體稱為一個 Target 。Prometheus 通過輪訓的方式定時從這些 Target 中擷取監控資料樣本,對于應用來講,隻需要暴露一個包含監控資料的 HTTP 通路位址即可,當然提供的資料需要滿足一定的格式,這個格式就是 Metrics 格式: metric name>{=, ...} 。label name是标簽,label value是标簽的值。
grafana監控springboot應用實作效果圖:
Prometheus以及相關元件使用的是2.x版本,Grafana使用的是7.x版本。
下載下傳位址推薦使用清華大學或華為的開源鏡像站。
下載下傳位址:
https://prometheus.io/download/
https://mirrors.tuna.tsinghua.edu.cn/grafana/
Prometheus以及相關元件百度網盤位址:
連結:https://pan.baidu.com/s/1btErwq8EyAzG2-34lwGO4w
提取碼:4nlh
将下載下傳好的Prometheus檔案解壓
輸入
然後移動到/opt/prometheus檔案夾裡面,沒有該檔案夾則建立
在prometheus-2.19.3.linux-amd64檔案夾目錄下找到prometheus.yml配置檔案并更改
prometheus.yml檔案配置如下:
在/opt/prometheus/prometheus-2.19.3.linux-amd64的目錄下輸入:
啟動成功之後,在浏覽器上輸入 ip+9090可以檢視相關資訊。
将下載下傳下來的grafana-7.1.1-1.x86_64.rpm的檔案通過apm方式安裝
輸入:
進行安裝
如果出現如下錯誤:
一個依賴包沒有安裝,需要先安裝這個依賴包,然後再安裝grafana
root使用者下啟動
啟動成功之後,在浏覽器上輸入 ip+3000可以檢視相關資訊
将下載下傳好的Alertmanager檔案解壓
啟動成功之後,在浏覽器上輸入 ip+9093可以檢視相關資訊
将下載下傳好的pushgateway檔案解壓
tar -zxvf pushgateway-1.2.0.linux-amd64.tar.gz
啟動成功之後,在浏覽器上輸入 ip+9091可以檢視相關資訊
将下載下傳好的Node_export檔案解壓
啟動成功之後,在浏覽器上輸入 ip+9100可以檢視相關資訊
Prometheus界面位址: ip+9090。
這裡我就使用圖檔加上注釋來進行講解。
內建的元件需要下載下傳對應export服務并啟動運作,并且在prometheus的配置中進行添加!
first_rules.yml的配置。
相關文檔:https://prometheus.io/docs/prometheus/latest/getting_started/
Grafanf 界面位址: ip+3000
初始賬号密碼: admin, admin
這裡我依舊用圖檔加注釋來進行講解,想必這樣會更容易了解吧。。。
1.添加資料源
2.選擇prometheus
3.點選建立儀表盤
4.點選建立
5.輸入node_load1表示語句,填寫相關資訊,點選apply完成,并将名稱儲存為Test
6.點選搜尋Test,點選就可以檢視
注:需提前添加好資料源。
1.點選左上角的加号,點選import
線上模式
位址:https://grafana.com/grafana/dashboards
離線模式
監控示例:
監控告警實作需要依賴 Alertmanager,已經相關的元件,比如上述執行個體中的監控伺服器應用的node_server元件。
需要安裝Alertmanager,這裡因為郵件發送比較簡單,是以這裡我就直接貼配置了,其中帶有xxx字元的參數是需要根據情況進行更改的。下面的企業微信告警同理。
Alertmanagers服務的alertmanager.yml的配置如下:
注: smtp_from、smtp_auth_username、to的郵箱可以填寫同一個,smtp_auth_password填寫鑒權碼,需要開啟POS3。
如果不知道怎麼開啟POS3,可以檢視我的這篇文章: https://www.cnblogs.com/xuwujing/p/10945698.html
Prometheus服務的Prometheus.yml配置如下:
注:targets如果有多個配置的話,在後面加上其他服務的節點即可。alertmanagers最好寫伺服器的ip,不然可能會出現告警資料無法發送的情況。
配置了Prometheus.yml之後,我們還需要配置告警的規則,也就是觸發條件,達到條件之後就進行觸發。我們建立一個first_rules.yml,用于檢測伺服器挂掉的時候進行發送消息
first_rules.yml告警配置:
注:job等于的服務名稱填寫Prometheus.yml配置對應的名稱,比如這裡設定的server對應Prometheus.yml配置的server。
依次啟動prometheus、altermanagers、node_server服務,檢視告警,然後停止node_export服務,等待一段時間在檢視。
和上面的示例操作基本一緻,主要是配置的差別。
1.在企業微信中建立一個應用,并得到secret、corp_id和agent_id配置。
2.然後修改alertmanager.yml配置,alertmanager.yml配置如下:
配置成功之後,操作和上述郵件發送的一緻,即可在企業微信看到如下資訊。
如果覺得上述的示例不好友好的話,我們也可以制定告警模闆。
添加告警模闆:
在alertmanagers的檔案夾下建立一個template檔案夾,然後在該檔案夾建立一個微信告警的模闆wechat.tmpl,添加如下配置:
然後再到alertmanager.yml 添加如下配置:
效果圖:
Prometheus 監控應用的方式非常簡單,隻需要程序暴露了一個用于擷取目前監控樣本資料的 HTTP 通路位址。這樣的一個程式稱為Exporter,Exporter 的執行個體稱為一個 Target 。Prometheus通過輪訓的方式定時從這些 Target 中擷取監控資料樣本,對于應用來講,隻需要暴露一個包含監控資料的 HTTP通路位址即可,當然提供的資料需要滿足一定的格式,這個格式就是 Metrics 格式: metric name>{=, ...} 。label name是标簽,label value是标簽的值。
Springboot應用實作步驟
1.在pom檔案添加
2.在代碼中添加如下配置:
3.在異常進行中添加如下記錄:
4.在prometheus的配置中添加springboot應用服務監控
5.Prometheu.yml配置如下:
規則檔案配置如下:
6.在prometheus監控即可檢視
企業微信告警效果圖:
監控的springboot項目位址:https://github.com/xuwujing/springBoot-study
Prometheus資料源的配置主要分為靜态配置和動态發現, 常用的為以下幾類:
static_configs: 靜态服務發現
file_sd_configs: 檔案服務發現
dns_sd_configs: DNS 服務發現
kubernetes_sd_configs: Kubernetes 服務發現
consul_sd_configs:Consul 服務發現(推薦使用)
file_sd_configs的方式提供簡單的接口,可以實作在單獨的配置檔案中配置拉取對象,并監視這些檔案的變化并自動加載變化。基于這個機制,我們可以自行開發程式,監控監控對象的變化自動生成配置檔案,實作監控對象的自動發現。
在prometheus檔案夾目錄下建立targets.json檔案
配置如下:
然後在prometheus目錄下新增如下配置:
這是本人整理的一些服務應用告警的配置,也歡迎大家共同讨論一些常用的相關配置。
記憶體告警設定
磁盤設定:
總量百分比設定:
檢視某一目錄的磁盤使用百分比
正規表達式來比對多個挂載點
(node_filesystem_size_bytes{mountpoint="/|/run"}-node_filesystem_free_bytes{mountpoint="/|/run"}) / node_filesystem_size_bytes{mountpoint=~"/|/run"} * 100
預計多長時間磁盤爆滿
predict_linear(node_filesystem_free_bytes {mountpoint ="/"}[1h], 43600) < 0 predict_linear(node_filesystem_free_bytes {job="node"}[1h], 43600) < 0
100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100)
(node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100
100 -
100 - (node_filesystem_free_bytes{mountpoint="/",fstype=~"ext4|xfs"} / node_filesystem_size_bytes{mountpoint="/",fstype=~"ext4|xfs"} * 100)
這段時間比較忙,ELK相關得等待一段時間在進行更新,雖然發表的部落格才對應去年整理的部落格。。。。
本篇文章準備了好久,邊整理編寫,沒想到寫了這麼多。不過感覺這樣也不錯,一次寫出來或許比分開一次次的寫對讀者而言要好上不上,畢竟不用一篇篇的去找了。
原創不易,如果感覺不錯,希望給個推薦!您的支援是我寫作的最大動力!
版權聲明:
作者:虛無境
部落格園出處:http://www.cnblogs.com/xuwujing
CSDN出處:http://blog.csdn.net/qazwsxpcm
掘金出處:https://juejin.im/user/5ae45d5bf265da0b8a6761e4
個人部落格出處:http://www.panchengming.com
如果你對生活感覺到了絕望,請不要氣餒。因為這樣隻會讓你更加絕望!
所謂的希望往往都是在絕望中萌發的,是以,請不要放棄希望!