Прометей проблема многих ко многим для кубе cronjobs

Привет,

Я пытаюсь настроить мониторинг и оповещение Kubernetes Cronjobs с помощью Prometheus. Я нашел это полезное руководство

Но я всегда получаю совпадение "многие ко многим" не разрешено: совпадающие метки должны быть уникальными с одной стороны ошибки.

Например, это запрос 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"}

Есть что-то, чего я здесь не хватает? Та же самая ошибка "многие ко многим" происходит с каждым запросом, который я пробовал из руководства. Даже создание его самостоятельно с нуля привело к той же ошибке. Надеюсь, вы можете помочь мне здесь:)

5 ответов

Когда я читал эту статью, я столкнулся с той же проблемой, но на самом деле я получаю повторяющиеся имена вакансий, но в разных пространствах имен.

Бывший. При беге 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)

По сути, пришлось применить этот принцип ко всем остальным запросам, чтобы он работал у меня. Не уверен, что это применимо к вашему случаю.

В моем случае я не получаю эту дополнительную метку от Prometheus при установке через helm (stable/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 - config с опцией 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__=

Замена 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)

Что касается отсутствующих меток — убедитесь, что ваши kube-state-metrics настроены с помощью --metric-labels-allowlist. Это «новое», так как kube-state-metrics v2. См. https://kubernetes.io/blog/2021/04/13/kube-state-metrics-v-2-0/#what-is-new-in-v2-0 .

По умолчанию метрика содержит только метки имени и пространства имен.

Но... оригинальное руководство все равно не работает с более новыми kube-state-metrics. Я могу порекомендовать это руководство , которое является переработкой и не нуждается в ярлыках.

Я углубился в эту проблему немного больше, и я предполагаю, что основная причина этого заключается в выражении соответствия векторов "один ко многим":

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

где модификатор группы "GROUP_RIGHT()" предполагает, что каждый векторный элемент с левой стороны (kube_job_status_start_time) может совпадать с несколькими элементами с правой стороны (kube_job_labels) на основе общей метки (job_name). Дело в том, что мы действительно имеем дело с сопоставлением "многие ко многим", поскольку каждый элемент вектора с правой стороны также может сопоставлять несколько элементов с левого вектора:

Я думаю, что здесь нам не хватает способа уникальной идентификации экспортированных объектов Job из K8S от Prometheus. Автор этого блога упоминает об этой функции в своей настройке:

... Прометей разрешает эту коллизию имен меток, включая метку необработанной метрики в качестве метки exported_job...

В моем случае я не получаю эту дополнительную метку от Prometheus при установке через helm (stable/prometheus-operator).

Другие вопросы по тегам