4.PromQL快速入门
4.PromQL快速入門
4.1.什么是 PromQL?
4.2.PromQL 基礎(chǔ)用法
4.2.1.完全匹配
4.2.2.正則匹配
4.2.3.范圍查詢
4.2.4.時間位移操作
4.2.5.聚合操作
4.2.6.標量
4.2.7.字符串
4.3.PromQL操作符
4.3.1.數(shù)學(xué)運算符
4.3.2.布爾運算符
4.3.3.集合運算符
4.3.4.and 與操作
4.3.5.or 或操作
4.3.6.unless 排除操作
4.3.7.操作符優(yōu)先級
4.4.PromQL 聚合操作
4.4.1.sum 求和
4.4.2.min 最小值
4.4.3.max 最大值
4.4.4.avg 平均值
4.4.5.stddev 標準差
4.4.6.count 計數(shù)
4.4.7.bottomk 后幾條
4.4.8.topk 前幾條
4.5.PromQL 內(nèi)置函數(shù)
4.5.1.rate 增長率
4.5.2.predict_linear 增長預(yù)測
4.PromQL快速入門
本文轉(zhuǎn)自:https://www.cnblogs.com/chanshuyi/p/04_quick_start_of_promql.html
中提到可以針對業(yè)務(wù)指標做自定義監(jiān)控,其中有一個設(shè)置屬性為 Metrics,即:
這個 Metrics 屬性的值遵守了 PromQL 規(guī)則。我們只要學(xué)會了 PromQL 表達式,就知道了怎么設(shè)置這個屬性了。
4.1.什么是 PromQL?
PromQL(Prometheus Query Language)是 Prometheus 內(nèi)置的數(shù)據(jù)查詢語言,它能實現(xiàn)對事件序列數(shù)據(jù)的查詢、聚合、邏輯運算等。它并且被廣泛應(yīng)用在 Prometheus 的日常應(yīng)用當(dāng)中,包括對數(shù)據(jù)查詢、可視化、告警處理當(dāng)中。
簡單地說,PromQL 廣泛存在于以 Prometheus 為核心的監(jiān)控體系中。所以需要用到數(shù)據(jù)篩選的地方,就會用到 PromQL。例如:監(jiān)控指標的設(shè)置、報警指標的設(shè)置等等。
4.2.PromQL 基礎(chǔ)用法
當(dāng)Prometheus通過Exporter采集到相應(yīng)的監(jiān)控指標樣本數(shù)據(jù)后,我們就可以通過PromQL對監(jiān)控樣本數(shù)據(jù)進行查詢。
當(dāng)我們直接使用監(jiān)控指標名稱查詢時,可以查詢該指標下的所有時間序列。我們這里啟動 Prometheus 服務(wù)器,并打開 http://localhost:19090/graph 地址。在查詢框中,我們輸入:prometheus_http_requests_total 并點擊執(zhí)行。
可以看到我們查詢出了所有指標名稱為 prometheus_http_requests_total的數(shù)據(jù)。
PromQL 支持戶根據(jù)時間序列的標簽匹配模式來對時間序列進行過濾,目前主要支持兩種匹配模式:完全匹配和正則匹配。
4.2.1.完全匹配
PromQL 支持使用 = 和 != 兩種完全匹配模式。
?等于。通過使用 label=value 可以選擇那些標簽滿足表達式定義的時間序列。
?不等于。通過使用 label!=value 則可以根據(jù)標簽匹配排除時間序列。
例如我們上面查詢出了所有指標名稱為 prometheus_http_requests_total 的數(shù)據(jù)。這時候我們希望只查看錯誤的請求,即過濾掉所有 code 標簽不是 200 的數(shù)據(jù)。那么我們的 PromQL 表達式可以修改為:prometheus_http_requests_total{code!=“200”}。
從上圖可以看到,查詢出的結(jié)果已經(jīng)過濾掉了所有 code 不為 200 的數(shù)據(jù)。
4.2.2.正則匹配
PromQL 還可以使用正則表達式作為匹配條件,并且可以使用多個匹配條件。
?正向匹配。使用 label=~regx 表示選擇那些標簽符合正則表達式定義的時間序列。
?反向匹配。使用 label!~regx 進行排除。
例如我想查詢指標 prometheus_http_requests_total 中,所有 handler 標簽以 /api/v1 開頭的記錄,那么我的表達式為:prometheus_http_requests_total{handler=~"/api/v1/.*"}。
從上面的查詢結(jié)果可以看出,查詢的結(jié)果已經(jīng)只保留了handler 標簽以 /api/v1 開頭的數(shù)據(jù)。
4.2.3.范圍查詢
我們上面直接通過類似 prometheus_http_requests_total 表達式查詢時間序列時,同一個指標同一標簽只會返回一條數(shù)據(jù)。這樣的表達式我們稱之為瞬間向量表達式,而返回的結(jié)果稱之為瞬間向量。
而如果我們想查詢一段時間范圍內(nèi)的樣本數(shù)據(jù),那么我們就需要用到區(qū)間向量表達式,其查詢出來的結(jié)果稱之為區(qū)間向量。時間范圍通過時間范圍選擇器 [] 進行定義。例如,通過以下表達式可以選擇最近5分鐘內(nèi)的所有樣本數(shù)據(jù):
prometheus_http_requests_total{}[5m]
通過查詢結(jié)果可以看到,此時我們查詢出了所有的樣本數(shù)據(jù),而不再是一個樣本數(shù)據(jù)的統(tǒng)計值。
除了使用m表示分鐘以外,PromQL的時間范圍選擇器支持其它時間單位:
?s - 秒
?m - 分鐘
?h - 小時
?d - 天
?w - 周
?y - 年
4.2.4.時間位移操作
在瞬時向量表達式或者區(qū)間向量表達式中,都是以當(dāng)前時間為基準:
# 瞬時向量表達式,選擇當(dāng)前最新的數(shù)據(jù) prometheus_http_requests_total{} # 區(qū)間向量表達式,選擇以當(dāng)前時間為基準,5分鐘內(nèi)的數(shù)據(jù) prometheus_http_requests_total{}[5m]如果我們想查詢 5 分鐘前的瞬時樣本數(shù)據(jù),或昨天一天的區(qū)間內(nèi)的樣本數(shù)據(jù)呢? 這個時候我們就可以使用位移操作,位移操作的關(guān)鍵字為 offset。
# 查詢 5 分鐘前的最新數(shù)據(jù) http_request_total{} offset 5m # 往前移動 1 天,查詢 1 天前的數(shù)據(jù) # 例如現(xiàn)在是 2020-10-07 00:00:00 # 那么這個表達式查詢的數(shù)據(jù)是:2020-10-05 至 2020-10-06 的數(shù)據(jù) http_request_total{}[1d] offset 1d4.2.5.聚合操作
一般情況下,我們通過 PromQL 查詢到的數(shù)據(jù)都是很多的。PromQL 提供的聚合操作可以用來對這些時間序列進行處理,形成一條新的時間序列。
以我們的 prometheus_http_requests_total 指標為例,不加任何條件我們查詢到的數(shù)據(jù)為:
從上圖查詢結(jié)果可以知道,一共有 8 條數(shù)據(jù),這 8 條數(shù)據(jù)的 value 總和為 307。那么我們使用下面兩個聚合操作表達式來查詢,看看結(jié)果對不對。
第一個表達式,計算一共有幾條數(shù)據(jù):count(prometheus_http_requests_total)
第二個表達式,計算所有數(shù)據(jù)的 value 總和:sum(prometheus_http_requests_total)
可以看到 count 的數(shù)值是一致的,都是 8。但是 sum 的數(shù)值有誤差,這是因為我們兩次查詢的時間間隔內(nèi),某些記錄的數(shù)值發(fā)生了變化。
4.2.6.標量
在 PromQL 中,標量是一個浮點型的數(shù)字值,沒有時序。例如:10。
需要注意的是,當(dāng)使用表達式count(http_requests_total),返回的數(shù)據(jù)類型,依然是瞬時向量。用戶可以通過內(nèi)置函數(shù)scalar()將單個瞬時向量轉(zhuǎn)換為標量。
如上圖所示,我們將 sum 操作的值用 scalar 轉(zhuǎn)換了一下,最終的結(jié)果就是一個標量了。
4.2.7.字符串
在 PromQL 中,字符串是一個簡單的字符串值。直接使用字符串作為 PromQL 表達式,則會直接返回字符串。
上圖中我使用字符串 “this is a string” 直接作為 PromQL 查詢表達式,結(jié)果返回的是一個字符串。
4.3.PromQL操作符
PromQL 還支持豐富的操作符,用戶可以使用這些操作符對進一步的對事件序列進行二次加工。這些操作符包括:數(shù)學(xué)運算符,邏輯運算符,布爾運算符等等。
4.3.1.數(shù)學(xué)運算符
數(shù)學(xué)運算符比較簡單,就是簡單的加減乘除等。
例如我們通過prometheus_http_response_size_bytes_sum可以查詢到Prometheus這個應(yīng)用的 HTTP 響應(yīng)字節(jié)總和。但是這個單位是字節(jié),我們希望用 MB 顯示。那么我們可以這么設(shè)置:prometheus_http_response_size_bytes_sum/8/1024
最終顯示的數(shù)據(jù)就是以 MB 作為單位的數(shù)值。
PromQL支持的所有數(shù)學(xué)運算符如下所示:
?+ (加法)
?- (減法)
?* (乘法)
?/ (除法)
?% (求余)
?^ (冪運算)
4.3.2.布爾運算符
布爾運算符支持用戶根據(jù)時間序列中樣本的值,對時間序列進行過濾。例如我們可以通過 prometheus_http_requests_total 查詢出每個接口的請求次數(shù),但是如果我們想篩選出請求次數(shù)超過 20 次的接口呢?
此時我們可以用下面的 PromQL 表達式:
prometheus_http_requests_total > 20可以看到我們將所有 value 值超過 20 的數(shù)據(jù)都篩選了出來,從其指標名稱可以看出對應(yīng)的接口名。
從上面的圖中我們可以看到,value 的值還是具體的數(shù)值。但如果我們希望對符合條件的數(shù)據(jù),value 變?yōu)?1。不符合條件的數(shù)據(jù),value 變?yōu)?0。那么我們可以使用bool修飾符。
我們使用下面的 PromQL 表達式:
prometheus_http_requests_total > bool 20從下面的執(zhí)行結(jié)果可以看到,這時候并不過濾掉數(shù)據(jù),而是將 value 的值變成了 1 或 0。
目前,Prometheus支持以下布爾運算符如下:
?* == (相等)
?!= (不相等)
?> (大于)
?< (小于)
?>= (大于等于)
?<= (小于等于)
4.3.3.集合運算符
通過集合運算,可以在兩個瞬時向量與瞬時向量之間進行相應(yīng)的集合操作。目前,Prometheus支持以下集合運算符:
?and 與操作
?or 或操作
?unless 排除操作
4.3.4.and 與操作
vector1 and vector2 進行一個與操作,會產(chǎn)生一個新的集合。該集合中的元素同時在 vector1 和 vector2 中都存在。
例如我們有 vector1 為 A B C,vector2 為 B C D,那么 vector1 and vector2 的結(jié)果為:B C。
4.3.5.or 或操作
vector1 and vector2 進行一個或操作,會產(chǎn)生一個新的集合。該集合中包含 vector1 和 vector2 中的所有元素。
例如我們有 vector1 為 A B C,vector2 為 B C D,那么 vector1 or vector2 的結(jié)果為:A B C D。
4.3.6.unless 排除操作
vector1 and vector2 進行一個或操作,會產(chǎn)生一個新的集合。該集合首先取 vector1 集合的所有元素,然后排除掉所有在 vector2 中存在的元素。
例如我們有 vector1 為 A B C,vector2 為 B C D,那么 vector1 unless vector2 的結(jié)果為:A。
4.3.7.操作符優(yōu)先級
在PromQL操作符中優(yōu)先級由高到低依次為:
?^
?*, /, %
?+, -
?==, !=, <=, <, >=, >
?and, unless
?or
4.4.PromQL 聚合操作
Prometheus 還提供了聚合操作符,這些操作符作用于瞬時向量。可以將瞬時表達式返回的樣本數(shù)據(jù)進行聚合,形成一個新的時間序列。目前支持的聚合函數(shù)有:
?sum (求和)
?min (最小值)
?max (最大值)
?avg (平均值)
?stddev (標準差)
?stdvar (標準方差)
?count (計數(shù))
?count_values (對value進行計數(shù))
?bottomk (后n條時序)
?topk (前n條時序)
?quantile (分位數(shù))
4.4.1.sum 求和
用于對記錄的 value 值進行求和。
例如:sum(prometheus_http_requests_total) 表示統(tǒng)計所有 HTTP 請求的次數(shù)。
4.4.2.min 最小值
返回所有記錄的最小值。
prometheus_http_requests_total 指標所有數(shù)據(jù)如下圖所示:
當(dāng)我們執(zhí)行如下 PromQL 時,會篩選出最小的記錄值。
4.4.3.max 最大值
返回所有記錄的最大值。
當(dāng)我們執(zhí)行如下 PromQL 時,會篩選出最大的記錄值。
max(prometheus_http_requests_total)4.4.4.avg 平均值
avg 函數(shù)返回所有記錄的平均值。
當(dāng)我們執(zhí)行如下 PromQL 時,會篩選出最大的記錄值。
avg(prometheus_http_requests_total)4.4.5.stddev 標準差
標準差(Standard Deviation)常用來描述數(shù)據(jù)的波動大小。例如我們統(tǒng)計籃球隊員身高:
兩支隊伍平均身高都是 180,看起來似乎差不多。但如果畫圖的話,得到結(jié)果如下:
很顯然,藍色隊隊員身高更加整齊一些,橙色隊身高顯得參差不齊。為了反映一組數(shù)據(jù),偏離平均值的程度,就有了「標準差 」這個概念。
如果數(shù)據(jù)量很大,比如幾萬人的身高,我們不容易從折線圖看出來,可以直接用公式計算。上圖的數(shù)據(jù)標準差計算結(jié)果為:
很明顯,橙色隊的標準差比藍色隊標準差大很多。這說明橙色隊的身高波動更大。
當(dāng)我們執(zhí)行如下 PromQL 時,會計算出不同 HTTP 請求的數(shù)量波動情況。
stddev(prometheus_http_requests_total)
從計算結(jié)果可以看到,標準差達到了 1100 多,這說明其數(shù)據(jù)波動非常大。
4.4.6.count 計數(shù)
count 函數(shù)返回所有記錄的計數(shù)。
例如:count(prometheus_http_requests_total) 表示統(tǒng)計所有 HTTP 請求的次數(shù)。
4.4.7.bottomk 后幾條
bottomk 用于對樣本值進行排序,返回當(dāng)前樣本值后 N 位的時間序列。
例如獲取 HTTP 請求量后 5 位的請求,可以使用表達式:
bottomk(5, prometheus_http_requests_total)4.4.8.topk 前幾條
topk 用于對樣本值進行排序,返回當(dāng)前樣本值前 N 位的時間序列。
例如獲取 HTTP 請求量前 5 位的請求,可以使用表達式:
topk(5, prometheus_http_requests_total)4.5.PromQL 內(nèi)置函數(shù)
PromQL 提供了大量的內(nèi)置函數(shù),可以對時序數(shù)據(jù)進行豐富的處理。例如 irate() 函數(shù)可以幫助我們計算監(jiān)控指標的增長率,不需要我們?nèi)ナ謩佑嬎恪?/p>
4.5.1.rate 增長率
我們知道 counter 類型指標的特點是只增不減,在沒有發(fā)生重置的情況下,其樣本值是不斷增大的。為了能直觀地觀察期變化情況,需要計算樣本的增長率。
increase(v range-vector) 函數(shù)是 PromQL 中提供的眾多內(nèi)置函數(shù)之一。其中參數(shù) v 是一個區(qū)間向量,increase 函數(shù)獲取區(qū)間向量中的第一個后最后一個樣本并返回其增長量。因此,可以通過以下表達式Counter類型指標的增長率:
increase(node_cpu[2m]) / 120這里通過node_cpu[2m]獲取時間序列最近兩分鐘的所有樣本,increase計算出最近兩分鐘的增長量,最后除以時間120秒得到node_cpu樣本在最近兩分鐘的平均增長率。并且這個值也近似于主機節(jié)點最近兩分鐘內(nèi)的平均CPU使用率。
除了使用increase函數(shù)以外,PromQL中還直接內(nèi)置了rate(v range-vector)函數(shù),rate函數(shù)可以直接計算區(qū)間向量v在時間窗口內(nèi)平均增長速率。因此,通過以下表達式可以得到與increase函數(shù)相同的結(jié)果:
rate(node_cpu[2m])需要注意的是使用rate或者increase函數(shù)去計算樣本的平均增長速率,容易陷入「長尾問題」當(dāng)中,其無法反應(yīng)在時間窗口內(nèi)樣本數(shù)據(jù)的突發(fā)變化。
例如,對于主機而言在 2 分鐘的時間窗口內(nèi),可能在某一個由于訪問量或者其它問題導(dǎo)致 CPU 占用 100% 的情況,但是通過計算在時間窗口內(nèi)的平均增長率卻無法反應(yīng)出該問題。
為了解決該問題,PromQL提供了另外一個靈敏度更高的函數(shù) irate(v range-vector)。irate 同樣用于計算區(qū)間向量的計算率,但是其反應(yīng)出的是瞬時增長率。irate 函數(shù)是通過區(qū)間向量中最后兩個樣本數(shù)據(jù)來計算區(qū)間向量的增長速率。
這種方式可以避免在時間窗口范圍內(nèi)的「長尾問題」,并且體現(xiàn)出更好的靈敏度,通過 irate 函數(shù)繪制的圖標能夠更好的反應(yīng)樣本數(shù)據(jù)的瞬時變化狀態(tài)。
irate(node_cpu[2m])irate函數(shù)相比于rate函數(shù)提供了更高的靈敏度,不過當(dāng)需要分析長期趨勢或者在告警規(guī)則中,irate的這種靈敏度反而容易造成干擾。因此在長期趨勢分析或者告警中更推薦使用rate函數(shù)。
4.5.2.predict_linear 增長預(yù)測
在一般情況下,系統(tǒng)管理員為了確保業(yè)務(wù)的持續(xù)可用運行,會針對服務(wù)器的資源設(shè)置相應(yīng)的告警閾值。例如,當(dāng)磁盤空間只剩512MB時向相關(guān)人員發(fā)送告警通知。 這種基于閾值的告警模式對于當(dāng)資源用量是平滑增長的情況下是能夠有效的工作的。
但是如果資源不是平滑變化的呢? 比如有些某些業(yè)務(wù)增長,存儲空間的增長速率提升了高幾倍。這時,如果基于原有閾值去觸發(fā)告警,當(dāng)系統(tǒng)管理員接收到告警以后可能還沒來得及去處理問題,系統(tǒng)就已經(jīng)不可用了。
因此閾值通常來說不是固定的,需要定期進行調(diào)整才能保證該告警閾值能夠發(fā)揮去作用。 那么還有沒有更好的方法嗎?
PromQL 中內(nèi)置的 predict_linear(v range-vector, t scalar) 函數(shù)可以幫助系統(tǒng)管理員更好的處理此類情況,predict_linear 函數(shù)可以預(yù)測時間序列v在t秒后的值。
它基于簡單線性回歸的方式,對時間窗口內(nèi)的樣本數(shù)據(jù)進行統(tǒng)計,從而可以對時間序列的變化趨勢做出預(yù)測。例如,基于2小時的樣本數(shù)據(jù),來預(yù)測主機可用磁盤空間的是否在4個小時候被占滿,可以使用如下表達式:
predict_linear(node_filesystem_free{job="node"}[2h], 4 * 3600) < 0總結(jié)
以上是生活随笔為你收集整理的4.PromQL快速入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纳税a 级是什么意思
- 下一篇: 5.prometheus告警插件-ale