本文介紹利用PromQL或SQL查詢時序資料庫的常見應用情境。
PromQL基礎使用案例
查詢單指標資料
process_resident_memory_bytes表示常駐記憶體,使用下面的PromQL可直接查看進程各時間的指標資料。
process_resident_memory_bytes按Label篩選指標資料
PromQL語句支援在指標後面添加特定Label的篩選條件,以過濾出預期的指標資料,例如下面這個query篩選出了指定cluster下的資料。
process_resident_memory_bytes{cluster="sls-mall"}/1024/1024Label篩選使用正則匹配
Label的篩選條件支援使用正則文法,例如下面的query篩選了cluster為sls-mall或者sls-demo的指標資料。
process_resident_memory_bytes{cluster=~"sls-mall|sls-demo"}計算某指標各時間點最大值
查詢各cluster中堆記憶體使用量的最大值(max運算元)。
max by (cluster) (go_memstats_heap_inuse_bytes) / 1024 / 1024計算某指標時間軸個數
查詢某個指標的時間軸條數(count運算元)。
count(apiserver_request_total{cluster="sls-mall"})計算指標隨時間的變動率
rate函數用於計算指標在區間內的變動率,常用於計算CPU使用率。
rate(process_cpu_seconds_total[1m])計算指標相較前n分鐘的差值
查詢指標各時刻相較於一分鐘的增量值。
delta(go_goroutines[1m])多運算元、函數嵌套使用
多運算元/函數巢狀查詢,例如下面的例子首先計算各resource和cluster維度下的最大值,再取top3的數值。
topk(3, max by (cluster, resource)(apiserver_request_total))多數值間計算
PromQL支援純數值之間的計算,包括+、-、*、/、%等運算。
1 + 2指標與數值間計算
PromQL支援指標與數值間計算,例如下面的query表示將記憶體指標的byte單位轉換為MB。
process_resident_memory_bytes / 1024 / 1024多指標間二元計算
PromQL支援在多指標間的計算,例如下面兩個指標相除。
kube_daemonset_status_number_ready{job="kube-state-metrics"}
/
kube_daemonset_status_desired_number_scheduled{job="kube-state-metrics"}如何正確使用Subquery
rate、delta、increase、{agg}_over_time等函數僅支援在原指標上進行操作,不支援在運算元或函數的結果集上進行計算,例如:
支援以下形式。
max_over_time(go_goroutines[1m]), 表示計算各時間軸前一分鐘指標內的最大值不支援以下形式。
max_over_time(max(go_goroutines)[1m]), 此運算式意圖先計算各時間軸間的最大值,再從中選取前一分鐘內的最大值。正確使用。
# prometheus提供了Subquery以支援上述需求,PromQL語句需改成以下形式: max_over_time(max(go_goroutines)[1m:10s]) # Subquery中[a:b]的兩個參數分別表示range和step。
使用SQL查詢時序庫案例
查詢指標下的所有未經處理資料
查詢process_resident_memory_bytes指標在指定時間區間內的所有原始時序資料。(調試)
*| SELECT * FROM "metrics_store_name.prom" WHERE __name__ = 'process_resident_memory_bytes'查詢指標中instance為待定值的未經處理資料
查詢指定指標為process_resident_memory_bytes、instance為172.20.0.143:8084的所有指標資料。(調試)
*| SELECT * FROM "metrics_store_name.prom" WHERE __name__ = 'process_resident_memory_bytes' and element_at(__labels__, 'instance')='172.20.0.143:8084' limit all使用SQL對時序資料做彙總計算建立定時SQL任務
將時間對齊到每分鐘做一次MAX彙總計算,使用SQL計算不同instance下的指標最大值。(調試)
*| SELECT __time_nano__ FROM "metrics_store_name.prom" WHERE __name__ = 'process_resident_memory_bytes' and element_at(__labels__, 'instance')='x-abcd'