Задать вопрос
drno-reg
@drno-reg
см не кратко

Если ли более изящный способ вычисления суммы максимальных значений за день в ретроспективе 1 месяц?

На dashboard в prometheus сделал подсчет максимальных значений за сутки в глубине за неделю

(selection_cnt_success_by_source{source="selection_cnt_success_by_source_total"}[1d] offset 1d)+max_over_time(selection_cnt_success_by_source{source="selection_cnt_success_by_source_total"}[1d] offset 2d)+max_over_time(selection_cnt_success_by_source{source="selection_cnt_success_by_source_total"}[1d] offset 3d)+max_over_time(selection_cnt_success_by_source{source="selection_cnt_success_by_source_total"}[1d] offset 4d)+max_over_time(selection_cnt_success_by_source{source="selection_cnt_success_by_source_total"}[1d] offset 5d)+max_over_time(selection_cnt_success_by_source{source="selection_cnt_success_by_source_total"}[1d] offset 6d)+max_over_time(selection_cnt_success_by_source{source="selection_cnt_success_by_source_total"}[1d] offset 7d)


возможно ли это сделать каким-то более изящным способом?
  • Вопрос задан
  • 2191 просмотр
Подписаться 5 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
chupasaurus
@chupasaurus
Сею рефлекторное, злое, временное
Подзапрос же:
max_over_time(selection_cnt_success_by_source{source="selection_cnt_success_by_source_total"}[1d])[8d:1d]
Ответ написан
zamboga
@zamboga
Аналитика данных, BI-аналитика, дашборды
Да. Go на https://chat.deepseek.com (доступен в РФ без танцев с бубнами) и туда просто скопируйте ваш запрос.
К сожалению, на дипсике нельзя расшарить чат, как на чатгпт, а копипаст всего ответа без разметки выглядит ужасно.

spoiler

Да, в Prometheus есть более изящный способ вычисления суммы максимальных значений за день за последний месяц. Вместо ручного перечисления всех смещений (offset) вы можете использовать функцию sum() в комбинации с max_over_time() и временным диапазоном.

Для суммы максимумов за 7 дней (как в вашем примере) можно использовать:

sum(
max_over_time(
selection_cnt_success_by_source{source="selection_cnt_success_by_source_total"}[1d]
offset 1d:7d
)
)
А для месяца (30 дней) можно сделать так:

sum(
max_over_time(
selection_cnt_success_by_source{source="selection_cnt_success_by_source_total"}[1d]
offset 1d:30d
)
)
Этот синтаксис использует "подзапрос с диапазоном" (subquery range), где:

[1d] - размер окна для max_over_time

offset 1d:30d означает "от 1 дня до 30 дней назад" с шагом по умолчанию (равным размеру окна, т.е. 1 день)

Такой подход:

Более компактный и читаемый

Легко масштабируется на любой период

Избегает дублирования кода

Автоматически включает все дни в указанном диапазоне

Примечание: Если вам нужно исключить текущий день (как в вашем исходном запросе, где начинаете с offset 1d), используйте offset 1d:30d. Если нужно включить текущий день, используйте offset 0d:30d.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы