1、什么是PromQL???
PromQL是Prometheus內置的數據查詢語言,其提供對時間序列數據豐富的查詢,聚合以及邏輯運算能力的支持。並且被廣泛應用在Prometheus的日常應用當中,包括對數據查詢、可視化、告警處理當中。前面的筆記當中有說道我們通過exporter采集到的數據是以時間序列(time-series)的方式保存在內存數據庫中,並定時保存到硬盤。time-series是一個按照時間戳和值的順序存放,可以說是一種矢量值。
什么是矢量值???就是已知x軸和y軸,得出x和y交叉點的那個值就是矢量值,而這里的time-series就是這樣的一個值,每條time-series通過指標名稱(metrics name)和一組標簽(labels)命名,比如前面的node_memory_MemFree_bytes{instance="node02",job="node02"}
,"node_memory_MemFree_bytes"為指標名稱,{ }內的為標簽集合。
metrics通常固定的格式為:
<metric name>{<label name>=<label value>, ...}
指標名稱只能由ASCII字符、數字、下划線以及冒號組成並必須符合正則表達式[a-zA-Z_:][a-zA-Z0-9_:]*
其中以__作為前綴的標簽,是系統保留的關鍵字,只能在系統內部使用。標簽的值則可以包含任何Unicode編碼的字符。在Prometheus的底層實現中指標名稱實際上是以__name__=
node_cpu_seconds_total{mode='idle'} 和
{__name__="node_cpu_seconds_total",mode='idle'}
是一樣的!!!!
前面也說明了metrics的類型:
-
counter:遞增計算器 --> 用於遞增類的指標,如請求的總速率http_request_total,一般用_total作后綴。
-
gauge:可增可減儀表盤 --> 用於統計內存,硬盤的使用率,如node_memory_MemFree_bytes。
-
hitogram/summary:統計和分析樣本分布情況 --> 通俗地說統計一段時間內的量化指標,比如cpu的平均使用率,頁面響應等等。
2、如何查詢???
2.1、監控指標名稱查詢
通過監控指標名稱查詢,也就是我們上面metrics的名稱,而通過指標名稱查詢又可以分為完全匹配和正則匹配查詢。
完全匹配查詢,即 metrics_name{xxx=ooo 或 metrics_name{xxx!=ooo} ,如:
# 如下查詢了cpu的空閑和非空閑時的使用時間
node_cpu_seconds_total{mode='idle'} 或 node_cpu_seconds_total{mode!='idle'}
正則匹配查詢,即 metrics_name{xxx=~"ooo"} 或 metrics_name{xxx=~"ooo",zzz!=777}
pushgateway_http_requests_total{instance=~"pushgateway",method='get'}
或
pushgateway_http_requests_total{instance=~"pushgateway",method!='get'}
2.2、范圍查詢
直接通過監控名稱進行查詢時間序列,直接返回的是一個瞬時矢量值,當我們需要獲取一個時段的樣本數據時,則需要使用區間矢量表達式,和瞬時矢量值的區別在於區間矢量值可以進行自定義查詢的時間范圍,比如統計5分鍾內的數據,那么久可以通過時間范圍選擇器"[ ]"進行自定義。如:
pushgateway_http_requests_total{instance=~"pushgateway",method='get'}[1m]
將會返回這1分鍾內的所有統計數據,除了用m表示分鍾,還可以用s-秒,h-小時,d-天,w-周,y-年
2.3、時間位移查詢
使用時間范圍查詢,也只是以當前時間作為基准去進行統計,如果要統計昨天1天的統計數據時,就需要用到時間位移(offset),如下:
# 統計昨天一天的pushgateway中包含get請求的總請求數
pushgateway_http_requests_total{instance=~"pushgateway",method='get'} offset 1d
2.4、聚合查詢
一般來說,如果描述樣本特征的標簽(label)在並非唯一的情況下,通過PromQL查詢數據,會返回多條滿足這些特征維度的時間序列。而PromQL提供的聚合操作可以用來對這些時間序列進行處理,形成一條新的時間序列:
# 查詢昨天1天內pushgeteway中get的請求總量之和
sum(pushgateway_http_requests_total{instance=~"pushgateway",method='get'} offset 1d)
# 按照mode計算主機CPU的平均使用時間
avg(node_cpu_seconds_total)by(mode)