Прометей - Как повторно использовать отфильтрованные серии, чтобы ускорить время запроса? - PullRequest
0 голосов
/ 19 февраля 2020

Теперь я использую Прометей в качестве базы данных временных рядов. Я хочу повторно использовать отфильтрованный ряд для оптимизации времени запроса.

Теперь у меня есть временной ряд command_stat{id="x",host="x.x.x.x"}, пример:

command_stat{id="0",host="10.x.x.1",stat="requests"}
command_stat{id="0",host="10.x.x.2",stat="requests"}
command_stat{id="1",host="10.x.x.1",stat="requests"}
command_stat{id="1",host="10.x.x.2",stat="requests"}
command_stat{id="2",host="10.x.x.1",stat="requests"}
command_stat{id="2",host="10.x.x.2",stat="requests"}
...

У меня есть около 10000 команд и около 500 идентификатора команды

Я рассчитываю общую скорость для каждого идентификатора команды, которая составляет:

sum(rate(command_stat{stat="requests"}[5m])) by (id)

И Я должен сравнить это значение со значениями в за последние 15 дней . Например, я вычислю:

sum(rate(command_stat{stat="requests"}[5m] offset 1d)) by (id)
sum(rate(command_stat{stat="requests"}[5m] offset 2d)) by (id)
sum(rate(command_stat{stat="requests"}[5m] offset 3d)) by (id)
...
sum(rate(command_stat{stat="requests"}[5m] offset 15d)) by (id)

Я также должен вычислить среднее и стандартное отклонение из 15 значений. С означает , я могу использовать avg(...) by (id) и для стандартное отклонение , я могу использовать stddev(...) by (id)

Пример для стандартное отклонение , что должно быть:

stddev (
  label_replace(sum(rate(command_stat{stat_name="requests"}[5m] offset 1d)) by (id), "time", "1d", "", ".*") or
  label_replace(sum(rate(command_stat{stat_name="requests"}[5m] offset 2d)) by (id), "time", "2d", "", ".*") or
  ...
  label_replace(sum(rate(command_stat{stat_name="requests"}[5m] offset 15d)) by (id), "time", "15d", "", ".*")
) by (id)

Время запроса слишком медленно , я хочу ускорить, проверяя только идентификатор команды с условием:

sum(rate(command_stat{stat="requests"}[5m])) by (id) > 1000

После этого условие, количество команд, которые должны быть проверены, составляет всего около 40 . Я хочу вычислить среднее и стандартное отклонение только для команд ~ 40 .

Можете ли вы помочь мне оптимизировать эту проблему? Я думаю, что мы можем повторно использовать серию command_stat после фильтрации по вышеуказанному условию.

1 Ответ

0 голосов
/ 20 февраля 2020

Я пропустил правила записи в Prometheus. Я думаю, что могу использовать эту функцию для предварительного вычисления ряда:

sum(rate(command_stat{stat="requests"}[5m])) by (id)

И тогда я могу вычислить среднее и стандартное отклонение .

Если у вас есть лучшее решение, пожалуйста, дайте мне знать, чтобы улучшить.

Спасибо!

...