普罗米修斯的kube cronjobs多对多问题

时间:2019-01-04 15:37:30

标签: kubernetes prometheus promql kube-state-metrics

嗨,

我正在尝试使用Prometheus配置Kubernetes Cronjobs监视和警报。我发现这很有帮助guide

但是我总是得到多对多匹配:匹配标签的一侧必须唯一错误。

例如,这是触发此错误的PromQL查询:

max( kube_job_status_start_time * ON(job_name) GROUP_RIGHT() kube_job_labels{label_cronjob!=""} ) BY (job_name, label_cronjob)

查询本身会导致例如这些指标

kube_job_status_start_time kube_job_status_start_time{app="kube-state-metrics",chart="kube-state-metrics-0.12.1",heritage="Tiller",instance="REDACTED",job="kubernetes-service-endpoints",job_name="test-1546295400",kubernetes_name="kube-state-metrics",kubernetes_namespace="monitoring",kubernetes_node="REDACTED",namespace="test-develop",release="kube-state-metrics"}

kube_job_labels {label_cronjob!=“”} kube_job_labels{app="kube-state-metrics",chart="kube-state-metrics-0.12.1",heritage="Tiller",instance="REDACTED",job="kubernetes-service-endpoints",job_name="test-1546295400",kubernetes_name="kube-state-metrics",kubernetes_namespace="monitoring",kubernetes_node="REDACTED",label_cronjob="test",label_environment="test-develop",namespace="test-develop",release="kube-state-metrics"}

我这里缺少什么吗?我在指南中尝试的每个查询都发生相同的多对多错误。 即使我自己从头开始构建它,也会导致相同的错误。 希望你能在这里帮助我:)

4 个答案:

答案 0 :(得分:1)

就我而言,通过头盔(稳定/ prometheus-operator)安装时,我没有从普罗米修斯那里得到这个额外的标签。

您需要在Prometheus中进行配置。它调用:honor_labels:false

# If honor_labels is set to "false", label conflicts are resolved by renaming
# conflicting labels in the scraped data to "exported_<original-label>" (for
# example "exported_instance", "exported_job") and then attaching server-side
# labels.

因此,您必须配置prometheus.yaml文件-使用选项honor_labels配置:false

# Setting honor_labels to "true" is useful for use cases such as federation and
# scraping the Pushgateway, where all labels specified in the target should be
# preserved

无论如何,如果我有这样的问题(我现在有exports_jobs),仍然无法进行正确的查询,但是我想仍然是因为我的LHS。

Error executing query: found duplicate series for the match group 
{exported_job="kube-state-metrics"} on the left hand-side of the operation: 
[{__name__=

答案 1 :(得分:0)

我对这个问题进行了更多研究,我想它的根本原因是在这个一对多向量匹配表达式中:

kube_job_status_start_time * ON(job_name) GROUP_RIGHT() kube_job_labels{label_cronjob!=""}

其中的组修饰符“ GROUP_RIGHT()”建议,基于通用标签(job_name),左侧的每个向量元素(kube_job_status_start_time)可以与右侧的多个元素(kube_job_labels)匹配。问题是,我们实际上是在进行多对多匹配,因为右侧的每个向量元素也可以匹配左侧向量的多个元素:

enter image description here enter image description here

我认为我们缺少的是Prometheus从K8S唯一标识导出的Job对象的方法。这篇博客的作者在其设置中提到了此功能:

  

... Prometheus通过包含   原始指标的标签作为export_job标签...

就我而言,通过头盔(稳定/ prometheus-operator)安装时,我没有从普罗米修斯那里得到这个多余的标签。

答案 2 :(得分:0)

kube_job_status_start_time替换为max(kube_job_status_start_time) by (job_name)将汇总出所有重复项,并应解决该错误。

结果查询如下所示

       max(
            max(kube_job_status_start_time) by (job_name)
            * ON(job_name) GROUP_RIGHT()
            kube_job_labels{label_cronjob!=""}
          ) BY (job_name, label_cronjob)

答案 3 :(得分:0)

我在关注那篇文章时遇到了同样的问题,但对我来说,我实际上得到了重复的作业名称,但在不同的命名空间中。

例如。运行 kube_job_status_start_time 时:

kube_job_status_start_time{instance="REDACTED",job="kube-state-metrics",job_name="job-abc-123",namespace="us"}
kube_job_status_start_time{instance="REDACTED",job="kube-state-metrics",job_name="job-abc-123",namespace="ca"}

所以我必须为命名空间添加过滤器或将命名空间添加到 ON/BY 子句中以使其唯一。

例如对于我必须这样做的子查询之一:

   max(
      kube_job_status_start_time
      * ON(namespace, job_name) GROUP_RIGHT()
      kube_job_labels{label_cronjob!=""}
    ) BY (namespace, label_cronjob)

基本上必须将该原则应用于所有其他查询,以便它对我有用。不确定这是否适用于您的情况。