PromQL:在按实例分组时访问实例的指标

Posted

技术标签:

【中文标题】PromQL:在按实例分组时访问实例的指标【英文标题】:PromQL: Access metric for instance while grouping by instance 【发布时间】:2022-01-11 18:38:31 【问题描述】:

有没有办法在按实例分组时访问当前实例。我要做的是在对实例进行分组时获取 kube_node_status_capacity_cpu_cores。

目前我正在硬编码 cpu 内核的数量,但我想对其进行参数化,因为节点可能具有不同数量的内核。

我现在的 promQL 查询:

(1 - (avg by (instance) (rate(node_cpu_seconds_totalmode="idle"[15s])))) * 0.007 + 0.23) * 165 * 1.125 * 4) 

其中 4 是 CPU 的数量。我现在想要的是类似

(1 - (avg by (instance) (rate(node_cpu_seconds_totalmode="idle"[15s])))) * 0.007 + 0.23) * 165 * 1.125 * kube_node_status_capacity_cpu_coresinstance=currentInstance) 

感谢您的帮助

编辑

我现在知道为什么使用 on(instance) 的方法不起作用了。左侧的实例标签是提供 cpu 时间的节点导出器的 ip。右边的实例是 kube-state-metrics pod 的 ip。

我真正需要的是以某种方式将状态指标中的节点映射到相关节点导出导出器的节点名称上。有什么想法吗?

编辑 2

在我的具体情况下,我正在寻找不同的查询。但是接受的答案实际上对将来的参考很有帮助,因为如果我正确地描述了这个案例,它就会正确地回答问题。

【问题讨论】:

【参考方案1】:

你可以使用on()操作符:

sum by(instance) (metric1) * on(instance) metric2 * 0.007 + 0.23

如果只有一个metric2instance 匹配,它将起作用。否则,您需要对metric2 应用一些聚合(例如使用sum()avg() 等),或者过滤掉不相关的时间序列(metric2foo="bar")。在docs 中详细了解一对一矢量匹配。

【讨论】:

我收到以下错误:在操作的右侧找到匹配组 instance="ip" 的重复系列:[__name__="my_metric", instance="ip ", job="kubernetes-service-endpoints", kubernetes_name="kube-state-metrics", kubernetes_namespace="XXX", name="kube-state-metrics", node="XXX-00", __name__= "my_metric", instance="ip", job="kubernetes-service-endpoints", kubernetes_name="kube-state-metrics", kubernetes_namespace="XXX", name="kube-state-metrics", node="XXX -01"];不允许多对多匹配:匹配的标签在一侧必须是唯一的 这是有道理的,因为我在两端都有多个节点。我现在想通过它们唯一的节点名称来匹配它们 @msts1906 实例和节点都可以:by(instance, node)on(instance, node) 等等。 查询没有失败,但为空。如果我说 by(instance), on(node),它也不会失败,但它仍然是空的 @msts1906 等等,这没有意义。您将获得1 - sum(rate(node_cpu_seconds_totalmode"idle")) by (instance),这是每个实例的平均 CPU 使用率。然后你想将它乘以数量或核心。那是对的吗?如果是这样,将avg替换为sum,就不需要使用内核了。

以上是关于PromQL:在按实例分组时访问实例的指标的主要内容,如果未能解决你的问题,请参考以下文章

使用 PromQL 分组

PromQL:查找低于平均水平的向量元素

午夜范围内小时()的 PromQL 使用情况

PromQL 正确获取 CPU 使用百分比

在 Prometheus/PromQL 中合并/加入两个指标

PromQL 查询以选择其值包含在给定的多选变量中的指标