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

На dashboard в Prometheus я реализовал подсчет максимальных значений за сутки в глубину за последнюю неделю с помощью следующего запроса: <br/> <br/> <blockquote>(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)</blockquote> <br/> <br/> Есть ли более элегантный способ выполнить эту задачу?
  • 21 марта 2025 г. 17:14
Ответы на вопрос 2
Да, в Prometheus есть более элегантные способы для выполнения аналогичных задач без необходимости явно указывать каждый временной смещение. Вместо того чтобы использовать несколько `max_over_time` с указанием смещений, можно воспользоваться функцией `rate` или `increase` с обобщением по времени. 

Для вашей задачи расчета суммы максимальных значений за день за последние 7 дней можно использовать следующую конструкцию:

```promql
sum(max_over_time(selection_cnt_success_by_source{source="selection_cnt_success_by_source_total"}[1d])) by (date)
```

Однако, если вам нужно именно за последние 7 дней, вы можете рассмотреть использование `time()` и `day` для деления по дням, и Aggregate-функции, такие как `avg_over_time`, `max_over_time` в сочетании с `sum`, чтобы обобщить данные за определенные временные рамки. Но, в этом случае, вы можете просто использовать `max` за 7 дней:

```promql
sum(max_over_time(selection_cnt_success_by_source{source="selection_cnt_success_by_source_total"}[1d])) by (instance)
```

Дополнительно используйте `offset` для выбора периода, который был бы нам нужен. Обратите внимание, что в Prometheus нет встроенной функции для группировки по дням, но использование `sum` или `avg` может помочь вам агрегировать данные. Если у вас есть конкретные метрики/агрегаты, которые вы хотите видеть, это можно комбинировать, используя `sum` или `avg` в зависимости от вашей задачи.

Также рассмотрите возможность использования инструментов визуализации на основе Prometheus (например, Grafana), которые могут упростить отображение данных и выполнение расчетов.
Подзапрос же: 
max_over_time(selection_cnt_success_by_source{source="selection_cnt_success_by_source_total"}[1d])[8d:1d]
Похожие вопросы