从系列结果 PromQL 中省略标签

Posted

技术标签:

【中文标题】从系列结果 PromQL 中省略标签【英文标题】:Omit labels from series results PromQL 【发布时间】:2020-03-13 08:41:39 【问题描述】:

假设我写了一个这样的基本 PromQL 查询

查询: kube_deployment_spec_replicas

结果: kube_deployment_spec_replicasdeployment="mydeployment",endpoint="myendpoint",instance="myinstance",job="myjob",namespace="default",pod="mypod",service="myservice"

有没有一种干净的方法可以从结果时间序列中省略 instancepod

期望: kube_deployment_spec_replicasdeployment="mydeployment",endpoint="myendpoint",job="myjob",namespace="default",service="myservice"

【问题讨论】:

为什么要这样做?您不能只删除标签,因为作为查询的结果,您需要具有唯一的时间序列,而简单地删除标签会违反该约束。 @Oliver 这些指标是通过 kube-state-metrics 作业收集的。当作业扩大和缩小时,这些指标的实例和 pod 标签会发生变化。这会导致 prometheus alertmanager 可能将 prometheus 警报的状态从触发更改为挂起。 所有指标都一样吗?那么为什么不按照 Sergio 的建议使用 max 或 avg 将时间序列减少到每个部署只有一个。 【参考方案1】:

您需要使用 Prometheus 查询运算符。您可以根据用例使用 avg 或 sum。

您可以在这里查看更多信息:here

【讨论】:

如问题所示,我的查询不使用内置函数,使用内置函数不会达到预期的行为。另外,我正在尝试以干净的方式完成此操作(没有嵌套的 label_replaces)【参考方案2】:

按照 Sergio 的建议,尝试使用以下内容:

sum(kube_deployment_spec_replicas) without (instance, pod)

此查询将从结果中删除 instancepod 标签。请注意,如果有多个 kube_deployment_spec_replicas 时间序列具有相同的 (instance, pod) 标签集,则查询将无法按预期工作。在这种情况下,查询将总结这些时间序列。

附言MetricsQL 通过label_del 函数提供了更明显的删除标签的解决方案:

label_del(kube_deployment_spec_replicas, "instance", "pod")

【讨论】:

以上是关于从系列结果 PromQL 中省略标签的主要内容,如果未能解决你的问题,请参考以下文章

PromQL - 如何获得结果值之间的间隔

Grafana PromQL 无法读取未定义的属性“结果”

使用 promql 获取结果总数或高于阈值的百分比

Prometheus/PromQL 减去两个量规指标

具有相关字段但标签不同的 promql 示例

彻底理解Prometheus查询语法