Prometheus Uptime или SLA в процентах по сравнению с скользящим окном в Grafana

Я хочу создать панель Grafana 'singlestat', которая отображает процентное содержание Uptime или SLA в зависимости от наличия или отсутствия метрик неудачных тестов.

У меня уже есть соответствующая метрика, e2e_tests_failure_count, для разных тестовых фреймворков. Это означает, что следующий запрос возвращает сумму наблюдаемых неудачных тестов:

sum(e2e_tests_failure_count{kubernetes_name=~"test-framework-1|test-framework-2|test-framework-3",kubernetes_namespace="platform-edge"})

Мне уже удалось создать график, который равен "1", если все в порядке, и "0", если есть какие-либо неудачные тесты:

1 - clamp_max(sum(e2e_tests_failure_count{kubernetes_name=~"test-framework-1|test-framework-1|test-framework-1",kubernetes_namespace="platform-edge"}), 1)

введите описание изображения здесь

Теперь я хочу иметь одно процентное значение, которое показывает "время безотказной работы" (= количество времени, в течение которого среда была "хелати") в течение определенного периода времени, например, последних 5 дней. Что-то вроде "99,5%" или, что больше подходит для скриншота, "65%".

Я попробовал что-то вроде этого:

(1 - clamp_max(sum(e2e_tests_failure_count{kubernetes_name=~"service-cvi-e2e-tests|service-svhb-e2e-tests|service-svh-roundtrip-e2e-tests",kubernetes_namespace="platform-edge"}), 1))[5d]

но это только приводит к ошибкам синтаксического анализатора. Гуглинг на самом деле меня не продвинул, так что я надеюсь, что смогу найти здесь помощь:)

2 ответа

Просто понял это, и я считаю, что это дает правильные результаты. Вы должны использовать правила записи, потому что вы не можете создать вектор диапазона из результата вектора экземпляра функции в одном запросе, как вы уже обнаружили (вы получаете ошибку разбора). Таким образом, мы записываем результат функции (который будет вектором экземпляра) как новый временной ряд и используем его в качестве имени метрики в другом запросе, где вы можете затем добавить [5d] выбрать диапазон.

Мы запускаем наши тесты несколько раз в минуту для всех наших сервисов, и каждый сервис ("сервис" - это метка, в которой имя каждого сервиса является значением метки) имеет разное количество тестов, связанных с ним, но если какой-либо из тестов для данная услуга дает сбой, мы считаем это "моментом сбоя". (Количество неудачных испытаний для данной услуги фиксируется в показателях с status="failure" значение метки.) Мы ограничиваем число отказов до 1, чтобы у нас были только нули и единицы для наших значений, и поэтому мы можем вместо этого преобразовать "временной ряд значений ошибок" в "временные ряды значений успеха", используя оператор неравенства и bool модификатор. (См. Этот пост для обсуждения использования bool.) Таким образом, результат первой записанной метрики равен 1 для каждой службы, где все ее тесты были выполнены успешно в течение этого интервала очистки, и 0, если для этой службы был хотя бы один сбой теста.

Если количество сбоев для службы> 0 для всех значений, возвращаемых за любую данную минуту, мы считаем, что эта служба "не работает" в течение этой минуты. (Таким образом, если у нас произошел как сбой, так и успех в данную минуту, это не считается временем простоя.) Вот почему у нас есть вторая записанная метрика, чтобы получить фактические логические значения "для этой минуты". Вторая записанная метрика основана на первой, что нормально, поскольку в документации Prometheus говорится, что записанные метрики выполняются последовательно в каждой группе.

Таким образом, "Время безотказной работы" для любой заданной длительности представляет собой сумму значений "для этой минуты" (т. Е. 1 для каждой продолжающейся минуты), деленное на общее количество минут в продолжительности, какой бы ни была эта продолжительность.

Так как мы определили записанную метрику с именем "minute_up_bool", мы можем затем создать график времени безотказной работы в любом диапазоне, который мы хотим. (Кстати, записанные метрики генерируются только для времен после их первого определения, поэтому вы не получите вчерашние данные временных рядов, включенные в записанную метрику, которую вы определили сегодня.) Вот запрос, который вы можете поместить в Grafana, чтобы показать% времени работы над перемещение окна последних 5 дней:

sum_over_time(minute_up_bool[5d]) * 100 / (5 * 24 * 60)

Итак, это наша конфигурация правил записи:

groups:
- name: uptime
  interval: 1m
  # Each rule here builds on the previous one.
  rules:
  # Get test results as pass/fail => 1/0
  # (label_replace() removes confusing status="failure" label value)
  - record: test_success_bool
    expr: label_replace(clamp_max(test_statuses_total{status="failure"}, 1), "status", "", "", "") != bool 1
  # Get the uptime as 1 minute range where the sum of successes is not zero
  - record: minute_up_bool
    expr: clamp_max(sum_over_time(test_success_bool[1m]), 1)

Вы должны использовать правила записи, потому что вы не можете создать вектор диапазона из результата вектора экземпляра функции в одном запросе.

На самом деле вы можете, используя подзапрос:

      (...some complicated instant subexpression...)[5d:1m]

Это дает такие же результаты, как если бы вы использовали правило записи с интервалом оценки в 1 минуту. Однако правило записи по-прежнему полезно, поскольку позволяет избежать повторного вычисления подвыражения каждый раз.

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