Prometheus 基于 Labels 的过滤

Posted

技术标签:

【中文标题】Prometheus 基于 Labels 的过滤【英文标题】:Prometheus filtering based on Labels 【发布时间】:2020-05-20 21:17:23 【问题描述】:

如何在 Prometheus 查询中添加标签过滤器?

kube_pod_info

kube_pod_infocreated_by_kind="ReplicaSet",created_by_name="alertmanager-6d9f74d4c5",instance="kube-state-metrics:8080",job="kube-state-metrics",namespace="test",pod=" alertmanager-6d9f74d4c5-xlqrv"

kube_pod_labels

kube_pod_labelsinstance="kube-state-metrics:8080",job="kube-state-metrics",label_app="alertmanager",label_pod_template_hash="6d9f74d4c5",namespace="test",pod="alertmanager- 6d9f74d4c5-xlqrv”,label_source="k8s"

在这里,我在 prometheus 中有 kube_pod_info 和 kube_pod_labels 的 kube 状态指标信息。

kube_pod_infonamespace="test" ---> 按命名空间测试过滤 pod。

在这里,我也想包含基于标签的过滤器。我在 kube_pod_labels 中有一个名为“label_source=”k8s”的标签。如何加入 kube_pod_info 和 kube_pod_labels 来应用标签过滤器?

【问题讨论】:

【参考方案1】:

您可以使用+ 运算符加入指标。在这里,group_left() 将包含额外的标签:label_source 来自正确的度量标准kube_pod_labels。您加入的指标被强制为零(即0 * kube_pod_labels),这样它就不会影响第一个指标的结果。

(
kube_pod_infonamespace="test"
)
   + on(namespace) group_left(label_source)
(
   0 * kube_pod_labels
)

【讨论】:

执行查询时出错:在操作的右侧找到匹配组 namespace="test1" 的重复系列:... ..... 多对多匹配不允许:匹配的标签在一侧必须是唯一的 @user1578872,是的,这是有意的。您需要通过唯一标签连接两个指标。比如on(instance) group_left(label_source)【参考方案2】:

根据“Join Metrics”文档here,您基本上可以将kube_pod_info 查询中的标签与kube_pod_labels 查询中的标签组合起来。

类似这样的事情:

kube_pod_infonamespace="test" * on (namespace, pod) group_left() kube_pod_labelslabel_source="k8s"

此查询应为您提供命名空间 test 中的所有 Pod,它们的 source 标签设置为 k8s

【讨论】:

以上是关于Prometheus 基于 Labels 的过滤的主要内容,如果未能解决你的问题,请参考以下文章

k8s-prometheus

Prometheus 更换 labels tag 后,Grafana 出现 Multiple Series Error 错误

如果我们不在 Prometheus 中为灭霸解释任何 external_labels 怎么办

helm Prometheus values.yaml 的 alertmanager.yml 部分中的 external_labels 配置出错

******Prometheus***********

[转帖]基于docker 搭建Prometheus+Grafana