表达式为
label_replace(up{job="apiserver"}, "host_ip", "$1", "instance", "(.*):.*") * on (host_ip) group_left(node_name) up{job="node-exporter", instance=~"[0-9.]*:9100"}
表达式可以简化理解为:
<vector expr1> <运算符> on (<label>) group_left(<label>) <vector expr2>
具体:
on(host_ip) 用于向量匹配,也就是乘法运算符左右两侧的表达式中通过 host_ip 标签来匹配,两边的 host_ip 相等的才会进行运算。
group_left() 表示多对一的关系,即左侧每个值都逐一与右侧的值进行运算。group_left() 的参数是右侧的标签名,其会将此标签值传递给左侧,也就是出现在运算的结果中,并且覆盖左侧同名标签
输出:
-
expr1表达式:label_replace(up{job="apiserver"}, "host_ip", "$1", "instance", "(.):.")
分析:expr1有 10.20.0.7,10.20.0.8,10.20.0.9 共计3组host_ipimage.png -
expr2表达式:up{job="node-exporter", instance=~"[0-9.]*:9100"}
image.png分析:host_ip有 10.20.0.4, 10.20.0.5 ,10.20.0.6,10.20.0.7,10.20.0.8,10.20.0.9 共计6组host_ip。乘法运算符左右两侧的表达式中通过 host_ip 标签来匹配,两边的 host_ip 相等的才会进行运算。
- 总表达式:label_replace(up{job="apiserver"}, "host_ip", "$1", "instance", "(.):.") * on (host_ip) group_left(node_name) up{job="node-exporter", instance=~"[0-9.]*:9100"}
分析:group_left() 表示多对一的关系,即左侧每个值都逐一与右侧的值进行运算。group_left(node_name) 的参数是右侧的标签名,其会将此标签值传递给左侧,也就是出现在运算的结果中出现的node_name的label。原来expr1中并没有node_name的标签image.png


