prometheus.(4).函數計算公式


數學理論基礎-計算公式

作者聲明:本博客內容是作者在學習以及搭建過程中積累的內容,內容采自網絡中各位老師的優秀博客以及視頻,並根據作者本人的理解加以修改(由於工作以及學習中東拼西湊,如何造成無法提供原鏈接,在此抱歉!!!)

作者再次聲明:作者只是一個很摳腳的IT工作者,希望可以跟那些提供原創的老師們學習

原文:大米運維

CPU的構思

%Cpu(s): 2.2 us, 1.9 sy, 0.0 ni, 95.5 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st

CPU的使用率 = (所有非空閑狀態的CPU使用時間總和 )/(所有狀態CPU時間的總和)

(1-((sum(increase(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)) / (sum(increase(node_cpu_seconds_total[5m])) by (instance)))) * 100


(sum(increase(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance) / sum(increase(node_cpu_seconds_total[5m])) by (instance) )* 100

函數

rate()

rate函數,rate用來計算兩個 間隔時間內發生的變化率(一段時間內平均每秒的增量)。

專門用來搭配Counters類型的數據,rate(指標名{篩選條件}[時間間隔])

比如 查看1分鍾內非idle的cpu使用率

rate(node_cpu_seconds_total{mode!="idle"}[1m])

irate()

rate與irate的區別

irate和rate都會用於計算某個指標在一定時間間隔內的變化速率。但是它們的計算方法有所不同:irate取的是在指定時間范圍內的最近兩個數據點來算速率,而rate會取指定時間范圍內所有數據點,算出一組速率,然后取平均值作為結果。

所以官網文檔說:irate適合快速變化的計數器(counter),而rate適合緩慢變化的計數器(counter)。

根據以上算法我們也可以理解,對於快速變化的計數器,如果使用rate,因為使用了平均值,很容易把峰值削平。除非我們把時間間隔設置得足夠小,就能夠減弱這種效應。

相同函數,截取不同時間的圖形分析

rate(node_network_receive_bytes_total{device="ens32",instance="k8s-node1"}[1m])

1分鍾內 增加了 1000bytes (假設)

5分鍾內 增加了 5000bytes (假設)

會把1000bytes除以 1m*60秒,=~16bytes/s 就是這樣計算出在這1分鍾內,平均每秒鍾增加 16bytes

1584428753976

把5分鍾內的增量 除以 5m*60s ,5分鍾的增量 假如是 5000 , 那么除以300 以后 也還是約等於 =~ 16bytes/s

1584428799672

以上兩種時間段的取法,都是假設成⼀種平均的取法,這是一種假設的理想狀態,事實上生產環境 網絡數據接收量 可不是這么平均的。有可能在 第一分鍾 增加了 1000, 到 第二分鍾 就變成增加了2500….

所以 rate(1m) 這樣的取值方法比起 rate(5m) ,因為它取的時間段短,所以 任何某⼀瞬間的凸起或者降低在成圖的時候會體現的更細致 更敏感而rate(5m)把整個5分鍾內的都⼀起平均了,那么當發生瞬時凸起的時候,會顯得圖平緩了⼀些 (因為 取的時間段長 把波峰波谷都給平均消下去了)

increase()

increase 函數 在promethes中,是用來針對Counter 這種持續增長的數值,截取其中⼀段時間的 增量(一段時間內的總增量)

increase(node_cpu_seconds_total[1m]) =》 這樣 就獲取了 CPU總使用時間在1分鍾內的增量

sum( )

比如上面得到各個指標的cpu使用率,如果我想計算總的cpu使用率怎么辦?

sum( ) 就如其字⾯意思⼀樣 起到value 加合的作用 sum( increase(node_cpu_seconds_total[1m]) ) 外⾯套⽤⼀個sum 即可把所有核數值加合

問題1:所有機器的CPU 也全都加到⼀起了,變成 服務器集群 總CPU平均值了?

by()

by (instance) 這個函數 可以把 sum加合到⼀起的數值 按照指定的⼀個方式進行一層的 拆分

instance 代表的是 機器名

意思就是說 把sum函數中 服務器加合的這個糗事 再給它強行拆分出來

sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)

sum() by (cluster_name) 可以幫我們實現集群加合並分三條曲線輸出了,順帶一提的是 (cluster_name) 這個標簽,默認node_exporter是沒有辦法提供的,node_exporter只能按照不同的機器名去划分。如果希望支持cluster_name 我們需要自行定義標簽。

topk()

topk() 函數的定義是:取前面x位的最高值,最簡單理解就是數學的top,當我們有很多服務器我們想要獲取某個key的數據排在前3位的服務器。

Gauge類型使用方式:

topk(3,key)

Counter類型使用方式

topk(3,rate(key[1m]))

注意:此種函數獲得數據並不是很適用圖形化展示,實際使用的時候 ⼀般用topk()函數 進行瞬時報警而不是為了觀察曲線圖

count()

定義: 把數值符合條件的 輸出數目進行加合

例如:找出當前(或者歷史的)當數值數大於2000的機器數量

1584432005529

更多函數:https://prometheus.io/docs/prometheus/latest/querying/functions/

標簽匹配

模糊匹配 =~

模糊不匹配 !~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM