一、Prometheus是什么
Prometheus中文發音為普羅米修斯,它可以使用各種數學算法實現強大的監控需求,並且原生支持K8S的服務發現,能監控容器的動態變化。結合Grafana繪出漂亮圖形,最終使用alertmanager或Grafana實現報警。它與其他監控相比有以下主要優勢:數據格式是Key/Value形式,簡單、速度快;監控數據的精細程度是絕對的領先,達到秒級(但正因為數據采集精度高,對磁盤消耗大,存在性能瓶頸,而且不支持集群,但可以通過聯邦能力進行擴展);不依賴分布式存儲,數據直接保存在本地,可以不需要額外的數據庫配置。但是如果對歷史數據有較高要求,可以結合OpenTSDB;周邊插件豐富,如果對監控要求不是特別嚴格的話,默認的幾個成品插件已經足夠使用;本身基於數學計算模型,有大量的函數可用,可以實現很復雜的監控(所以學習成本高,需要有一定數學思維,獨有的數學命令行很難入門);可以嵌入很多開源工具的內部去進行監控,數據更可信。
二、Prometheus的主要組件
1、服務端
Prometheus服務端以一個進程方式啟動,如果不考慮參數和后台運行的話,只需要解壓安裝包之后運行./prometheus腳本即可啟動,程序默認監聽在9090端口。每次采集到的數據叫做metrics。這些采集到的數據會先存放在內存中,然后定期再寫入硬盤,如果服務重新啟動的話會將硬盤數據寫回到內存中,所以對內存有一定消耗。Prometheus不需要重視歷史數據,所以默認只會保留15天的數據。
2、客戶端
Prometheus客戶端分為pull和push兩種方式。如果是pull形式的話則是服務端主動向客戶端拉取數據,這樣需要客戶端上安裝exporters(導出器)作為守護進程,官網上也提供了很多exporters可以下載使用,比如使用最多的node_exporters,幾乎把系統自身相關數據全部采集了,非常全面,node_exporter默認監聽9100端口。
如果是push形式的話客戶端需要安裝pushgateway插件,然后運需要運維人員用腳本把監控數據組織成鍵值形式提交給pushgateway,再由它提交給服務端。它適合於現有exporters無法滿足需求時,自己靈活定制。
3、metrics主要數據類型
· Gauges:最簡單、使用最多的指標,獲取一個返回值,這個返回值沒有變化規律,不能肯定它一定是增長或是減少的狀態,采集回來是多少就是多少。比如硬盤容量、CPU內存使用率都適合使用Gauges數據類型。
· Counters:計數器。數據從0開始累計,理想狀態下應該是永遠增長或者是不變。適合統計機器開機時間、HTTP訪問量
· Histograms:和summary一樣屬於高級指標,用於統計數據的分布情況。比如最小值、最大值、中間值。這個類型不太好理解,比如說統計一天的日志,大部分用戶響應時間都是正常的,只有少量用戶異常,如果這個時候取平均值的話,這少量用戶的異常情況就會被掩蓋過去,而Histograms可以分別統計出全部用戶的響應時間,比如0-1秒的用戶有多少、1-2秒的用戶有多少(其實有點像Kibana)
三、Prometheus服務端安裝部署
1、到官網http://prometheus.io下載安裝包
2、解壓安裝包后獲得主配置文件prometheus.yml,下面介紹一些需要修改的主要配置,標簽部分內容不是必須的,可以了解
03 |
evaluation_interval: 15s |
12 |
- job_name: 'prometheus-server' |
14 |
- targets: [ 'localhost:9090' ] |
21 |
- targets: [ '10.160.2.107:9100' , '192.168.1.100:9100' ] |
27 |
- targets: [ '10.160.2.110:9100' , '192.168.1.111:9100' ] |
28 |
metric_relable_configs: |
30 |
source_labels: [ 'job' ] |
3、在運行./prometheus腳本之前可以進行一次配置文件檢查
1 |
protool check config prometheus.yml |
4、配置文件檢查沒有問題后就可以啟動服務了,服務默認監聽在9090端口。如果不加任何參數,監控數據會存放在/usr/local/prometheus/data下,那些一長串一長串的文件夾都是已經寫入到磁盤中的歷史數據。寫入磁盤前的數據是放在內存中的,如果發生斷電等情況就會使用硬盤中的數據進行恢復。下面是一些Prometheus腳本常用選項
1 |
prometheus --config.file= "/usr/local/prometheus-2.16.0.linux-amd64/prometheus.yml" --web.listen-address= "0.0.0.0:9090" |
2 |
# --config.file= "/usr/local/prometheus/prometheus.yml" #指定配置文件路徑 |
3 |
# --web.listen-address= "0.0.0.0:9090" #指定服務端口 |
4 |
# --storage.tsdb.path= "/data/prometheus" #指定數據存儲路徑 |
5 |
# --storage.tsdb.retention.time=15d #數據保留時間 |
6 |
# --collector.systemd #開啟服務狀態監控,開啟后在WEB上可以看到多出相關監控項 |
7 |
# --collector.systemd.unit-whitelist=(sshd|nginx).service #具體要監控的服務名 |
8 |
# --web.enable-lifecycle #開啟熱加載配置 |
兩種熱加載方式,一個是直接用kill命令發送HUP信號,一個是開啟web.enable-lifecycle選項后使用curl命令
1 |
kill -HUP `pidof prometheus` |
2 |
curl -X POST http://localhost:9090/-/reload |
5、通過瀏覽器訪問9090端口可以進入到Prometheus WEB管理界面。如下圖就是查看已經監控的節點列表

6、在進行數據查詢時有一個統一的查詢語法,根據metric_name指標名稱和label標簽進行過濾和聚合
1 |
#語法:<metric name>{<labelname>=<lablevalue>,...}[time] |
2 |
http_requests_total{environment=~ "staging|testing|development" ,method!= "GET" } |
3 |
# labelname=value #選擇標簽滿足表達式定義的時間序列 |
4 |
# labelname!=value #根據標簽匹配排除時間序列 |
5 |
# labelname=~regx #選擇標簽符合正則表達式定義的時間序列 |
6 |
# labelname!~regx #排除符合正則表達式定義的時間序列 |
8 |
http_request_total{}[5m] #選擇最近 5 分鍾內的所有樣本數據,還支持s,h,d,w,y等單位 |
9 |
http_request_total{}[1d] offset 1d #區間向量表達式是以當前時間為基准,如果想查詢昨天一天的區間數據可以使用位移操作offset |
四、Prometheus客戶端安裝部署
1、這里的客戶端指的是exporter,也叫導出器。exporter可以分為兩類:內置支持Prometheus,比如K8S、Etcd等;間接采集,比如node_exporter、MySQL Exporter等。參考下圖:

這里以安裝node_exporter為例,該導出器通過讀取/proc下的文件獲取系統的各種數據。只需要在官網下載好二進制包以后可以解壓直接啟動,如果要打開額外的監控選項的話只需要加上指定參數就可以了
2、使用curl命令訪問服務可以看到返回很多鍵值對數據。這里只要掌握常用的幾個key就可以了,比如查看系統CPU使用率的node_cpu、查看磁盤IO的node_disk*、查看系統負載的node_load1、查看系統內存的node_memory*、查看網絡帶寬的node_network*、查看文件系統使用情況的node_filesystem*等
4 |
node_cpu{cpu= "cpu0" ,mode= "idle" } 362812.7890625 |
3、除了訪問:9100/metrics來獲取數據外,也可以在Prometheus界面通過PromQL來進行查詢,支持使用標簽進行匹配和條件過濾,如果在保證語法沒有問題卻查詢不到數據的情況,請確認機器時間同步。下圖就是使用PromQL進行了一次查詢,這些查詢語句涉及了多種函數,靈活使用這些函數可以完成很多維度的監控。后續會對一些常用函數進行講解
