Прометей: как оценить сумму одного и того же счетчика с разных машин? - PullRequest
0 голосов
/ 08 октября 2018

У меня есть счетчик Prometheus, для которого я хочу получить его показатель в диапазоне времени (реальная цель - сумма показатель , ииногда используйте histogram_quantile для метрики гистограммы).
Однако у меня есть несколько машин, на которых выполняется такая работа, каждая из которых устанавливает свою собственную метку instance .Это приводит к тому, что различные операции 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 сущности (они могут иметь общую * 1035)* экземпляр значение или нет яnstance label):

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

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

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

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

Есть предложения?

Версия Prometheus: 2.3.2
Заранее спасибо!

1 Ответ

0 голосов
/ 04 января 2019

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

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

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

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

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

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

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

...