本講內容
- 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/