Прометей: как оценить сумму одного и того же счетчика с разных машин?

У меня есть счетчик Prometheus, для которого я хочу получить его показатель во временном диапазоне (реальная цель - суммировать показатель, а иногда использовать его для его гистограммы для метрики гистограммы).
Однако у меня есть несколько машин, выполняющих такую ​​работу, каждая из которых устанавливает свою собственную меткуэкземпляра. Это приводит к тому, что разные операции inc над этим счетчиком на разных машинах создают разные объекты счетчика, поскольку комбинация значений меток является уникальной.
Проблема в том, чтоrate() работает отдельно для каждого такого счетчика.
В результате встречные объекты с уникальными комбинациями не учитываются дляrate().
Например, если у меня есть:

mycounter{aaa="1",instance="1.2.3.4:6666",job="job1"} value: 1
mycounter{aaa="2",instance="1.2.3.4:6666",job="job1"} value: 1
mycounter{aaa="2",instance="1.2.3.4:7777",job="job1"} value: 1
mycounter{aaa="1",instance="5.5.5.5:6666",job="job1"} value: 1

Все счетчики являются уникальными, поэтому они получают значения 1.
Если метки счетчика всегда уникальны (поступают с разных машин), то дляпоказателя rate(mycounter[5m]) в этом случае будут получены значения 0, а для sum(rate(mycounter[5m]))) будет 0, а это не то, что мне нужно!
Я хочу игнорировать метку экземпляра, чтобы она ссылалась на эти операции mycounter inc, как они были сделаны на одном и том же объекте счетчика.
Другими словами, я ожидаю иметь только 2 объекта (они могут иметь общее значение экземпляра или не иметь метки экземпляра):

mycounter{aaa="1", job="job1"} value: 2
mycounter{aaa="2", job="job1"} value: 2

В таком случае операция inc на новой машине (с существующим значением aaa) увеличит счетчик некоторой сущности вместо добавления новой сущности со значением 1, а rate() получит реальные ставки для каждого, поэтому мы можем суммировать () их. Как я могу это сделать?

Я сделал несколько попыток, чтобы решить это, но все не удалось:

  • Делать рейтинг () суммы () - не удается из-за несоответствия типов...
  • Удаление автоматической метки экземпляра с использованием metric_relabel_configswork с действием: labeldrop в конфигурации, но затем оно назначает значение адреса по умолчанию.
  • Изменение всех значений экземпляров на общие с использованием metric_relabel_configswork с заменой, но, похоже, одна из сущностей перезаписывает все остальные, поэтому это не помогает...

Какие-либо предложения?

Версия Прометея: 2.3.2
Заранее спасибо!

2 ответа

Вам лучше выставить свои счетчики на 0 при запуске приложения, если другие метки (aaaи т. д.) имеют ограниченный набор возможных комбинаций. Сюда rate() функция работает правильно на нижнем уровне и sum() даст вам правильные результаты.

Если вам нужно сделать rate() из sum()сначала прочтите это:

Обратите внимание, что при объединении rate() с оператором агрегирования (например, sum()) или функция, агрегирующая по времени (любая функция, оканчивающаяся на _over_time), всегда бери rate() сначала, потом совокупность. Иначе rate() не может обнаружить сброс счетчика, когда ваша цель перезапускается.

Если вы можете допустить это (или счетчики сброса экземпляров одновременно), есть способ обойти это. Определите правило записи как

record: job:mycounter:sum expr: sum without(instance) (mycounter)

и тогда это выражение работает:

sum(rate(job:mycounter:sum[5m]))

Очевидный запрос rate(sum(...))не будет работать в большинстве случаев, так как в результате sum(...)может скрыть возможные сбросы на ноль для отдельных временных рядов, которые передаются в sum. Поэтому обычно правильный ответ - использовать sum(rate(...))вместо. Подробнее см. в этой статье .

К сожалению, Prometheus может пропустить некоторые увеличения для медленно меняющегося счетчика при расчете. rate()как показано в исходном вопросе выше. То же самое относится к increase()расчеты. Подробнее см. в этом выпуске , в этом комментарии и в этой статье . Разработчики Prometheus собираются исправить эти проблемы — см. этот дизайн-документ .

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

Другие вопросы по тегам