Prometheus avg_over_time и если не содержит слишком много данных

#prometheus #prometheus-blackbox-exporter

#prometheus #prometheus-черный ящик-экспортер

Вопрос:

на одной из моих панелей мониторинга Grafana я бы хотел показать все показатели экземпляров, у которых были некоторые простои в течение проверенного периода времени (последние 12 часов). Но отфильтруйте все остальные без простоев.

Я использую данные, предоставленные экспортером prometheus blackbox, и мне бы хотелось получить avg_over_time для всех экземпляров, которые не доступны на 100% в течение рассматриваемого мной периода времени (например, 12 часов).

Мой базовый запрос выглядит следующим образом:

 avg_over_time(probe_success{job="blackbox"}[15m])
  

Чтобы отфильтровать все, что вело себя не так, как ожидалось, я попробовал sth. вот так (пытался сохранить его читаемым):

 _base_qery_ unless on(instance) _base_qery_ < 0.95 
  

Но это также будет включать в себя серии с метками экземпляров, которые не отображаются в _base_qery_ < 0.95 .

Из официальной документации я ожидал такого типа фильтрации

vector1, если vector2 не приводит к вектору, состоящему из элементов vector1, для которых в vector2 нет элементов с точно совпадающими наборами меток. Все совпадающие элементы в обоих векторах удаляются.

Моим обходным решением на данный момент является этот запрос (где 12 часов — это полный временной диапазон, который я наблюдаю с помощью Grafana):

     avg_over_time(probe_success{job="blackbox"}[15m]) and avg_over_time(probe_success{job="blackbox"}[12h]) < 1
  

Но я бы хотел, чтобы версия с 15-минутным диапазоном работала.

Комментарии:

1. Мне действительно трудно разобрать ваш вопрос. Вы говорите, что хотите «все показатели, у которых было некоторое время простоя» (я полагаю, вы имеете в виду «экземпляры», а не «метрики»). Но тогда ваш запрос AFAICT возвращает все экземпляры, у которых было время безотказной работы более 95%, то есть те, у которых не было простоев. ( unless делает именно то, что написано на tin, просто вы можете использовать его неправильно.) И, наконец, я не понимаю, что с 15m и 12h : вы хотите, чтобы среднее время безотказной работы измерялось в течение 15 минут или 12 часов? И что мешает вам использовать avg_over_time(probe_success{job="blackbox"}[15m]) < 1 ?

2. avg_over_time(probe_success{job="blackbox"}[15m]) < 0.95 отфильтровывает все, что выше 0,95… это то, на что я хочу обратить внимание. Но я хочу, чтобы все измерения для них проводились в более длительные сроки. Вы правы, я мог бы использовать <1 — но это не отвечает, почему unless работает по-другому.

3. Я все еще не понимаю вашего вопроса. AFAICT avg_over_time(probe_success{job="blackbox"}[15m]) < .95 (или 1 , или что-то еще) должен дать вам именно то, что вы хотите. Замените на 15m , 12h и вы получите цели, у которых было менее 95% (или 100%) простоев за последние 12 часов. foo unless foo < .95 точно такой же, как foo >=.95 , т. Е. Он даст вам цели со временем безотказной работы выше 95%. Что (я догадываюсь, не уверен) — это не то, что вы хотите.

4. Например, вы говорите: «Но это также будет включать ряды с instance метками, которые не отображаются в _base_qery_ < 0.95 .» В вашем конкретном случае unless будут возвращены только instance метки, которые не отображаются в запросе с правой стороны (т.Е. Ряд с _base_qery_ >= 0.95 ). Это именно то, что он должен делать.

5. Спасибо, что держитесь. Да, вы правы — это то, что происходит, НО в документации говорится: with exactly matching label sets … и это заставило меня задуматься, что значения меток имеют значение, но они этого не делают