PromQL 中的 group_left 和 group_right 的操作函数,别离提供了 Many2One 和 One2Many 的语义,让 2 个不同的指标能够进行 join。
残缺的语法模式:
<vector expr> <bin-op> ignoring(<label list>) group_left(<label list>) <vector expr>
<vector expr> <bin-op> ignoring(<label list>) group_right(<label list>) <vector expr>
<vector expr> <bin-op> on(<label list>) group_left(<label list>) <vector expr>
<vector expr> <bin-op> on(<label list>) group_right(<label list>) <vector expr>
官网的 demo 比拟难了解,这里提供一个比拟切合实际应用的 demo。
2 个输出指标:
- kube_pod_spec_volumes_persistentvolumeclaims_info:标识 pvc 和 pod 的挂载信息;
- kubelet_volume_stats_used_bytes / kubelet_volume_stats_capacity_bytes:标识 pvc 的使用量 / 总量信息;
kube_pod_spec_volumes_persistentvolumeclaims_info
kube_pod_spec_volumes_persistentvolumeclaims_info{__type__="gauge",instance="127.0.0.1:9999",job="pvc-test",namespace="default",persistentvolumeclaim="myclaim",pod="nginx-pv-1"} 1
kube_pod_spec_volumes_persistentvolumeclaims_info{__type__="gauge",instance="127.0.0.1:9999",job="pvc-test",namespace="default",persistentvolumeclaim="myclaim",pod="nginx-pv-2"} 1
kube_pod_spec_volumes_persistentvolumeclaims_info{__type__="gauge",instance="127.0.0.1:9999",job="pvc-test",namespace="default",persistentvolumeclaim="myclaim",pod="nginx-pv-3"} 1
kube_pod_spec_volumes_persistentvolumeclaims_info{__type__="gauge",instance="127.0.0.1:9999",job="pvc-test",namespace="default",persistentvolumeclaim="myclaim--2",pod="busybox-xxx"} 1
kube_pod_spec_volumes_persistentvolumeclaims_info{__type__="gauge",instance="127.0.0.1:9999",job="pvc-test",namespace="default",persistentvolumeclaim="myclaim--2",pod="busybox-yyy"} 1
kubelet_volume_stats_used_bytes / kubelet_volume_stats_capacity_bytes
{__type__="gauge",instance="127.0.0.1:9999",job="pvc-test",namespace="default",persistentvolumeclaim="myclaim"} 0.5
{__type__="gauge",instance="127.0.0.1:9999",job="pvc-test",namespace="default",persistentvolumeclaim="myclaim--2"} 0.25
指标:
- 通过 2 个指标的 join,失去每个 pod 及其挂载的 pvc 的使用率;
答案:
kube_pod_spec_volumes_persistentvolumeclaims_info + on(namespace,persistentvolumeclaim) group_left 100*(kubelet_volume_stats_used_bytes / kubelet_volume_stats_capacity_bytes)
- 应用 group_left 实现了 Many2One 的语义;
- 2 个指标 join 时,以 name 和 persistentvolumeclaim 为维度;
后果:
{__type__="gauge",instance="127.0.0.1:9999",job="pvc-test",namespace="default",persistentvolumeclaim="myclaim",pod="nginx-pv-1"} 50
{__type__="gauge",instance="127.0.0.1:9999",job="pvc-test",namespace="default",persistentvolumeclaim="myclaim",pod="nginx-pv-2"} 50
{__type__="gauge",instance="127.0.0.1:9999",job="pvc-test",namespace="default",persistentvolumeclaim="myclaim",pod="nginx-pv-3"} 50
{__type__="gauge",instance="127.0.0.1:9999",job="pvc-test",namespace="default",persistentvolumeclaim="myclaim--2",pod="busybox-xxx"} 25
{__type__="gauge",instance="127.0.0.1:9999",job="pvc-test",namespace="default",persistentvolumeclaim="myclaim--2",pod="busybox-yyy"} 25
参考:
1.group_left/group_right 官网 doc:
https://prometheus.io/docs/pr…
2.prometheus 中各种映射关系的实现:
https://iximiuz.com/en/posts/…