在Prometheus项目中遇到了这样一个情况:
某系统产生了两个数据:
A数据包含了多个label,值恒为1,作用是将多个label进行关联。
tair_relation{
Env="prod",
HytairInstanceId="hytair-2c9438cd28",
Instance="10.10.13.13",
Service="abc",
instance="10.10.13.13:1013",
job="tair-exporter"
}
B数据仅包含一个label
redis_info{
instance="10.10.13.13"
}
当查询Service="abc"的相关数据时,可通过如下方式构造PQL
sum(tair_relation{Service=~".*abc.*"}) by (instance)
*
sum(redis{command=""}) by (instance)
sum(tair_relation{Service=~".*abc.*"}) by (Service,instance)
* on (instance) group_left
sum(redis{command=""}) by (instance)
sum(tair_relation{Service=~".*abc.*"}) by (Service,instance)
* ignoring (Service) group_left
sum(redis{command=""}) by (instance)
原理:
该PQL类似SQL的left join,通过label :Service筛选出一个若干数据,通过sum by(Service,instance)将label进行压缩。值恒为1,与下文数据做乘法,不会影响计算结果。
在与右侧的数据进行关联直接进行乘法运算。这里有个隐形的约束:双方的label需要相同,如果左右两侧均只有label:instance,可直接通过运算符连接。
如果不通,需要通过 on (instance) group_left进行明示。
参考内容:
运算符:+ - * / > < ==
其他关联方时:
a * b
a * on (labela) group_left b
a * ignoring(labelb) group_left b
a * on(labela) group_right b
a * ignoring(labelb) group_left b