PQL手册

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;如果存在,那么 `(.*?)` 匹配到最后一个 `-`之前,得到的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 的查询结果,基本上符合预期

image.png

但是看 query 的查询结果就不对了,查到的竟然是 0 值,不是我们预期的


image.png

先看看原始的指标,可以看到只持续了两分钟的 0 值,上述的表达式查到的就是 0 值了


image.png

造成这种现象的原因是什么呢?需要拆步骤分析下:

  • 首先,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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容