PromQL avg_over_time для ненулевых значений

Я пытаюсь получить значение avg_over_time из метрики датчика, но мне нужно, чтобы среднее значение было только из ненулевых значений метрики (или значений выше нуля, если быть точным).

Пример:

avg_over_time(foo[2d] > 0)

Но я всегда получал ошибку синтаксического анализа: binary expression must contain only scalar and instant vector types

Я пробовал настроить правило записи

expr: foo > 0

Но, к сожалению, с тем же результатом.

Возможно ли это в PromQL?


person H. Mares    schedule 24.11.2019    source источник


Ответы (2)


Вы можете использовать подзапрос с версией Prometheus выше 2.7:

avg_over_time((foo > 0)[2d:])
person Michael Doubez    schedule 24.11.2019

Хотя можно использовать подзапрос Prometheus, такой как avg_over_time((foo > 0)[2d:]), как уже упоминал Майкл, предлагаемый запрос может либо пропустить определенные точки данных, либо дважды подсчитать определенные точки данных в зависимости от значения resolution после двоеточия в квадратных скобках. Например, avg_over_time((foo > 0)[2d:1h]) будет учитывать только одну точку необработанных данных за каждый час при вычислении avg_over_time, а avg_over_time((foo>0)[2d:1s]) будет подсчитывать одни и те же точки необработанных данных несколько раз, если интервал очистки для foo превышает 1s. По умолчанию значение resolution равно step значению, переданному в запрос к / api / v1 / query_range, поэтому конечный результат запроса может сильно отличаться в зависимости от step аргумента запроса, переданного в /api/v1/query_range.

Если вам нужно рассчитать точную долю необработанных точек данных, превышающую заданный threshold независимо от step аргумента запроса, взгляните на функцию share_gt_over_time(foo[2d], threshold) из MetricsQL. Эта функция может быть полезна для расчета SLO / SLI за время безотказной работы и / или задержки.

person valyala    schedule 05.07.2020