Prometheus PromQL語法
一、PromQL語法
1.1、什么是PromQL
PromQL(Prometheus Query Language)是 Prometheus 自己開發的表達式語言,語言表現力很豐富,內置函數也很多。使用它可以對時序數據進行篩選和聚合。
1.2、數據類型
PromQL 表達式計算出來的值有以下幾種類型:
瞬時向量 (Instant vector): 一組時序,每個時序只有一個采樣值區間向量 (Range vector): 一組時序,每個時序包含一段時間內的多個采樣值標量數據 (Scalar): 一個浮點數字符串 (String): 一個字符串,暫時未用
1.2.1、瞬時向量選擇器
瞬時向量選擇器用來選擇一組時序在某個采樣點的采樣值。最簡單的情況就是指定一個度量指標,選擇出所有屬於該度量指標的時序的當前采樣值。比如下面的表達式:
apiserver_request_total

可以通過在后面添加用大括號包圍起來的一組標簽鍵值對來對時序進行過濾。比如下面的表達式篩選出了 job 為 kubernetes-apiservers,並且 resource為 pod的時序:
apiserver_request_total{job="kubernetes-apiserver",resource="pods"}
匹配標簽值時可以是等於,也可以使用正則表達式。總共有下面幾種匹配操作符:
=:完全相等
!=: 不相等
=~: 正則表達式匹配
!~: 正則表達式不匹配
# 下面的表達式篩選出了container是kube-scheduler或kube-proxy或kube-apiserver的時序數據
container_processes{container=~"kube-scheduler|kube-proxy|kube-apiserver"}
1.2.2、區間向量選擇器
區間向量選擇器類似於瞬時向量選擇器,不同的是它選擇的是過去一段時間的采樣值。可以通過在瞬時向量選擇器后面添加包含在 [] 里的時長來得到區間向量選擇器。比如下面的表達式選出了所有度量指標為apiserver_request_total且resource是pod的時序在過去1 分鍾的采樣值。
# 這個不支持Graph,需要選擇Console,才會看到采集的數據
apiserver_request_total{job="kubernetes-apiserver",resource="pods"}[1m]

說明:時長的單位可以是下面幾種之一:
s:seconds
m:minutes
h:hours
d:days
w:weeks
y:years
1.2.3、偏移向量選擇器
前面介紹的選擇器默認都是以當前時間為基准時間,偏移修飾器用來調整基准時間,使其往前偏移一段時間。偏移修飾器緊跟在選擇器后面,使用 offset 來指定要偏移的量。比如下面的表達式選擇度量名稱為apiserver_request_total的所有時序在 5 分鍾前的采樣值。
apiserver_request_total{job="kubernetes-apiserver",resource="pods"} offset 5m
下面的表達式選擇apiserver_request_total 度量指標在 1 周前的這個時間點過去 5 分鍾的采樣值。
apiserver_request_total{job="kubernetes-apiserver",resource="pods"} [5m] offset 1w
1.2.4、聚合操作符
PromQL 的聚合操作符用來將向量里的元素聚合得更少。總共有下面這些聚合操作符
sum:求和
min:最小值
max:最大值
avg:平均值
stddev:標准差
stdvar:方差
count:元素個數
count_values:等於某值的元素個數
bottomk:最小的 k 個元素
topk:最大的 k 個元素
quantile:分位數
1)計算k8s-master1節點所有容器總計內存:
sum(container_memory_usage_bytes{instance=~"k8s-master1"})/1024/1024/1024

2)計算k8s-master1節點最近1m所有容器cpu使用率
sum (rate (container_cpu_usage_seconds_total{instance=~"k8s-master1"}[1m])) / sum (machine_cpu_cores{ instance =~"k8s-master1"}) * 100

3)計算最近1m所有容器cpu使用率

1.2.5、函數
Prometheus 內置了一些函數來輔助計算,下面介紹一些典型的。
abs():絕對值
sqrt():平方根
exp():指數計算
ln():自然對數
ceil():向上取整
floor():向下取整
round():四舍五入取整
delta():計算區間向量里每一個時序第一個和最后一個的差值
sort():排序
