【问题标题】:Prometheus many-to-many problem for kube cronjobskube cronjobs 的 Prometheus 多对多问题
【发布时间】:2019-05-31 04:55:06
【问题描述】:

你好,

我正在尝试使用 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"}

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

【问题讨论】:

  • 在遵循此 Medium 指南时,我在 Prometheus 沙箱环境中观察到相同的 many-to-many 错误。对我来说,它们是随机发生的。我的意思是在某些情况下,相同的查询成功完成,另一次失败。

标签: kubernetes prometheus promql kube-state-metrics


【解决方案1】:

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

例如。运行时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)

基本上必须将该原则应用于所有其他查询,才能为我工作。不确定这是否适用于您的情况。

【讨论】:

    【解决方案2】:

    在我的情况下,当通过 helm (stable/prometheus-operator) 安装时,我没有从 Prometheus 获得这个额外的标签。

    您需要在 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
    

    无论如何,如果我有这样的(我现在有exported_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__=
    

    【讨论】:

      【解决方案3】:

      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)
      

      【讨论】:

        【解决方案4】:

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

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

        其中组修饰符“GROUP_RIGHT()”表明,左侧的每个向量元素 (kube_job_status_start_time) 可以根据公共标签 (job_name) 与右侧的多个元素 (kube_job_labels) 匹配。问题是我们在这里真正处理的是多对多匹配,因为右侧的每个向量元素也可以匹配左侧向量的多个元素:

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

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

        在我的情况下,当通过 helm (stable/prometheus-operator) 安装时,我没有从 Prometheus 获得这个额外的标签。

        【讨论】:

        • 我遇到了同样的问题,作业没有exported_job 标签。在此期间,您是否找到了通过进行任何配置更改来获取此exported_job 标签的方法?
        猜你喜欢
        • 2021-04-30
        • 1970-01-01
        • 2021-10-27
        • 2019-03-08
        • 2011-07-07
        • 2012-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多