表達式的結果可以顯示為圖形,可以顯示為表格,也可以通過HTTP API供外部系統調用。
1、數據類型
Instant vector:瞬時矢量,一組時間序列,包含每個時間序列的單個樣本,所有樣本共享相同的時間戳。
Range vector:范圍矢量,一組時間序列,包含每個時間序列隨時間變化的一系列數據點。
Scalar:標量,一個浮點值。
String:字符串,當前未使用。
當前只有瞬時矢量可以直接畫圖,也就是說一個表達式的結果必須是瞬時向量,才能夠直接繪制圖形。
2、字面量
字符串字面量:
浮點數字面量:
3、時間序列選擇器
瞬時矢量選擇器:
舉例:
http_requests_total
這個選擇器會挑選所有帶有度量名http_requests_total的時間序列。
http_requests_total{job="prometheus",group="canary"}
這個選擇器通過標簽做進一步過濾,時間序列需要同時滿足:度量名為http_requests_total,job標簽的值為prometheus,group標簽的值為canary。
job="prometheus",其中的=表示要完全一樣,才算符合要求;
job!="prometheus",其中的!=表示不相等,才算符合要求;
job=~"prometheus",=~表示需要正則匹配。
job!~"prometheus",!~表示不能正則匹配。
http_requests_total{environment=~"staging|testing|development",method!="GET"}
本例中,staging,testing,development,都符合要求,同時排除了GET方法,其他方法都符合要求。
非法,因為能匹配到空字符串。
合法,因為第一個是.+,至少會有1個字符;第二個雖然用了.*,但是第二個method作為保底標簽,即使job=""也不怕。
注意:表達式http_requests_total 等價於 表達式{__name__="http_requests_total"}。
該表達式會選擇那些 度量名以job開頭。
或者說,一個度量名的開頭如果是job,則符合該表達式的要求。
度量名不能是以下關鍵字中的一個:
bool, on, ignoring, group_left and group_right
on{} 這是非法的
可以換一種方式:{__name__="on"}
范圍矢量選擇器
在過去的5分鍾內,如果某些時間序列的度量名是http_requests_total,job標簽的值是prometheus,那么這些時間序列就符合上述表達式。
此時,我們就選擇到了過去這5分鍾內的值。
持續時間
時間能組合
以下是合法的示例
偏移修改器
偏移修改器允許修改查詢中 某個獨立的瞬時矢量或范圍矢量 的時間偏移量。
注意,offset必須緊跟着選擇器。
以下這個是錯誤的,因為offset沒有緊跟着選擇器,而是跟在sum()的后面:
對於范圍矢量,同樣適用:
首選划定前5分鍾內的數據范圍,然后往前偏移1周。最后再計算相應5分鍾內的速率。
比如現在是2021-11-18 18:10:00,[5m]的作用是將 2021-11-18 18:05:00 ~ 2021-11-18 18:10:00范圍內的數據圈起來。
offset 1w,表示向前推移1周,即2021-11-11 18:10:00,[5m]的作用是鎖定 2021-11-11 18:05:00 ~ 2021-11-11 18:10:00范圍內的數據,
並計算速率。
向前偏移。用-表示。比如現在是2021-11-18 18:10:00,推移后是2021-11-25 18:10:00
這個特性需要單獨開啟(在啟動prometheus的時候增加選項)
./prometheus --enable-feature=promql-negative-offset
@ 修改器
用於指定獲取某個具體時間點的值。
返回http_requests_total在2021-01-04T07:40:00+00:00時間點的值。
@符號后面跟時間戳。
同樣的,@符號也要緊跟着選擇器。
同樣的,范圍選擇器也是一樣:
在2021-01-04T07:40:00+00:00時間點,計算前5分鍾的速率。
offset和@組合使用。
不管先寫@還是先寫offset,偏移都是相對於@符號來說的。
也就是說先定位到@符號指定的時間上,再做偏移動作。
@默認是關閉的,如果要開啟,則添加選項:
./prometheus --enable-feature=promql-at-modifier
在@符號后,可以使用start()和end()。
對於一個即時查詢來說,start()和end()都解析為計算時間。
子查詢的結果是范圍向量。