#kubernetes #prometheus
#kubernetes #prometheus
Вопрос:
В настоящее время я использую следующий запрос
sum(rate(kube_pod_container_status_restarts_total{namespace="default"}[5m]))
чтобы получать предупреждения при перезапуске 1 или более контейнеров в пространстве имен по умолчанию.
Это дает мне количество перезапущенных контейнеров, но не их имена. Есть ли способ получить имя перезапущенных контейнеров?
Спасибо вам.
Комментарии:
1. Вы можете выполнить поиск
Pods
, который был перезапущен с помощью этого запроса:kube_pod_container_status_restarts_total{namespace="NAMESPACE"} >= 1
. Это то, что вы ищете? Он>=
предназначен для отображения только контейнеров со значениемRestarts
, равным 1 или более.
Ответ №1:
Попробуйте следующий запрос
sum (changes (kube_pod_container_status_restarts_total[1m])) by (container,container_name,endpoint,instance,job,name,namespace, pod, pod_name,service)
Ответ №2:
На мой взгляд, подход к решению проблемы заключается в том, чтобы действительно понять, что вам нужно:
- вам нужно получить некоторую значимую информацию из меток (имя, пространство имен и т. Д.)
- вам нужно получить правильное значение перезапусков, которые произошли за определенный период времени
- вам нужно получить только проблемы (поскольку это предупреждение, а не график).
Тогда, я думаю, вам следует подумать об этом:
- проверьте свои ярлыки — посмотрите, какие из них вам нужны, а какие нет. Если вы это сделаете, вы даже увидите, что вам не нужно использовать
sum
здесь.sum
это функция агрегирования, которая суммирует временные ряды. Если вы ожидаете суммировать количество перезапусков для 5m — это не тот случай. Есть еще одна функция —sum_over_time
но она не имеет смысла для этой конкретной метрики (метрика — это счетчик). Если вы не используете sum, вы получите все метки. Если вы хотите сгруппировать перезапуски по какому-либо коэффициенту (например, у вас есть модули с несколькими контейнерами), тогда вам следует использовать sum withby (<label_1>, <label_2>, ...)
. - итак, вы хотите получить перезапуски за определенный период времени (5m в вашем случае). У вас есть
kube_pod_container_status_restarts_total
, который является счетчиком. В этом смысле счетчик означает, что всякий раз, когда происходит перезапуск, счетчик увеличивается. В других ответах было предложено использовать этуchanges
функцию. Это нормально, но это не распространяется на случай, когда перезапуски происходят так быстро, что Prometheus не успел подтвердить это — от 0 до 3 до 5 … В этом примере лучше на самом деле проверить, какое значение сейчас, и сравнить его с тем, что было 5 м назад. Это можно сделать с помощьюoffset
:
kube_pod_container_status_restarts_total{namespace="default"} - kube_pod_container_status_restarts_total{namespace="default"} offset 5m
- в данном случае способ структурирования кода PromQL для создания предупреждения заключается в добавлении двоичного оператора сравнения. Просто сказал:
kube_pod_container_status_restarts_total{namespace="default"} -
kube_pod_container_status_restarts_total{namespace="default"} offset 5m
> 0
Таким образом, вы получите только те контейнеры, которые были перезапущены.
Итак, подводя итог моему ответу — если бы я был на вашем месте и хотел узнать, какие модули (не контейнеры) перезапускались за последние 5 м, и добавить всю мою значимую информацию в выходные данные, я бы сделал что-то вроде:
sum by (pod, namespace, cluster)
(
kube_pod_container_status_restarts_total{namespace="default"} -
kube_pod_container_status_restarts_total{namespace="default"} offset 5m
) > 0
Просто убедитесь, что вы проверили метки… они отличаются от кластера к кластеру и от реализации к реализации (даже от версии экспортера).