TLDR ;
Вам необходимо преобразовать его в 0 или 1 через Правило записи , которое вы определяете в файле правил, добавьте путь к файлу для чтенияправила от вашего prometheus.yml.
my_metric_below_threshold = (sum(increase(errors[5m])) / sum(increase(requests[5m]))) <= bool 0.1
И тогда вы можете сделать avg_over_time (my_metric_below_threshold [5m])
Полная информация :
В основном вам нужно значение avg_over_time со значениями 0 или 1. Однако результатом модификатора bool является мгновенный вектор.Однако avg_over_time ожидает вектора диапазона типов в своем вызове. мгновенный вектор Vs.вектор диапазона равен .
Мгновенный вектор - набор временных рядов, содержащий одну выборку для каждого временного ряда, все из которых имеют одну и ту же временную метку
Вектор диапазона - наборвременной ряд, содержащий диапазон точек данных во времени для каждого временного ряда
. Для решения этой проблемы используется Правила записи .Вы можете увидеть разговор об этом Prometheus github , об этом вопросе стека и в этом объяснении https://www.robustperception.io/composing-range-vector-functions-in-promql.
В PromQL есть два основных типа функцийкоторые берут в качестве входных данных временные ряды, те, которые берут вектор и возвращают вектор (например, abs, ceil, hour, label_replace), и те, которые берут вектор диапазона и возвращают вектор (например, скорость, производная, предсказание_linear, * _over_time).1036 *
Нет функций, которые берут вектор диапазона и возвращают вектор диапазона, а также нет способа выполнить какую-либо форму подзапроса.Даже с поддержкой подзапросов вы не захотите использовать их регулярно, поскольку они будут дорогими.Так что же делать вместо этого?
Ответ состоит в том, чтобы использовать правило записи для внутренней функции, а затем вы можете использовать внешнюю функцию для создаваемого временного ряда.
Итак, как я объяснил выше и из приведенных выше цитат - взятых у разработчика Core на Prometheus - вы сможете получить то, что вам нужно.
Добавлено после редактирования вопроса:
Выполнениеэто не так просто, так как вам нужна «память» о последних сэмплах.Однако это можно сделать с помощью сборщика текстовых файлов и API Prometheus Http .
Определить my_metric_below_threshold с использованием Правило записи какописано выше.
Установка Узел-экспортер с Сборщик текстовых файлов .
Сборщик текстовых файлов похож на Pushgateway в том, что он позволяет экспортировать статистику из пакетных заданий.Его также можно использовать для экспорта статических метрик, например, какую роль играет машина.Pushgateway должен использоваться для метрик уровня обслуживания.Модуль textfile предназначен для метрик, привязанных к машине.Чтобы использовать его, установите флаг --collector.textfile.directory на экспортере узлов.Сборщик проанализирует все файлы в этом каталоге, соответствующие глобу * .prom, используя текстовый формат.
Напишите скрипт (то есть successive_zeros.py) py / bash, который запускается где угоднозапросить этот показатель с помощью Prometheus Http API GET /api/v1/query
.
Сохранить последовательные нули в качестве параметра среды и очистить или увеличить этот параметр.
Записать результат в запрошенном формате, описанном в Сборщик текстовых файлов документация - чем у вас есть successive_zeros_metrics в Prometheus.
Выполните avg_over_time () над successive_zeros_metrics
Это псевдокодконцепции, о которой я говорю:
#!/usr/bin/python
# Run as the node-exporter user like so:
# 0 1 * * * node-exporter /path/to/runner successive_zeros.py
r = requests.get('prometheus/api/v1/query'))
j = r.json()
......
if(j.get('isUp') == 0)
successive_zeros = os.environ['successive_zeros']
else
successive_zeros = os.environ['successive_zeros']+
os.environ['successive_zeros'] = successive_zeros
......
print 'successive_zeros_metrics %d' % successive_zeros