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