不懂 Prometheus 做不好運(yùn)維?這篇干貨快收藏
1、介紹&架構(gòu)
2. 合適&不合適場(chǎng)景
合適場(chǎng)景:Prometheus 可以很好地記錄任何數(shù)字時(shí)間序列,它既適合以機(jī)器為中心的監(jiān)控,也適合監(jiān)控高度動(dòng)態(tài)的面向服務(wù)的架構(gòu)。在微服務(wù)的世界中,他對(duì)多維數(shù)據(jù)收集的查詢的支持是一個(gè)特殊的優(yōu)勢(shì)。專為可靠性而設(shè)計(jì),是在中斷期間可以使用的系統(tǒng),可讓你快速診斷問題。每個(gè)Prometheus服務(wù)器都是獨(dú)立的,不依賴于網(wǎng)絡(luò)存儲(chǔ)或其他遠(yuǎn)程服務(wù)。當(dāng)你的基礎(chǔ)設(shè)施的其他部分損壞時(shí),你可以依賴他,并且你無需設(shè)置大量基礎(chǔ)設(shè)施即可使用 不合適場(chǎng)景:你需要100%準(zhǔn)確性,例如按請(qǐng)求計(jì)費(fèi)。這時(shí)候Prometheus就不太適合,你最好使用其他系統(tǒng)來收集和分析數(shù)據(jù)以進(jìn)行計(jì)費(fèi)。
3. 數(shù)據(jù)模型
因?yàn)楸O(jiān)控?cái)?shù)量極大,所以使用了時(shí)間序列數(shù)據(jù)存儲(chǔ)(就是帶時(shí)間戳和值的)
Prometheus 本地存儲(chǔ):
Prometheus 數(shù)據(jù)模型:
表示法:
<metric_name>[{<label_1=“value_1”>,<label_N=“value_N”>}]<datapoint_numercial_value>
4. 指標(biāo)
Counter:Prometheus實(shí)例接收的數(shù)據(jù)包總數(shù)(一直增)
Gauge:測(cè)量是一種度量,他在收集時(shí)對(duì)給定的測(cè)量進(jìn)行快照,可以增加或減少(例如溫度、磁盤空間、內(nèi)存使用量)
Histogram:常常用于觀察,一個(gè)Histogram包含下列值的合并:【某時(shí)間段內(nèi)的百分比或者請(qǐng)求數(shù)量有多少】
5. 指標(biāo)的摘要和聚合
指標(biāo)聚合:就是能看到來自多個(gè)源的指標(biāo)的聚合視圖
6、NodeExporter部署
Prometheus 使用 exporter 工具來暴露主機(jī)和應(yīng)用程序上的指標(biāo)。有很多種類型的exporter。
7. cAdvisor 監(jiān)控 Docker 容器
cAdvisor 并不綁定到 Docker 容器,但它通常作為一個(gè)容器部署,從容器守護(hù)進(jìn)程和 Linux cgroups 收集數(shù)據(jù),是容器的發(fā)現(xiàn)透明且完全自動(dòng)化。
除了以 Prometheus 格式公開指標(biāo)之外,cAdvisor 還提供了一個(gè)有用的 web界面,允許即使可視化主機(jī)及其容器的狀態(tài)。
8. 捕獲目標(biāo)生命周期
9. PromQL查詢語言
選擇器及標(biāo)簽匹配器:
(1)選擇器
//例如:$ prometheus_build_info{version="2.17.0"}
(2)標(biāo)簽匹配器
標(biāo)簽匹配器用于將查詢搜索限制為特定的一組標(biāo)簽值。下面將使用node_cpu_secends_total metric來闡述標(biāo)簽匹配的操作,匹配的操作符有=、!=、=和! 如果沒有任何匹配的規(guī)范。僅此度量就會(huì)返回一個(gè)包含度量名稱的所有可用時(shí)間序列的及時(shí)向量。以及所有的CPU核心數(shù)(cpu=“0”,cpu=“1”)和CPU的型號(hào)(mode=“idle”,mode=“iowait”,mode=“irq”,mode=“nice”,mode=“softirq”,mode=“steal”,mode=“user”,mode=“system”)
(3)范圍、偏移、子查詢
范圍向量:如果要定義一個(gè)范圍向量選擇查詢,你必須設(shè)置一個(gè)及時(shí)向量選擇器和使用[]追加一個(gè)范圍。
偏移量的修飾符:offset的修飾符查詢過去的數(shù)據(jù),也就是說可雙選擇相對(duì)于當(dāng)前時(shí)間的多長(zhǎng)時(shí)間以前
子查詢【道理類似于 MySQL中】
lable_join()
和label_replace()
這些函數(shù)用于操作標(biāo)簽——他們?cè)试S您將標(biāo)簽連接到其他標(biāo)簽,提取標(biāo)簽值的一部分,甚至刪除標(biāo)簽(盡管使用標(biāo)準(zhǔn)的聚合操作更容易、更符合人體工程學(xué))。在這兩個(gè)函數(shù)中,如果定義的目標(biāo)標(biāo)簽是一個(gè)新的,它將被添加到標(biāo)簽集;如果他是一個(gè)現(xiàn)有的標(biāo)簽,它將被取代。【也就是說,如果該語句滿足什么條件的話,機(jī)會(huì)產(chǎn)生相對(duì)應(yīng)的結(jié)果】predict_linear()
函數(shù)可以預(yù)測(cè)時(shí)間序列v在t秒后的值,它基于簡(jiǎn)單線性回歸的方式,對(duì)時(shí)間窗口內(nèi)的樣本數(shù)據(jù)進(jìn)行統(tǒng)計(jì),從而可以對(duì)時(shí)間序列的變化趨勢(shì)作出預(yù)測(cè)。該函數(shù)的返回結(jié)果不帶有度量指標(biāo),只有標(biāo)簽列表。10. 計(jì)算CPU的使用率
//例子:avg(irate(node_cpu_seconds_total{job="node"}[5m] by (instance) * 100))
11. 計(jì)算CPU負(fù)載(飽和度)
//計(jì)算主機(jī)上的CPU數(shù)量,可以使用count聚合實(shí)現(xiàn)count by (instance)(node_cpu_seconds_total{mode="idle"})//接下來將此計(jì)算與node_load指標(biāo)結(jié)合起來node_load1 > on (instance) 2 * count by (instance)(node_cpu_seconds_total{mode="idle"})//這里我們查詢的是1分鐘的負(fù)載超過主機(jī)CPU數(shù)量的兩倍的結(jié)果
12. 計(jì)算內(nèi)存使用率
node_memory
為前綴的指標(biāo)列表找到他們。//查看主機(jī)上的總內(nèi)存node_memory_MemTotal_bytes//主機(jī)上的可用內(nèi)存node_memory_MemFree_bytes//緩沖緩存中的內(nèi)存node_memory_Buffers_bytes//頁面緩存中的內(nèi)存node_memory_Cached_bytes//通過以上的就可以計(jì)算出內(nèi)存使用率(總內(nèi)存-可用內(nèi)存-緩沖緩存中的內(nèi)存-頁面緩沖中的內(nèi)存)/總內(nèi)存 * 100
13. 計(jì)算內(nèi)存飽和度
node_vmstat_pswpin:系統(tǒng)每秒從磁盤讀到內(nèi)存的字節(jié)數(shù)
node_vmstat_pswpout:系統(tǒng)每秒從內(nèi)存寫到磁盤的字節(jié)數(shù)
兩者都是自上次啟動(dòng)以來的字節(jié)數(shù),以KB為單位
為了獲得飽和度指標(biāo),對(duì)每個(gè)指標(biāo)計(jì)算每一分鐘的速率,將兩個(gè)速率相加,然后乘以1024獲得字節(jié)數(shù)
1024 * sum by (instance) ((rate(node_vmstat_pgpgin[1m]) + rate(node_vmstat_pgpgout[1m])))
然后,可以對(duì)此設(shè)置圖形化展示或者警報(bào),以識(shí)別行為不當(dāng)?shù)膽?yīng)用程序主機(jī)。
14. 磁盤使用率
//node_filesystem_size_bytes指標(biāo)顯示了被監(jiān)控的每個(gè)文件系統(tǒng)掛載的大小。node_filesystem_size_bytes
(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) / node_filesystem_size_bytes{mountpoint="/"} * 100
(node_filesystem_size_bytes{mountpoint="/data"} - node_filesystem_free_bytes{mountpoint="/data"}) / node_filesystem_size_bytes{mountpoint="/data"} * 100
或者可以使用正則表達(dá)式匹配多個(gè)掛載點(diǎn)
(node_filesystem_size_bytes{mountpoint="/|/run"} - node_filesystem_free_bytes{mountpoint="/|/run"}) / node_filesystem_size_bytes{mountpoint="/|/run"} * 100
可以使用 predict_linear 函數(shù)來構(gòu)建在未來什么時(shí)候會(huì)耗盡磁盤空間
//預(yù)測(cè)四小時(shí)之后磁盤空間會(huì)不會(huì)爆滿predict_linear(node_filesystem_free_bytes{mountpoint="/"}[1h], 4* 3600) < 0
predict_linear(node_filesystem_free_bytes{job="node"}[1h], 4* 3600) < 0