第八講:prometheus命令行使用擴展


  本講內容

  • prometheus命令行格式
  • rate函數使用
  • increase函數使用
  • sum函數使用  

 

  (一)prometheus命令行格式

  我們選一個新的key來做講解

count_netstat_wait_connections #TCP wait_connect數

   這個key值不少我們熟悉的node_exporter挖掘而來

  而是我們自定義並使用bash腳本+pushgateway的方式推送到 prometheus server采集

  類型gauge

  gauge類型的數據,屬於隨機變化的數值,並不像Counter那樣是持續增長的

  把一個key直接輸入命令行之后得到的是最原始的數據輸出

  相對Counter數據gauge不需要任何increase() rate()之類的函數計算

  直接輸入以后就可以看到已經成型的有確實意義的曲線圖,如下圖

 

   標簽:來自於采集數據也可以自定義

  例如上面數據的instance標簽是指明備監控的服務器

  可以在命令中使用標簽進行進一步過濾例如

process_open_fds{instance="192.168.1.101:9100"}

 

 

   查詢多個有多個結果的時候也可以使用鼠標點擊進行過濾

 

   過濾后就只顯示某一台服務器的信息

  過濾除了精確匹配 還有 模糊匹配

  例如

process_open_fds{instance=~"192.168.1.*"}

   

模糊匹配=~
模糊不匹配!~

   標簽過濾之后對數值過濾

process_open_fds{instance="192.168.1.11:9100"}>8

   顯示的就是一些片段了

 

 

  (二)rate函數

  rate函數可以說是prometheus提供的最重要的函數

  rate函數是專門搭配Counter類型數據使用的函數

  它的功能是安裝設置一個時間段,取Counter在這個時間段中平均每秒的增量  

  舉例說明

  網絡流量key

node_network_receive_bytes

   獲取一分鍾內平均每秒的增量

rate(node_network_receive_bytes [1m])

 

 

   注意:所以說 我們以后在使⽤任何counter數據類型的時候,永遠記 得 別的先不做 先給它加上⼀個 rate() 或者 increase() 

  接下來我們把rate()做的事情更加細化來解釋一下

  例如從09:20:43-09:21:43

  累積量從1031796930910到了1031872038733

  一分鍾內增加的1000bytes(假設)

  從9:21-9:26

  五分鍾增加了5000bytes(假設)

  加入rate(. [1m])之后

  會把1000bytes除以1m*60秒 =~16bytes

  就是這樣計算出在這一分鍾內平均每秒增加16bytes

  

 

 

 

 

  修改把1m=》5m

  這樣就把5分鍾內的增量除以5m*60秒

  5分鍾的增量加入是5000那么除以300以后還是約等於16bytes/s

  感覺好像一模一樣

  對比1m和5m

 

 

 

   明顯1分鍾的曲線比5分鍾的曲線平緩

  雖然平均每秒的速度都是16bytes

  如果 我們按照 rate(1m)這樣來取,那么是取1分鍾內的增量 除 以秒數

  如果 我們按照 rate(5m)這樣來取,那么是取5分鍾內的增量 除 以秒數

  ⽽這種取法 是⼀種平均的取法 ⽽且是假設的

  剛才我們說 counter在 ⼀分鍾 5分鍾 之內的增量 1000 和 5000  其實是⼀種假設的理想狀態

  事實上 ⽣產環境 ⽹絡數據接收量 可不是這么平均的 有可能在 第⼀分鍾內 增加了 1000 , 到 第⼆分鍾 就變成增加 了2500 ….

  所以 rate(1m) 這樣的取值⽅法 ⽐起 rate(5m) ,因為它取的時 間段短,所以 任何某⼀瞬間的凸起或者降低  在成圖的時候 會體現的更細致 更敏感

  ⽽ rate(5m) 把整個5分鍾內的 都⼀起平均了,那么當發⽣瞬時 凸起的時候 ,會顯得圖平緩了⼀些 (因為 取的時間段長 把 波峰波⾕ 都給平均消下去了)
那么我們再放⼤⼀些 看看 rate(20m) 會怎么樣
  

 

   更加平緩了

  在我們的⼯作中 取1m 還是取5m 這個取決於 我們對於監控數據的敏感性程度來挑選

  (3)increase函數

  increase 函數 其實和rate() 的概念及使⽤⽅法 ⾮常相似

  rate(1m) 是取⼀段時間增量的平均每秒數量 increase(1m) 則是 取⼀段時間增量的總量 

  對比

 

 

 

   圖形形狀基本一樣,但是y軸的數值是不一樣的

  從這兩個圖 我們可以看到 其實曲線的⾛勢 基本是⼀樣的 但是 顯⽰出來的數量級bytes 可不⼀樣  3106868.4 * 60 = 186412104 (發現) 正好是 60倍  也就很好理理解了了,increase() 是不不會取⼀一秒的平均值的
  生產中應該如何選擇兩個函數

  采集粗糙例如每五分鍾采集一次的數據,如果使用rate函數則因為是每秒的平均使用可能產生斷點,則需要使用increase

  采集數據不頻繁采用increase

  rate()適用於CPU 內存 硬盤IO 網絡流量

  increase()適用於硬盤容量等不會經常性發送突變的

  

  (四)sum函數

  sum就是總取和

  sum會把結果集輸出進行總加和

  例如

rate(node_network_receive_bytes[1m]) 

   

  顯⽰的結果集 會包含如 下內容

 

   使用sum函數以后

sum(rate(node_network_receive_bytes[1m]) )

   把所有的網絡流量匯總了

 

 

   我們之前也說過,如果要進⾏下⼀層的拆分 需要在 sum() 的后⾯ 加上 by (instance)

sum(rate(node_network_receive_bytes[1m]) ) by(instance)

   

 

   但是如果 我們希望 按集群總量輸出呢? ⽐如 我們返回了20台機器的數據 其中 有6台 屬於 web server 10台屬於 DB server 其他的 屬於⼀般server

  那么我們這時候 sum() by (cluster_name) 就可以幫我們實現 集 群加合並分三條曲線輸出了

  順帶⼀提的是 (cluster_name) 這個標簽,默認node_exporter 是沒有辦法提供的 node_exporter只能按照 不同的機器名去划分

  如果希望 ⽀持cluster_name 我們需要⾃⾏定義標簽(往后的課程介紹)

  (五)topk()函數

  取前幾位最高值

  例如

topk(3,node_network_receive_bytes)

 

 

 

 

   這個函數一般使用只適合於在console查看(返回當時瞬時的數據),針對graph的意義不大

  如下圖所示

 

 

   Topk因為對於每⼀個時間點 都只取前三⾼的數值 那么必然會造成 單個機器的采集數據不連貫

  因為:⽐如 server01在在這⼀分鍾的 wait_connection數量排在 所有機器的前三 ,到了下⼀分鍾 可能就排到墊底了.. ⾃然其 曲線就會中斷 實際使⽤的時候 ⼀般⽤topk()函數 進⾏瞬時報警 ⽽不是為 了觀察曲線圖

  (六)count()函數

  定義: 把數值符合條件的 輸出數⽬進⾏加合

  舉例

  找出當前(或者歷史的)打開文件描述符大於8的機器數量

count(process_open_fds>8)

 

 

   這個函數在實際⼯作中還是很有⽤的 ⼀般⽤它count進⾏⼀些模糊的監控判斷

  count返回的是一個加和的數值

  ⽐如說 企業中有100台服務器,那么當只有10台服務器CPU⾼ 於80%的時候 這個時候不需要報警 但是 當符合80%CPU的服務器數量 超過 30台的時候 那么就 會觸發報警 count()
  更多函數查看官網:https://prometheus.io/docs/prometheus/latest/querying/functions/

  


免責聲明!

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



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