label_join
label_join(<vector>, "<new_label>", "<separator>", "<label1>", "<label2>", ...)
使用分隔符拼接多个标签形成一个新的标签,新的标签会打在 vector 里面
比如,通过多个标签来拼接 hpa 名称
label_join(max(kube_deployment_labels{label_app=~"web-transfer"}) by(label_app,label_tag,namespace,cluster,label_optional_tag,project), "hpa", "-", "label_app", "label_tag", "label_optional_tag")
label_replace
label_replace(<vector>, "<dst_label>", "<replacement>", "<src_label>", "<regex>")
对源标签 src_label 进行正则匹配分组,将替换内容重新写入到标签 dst_label 中,dst_label 可以是 src_label 一样,那就是更新标签内容了;
替换的内容,可以使用正则分组,如 $1
比如在上述 label_join 中,如果最后一个参与的标签 label_optional_tag 是空的,那么拼接出来的 hpa 名称最后就会多出一个连接符 -
;这种情况就可以使用 label_replace 来移除这个多出的连接符
label_replace(label_join(max(kube_deployment_labels{label_app=~"web-transfer"}) by(label_app,label_tag,namespace,cluster,label_optional_tag,project), "hpa", "-", "label_app", "label_tag", "label_optional_tag") , "hpa", "$1", "hpa", "(.*?)(-)?")
因为是对 hpa 标签进行更新,所以 src_label 和 dst_label 都是 hpa
(.*?)(-)?
正则会优先匹配 hpa 名称最后的-
,如果不存在,那么(.*?)
匹配整个字符串,得到1 移除了最后的连接符
sum_over_time这类 xxx_over_time
有这样一个PQL
sum_over_time(min(kube_hpa_status_condition{type="AbleToScale",hpa="web-transfer-a-eu"}) by(hpa,namespace,cluster)[5m]) == 0
想要表达的本意是统计过去 5min 时间内,指定 HPA 是否能够正常触发的累计值,如果持续 5min 中的都是0,那么累计值也是0,就需要进行一些告警之类的;
但是这个写法会有些问题
先去掉后面的 ==0
看看 query_range 的查询结果,基本上符合预期
但是看 query 的查询结果就不对了,查到的竟然是 0 值,不是我们预期的
先看看原始的指标,可以看到只持续了两分钟的 0 值,上述的表达式查到的就是 0 值了
造成这种现象的原因是什么呢?需要拆步骤分析下:
首先,
min(kube_hpa_status_condition{type="AbleToScale",hpa="web-transfer-a-eu"}) by(bhpa,namespace,project)
这个查询是一个 瞬时聚合,得到的是常量(Instant Vector)其次,sum_over_time() 不能直接作用于 aggregation by(...) 的结果,因为后者的 query 查询结果是一个常量,而不是 Range Vector 时间序列了
瞬时聚合(Instant Vector)直接套上
[5m]
是没有意义的
正确的写法
min(sum_over_time(kube_hpa_status_condition{type="AbleToScale",hpa="web-transfer-a-eu"}[5m])) by(hpa,namespace,cluster)
先对时间序列进行 sum_over_time 操作,指标本身是一个 Range Vector 时间序列
然后再通过 min() by 来筛除相同 hpa 的序列,同时只取相同 hpa 序列的最小值
increase
increase(<counter_metric>[<range>])
用于计算一个 counter 类型指标在一段时间内的增加量,特别适合用于查看 “在过去一段时间内增加了多少”。
比如:
increase(kube_pod_container_status_restarts_total[5m]) > 0