Promethius, group_left и "on" против "ignoring"

В Issue #2204 один из разработчиков Prometheus говорит:

...в принципе, вы должны отдавать предпочтение ignoring перед on для создания общих разделяемых правил...

Я не понимаю, как использование игнорирования приведет к более общим правилам. Например, рассмотрим ситуацию, когда у нас есть одна метрика "info" для устройства и несколько статистик, как например:

device_info{id="1", owner="coyote", project="acme"}
device_rx_bytes{id="1"}
device_tx_bytes{id="1"}
device_rx_errors{id="1"}
device_tx_errors{id="1"}

Если я хочу получить скорость получения по проекту, мне нужно будет соотнести метрику device_rx_bytes с соответствующей метрикой device_info. Для меня это похоже на SQL join, и я бы написал:

rate(device_rx_bytes[5m]) * on(id) group_left(project) device_info

Это кажется "общим" в том смысле, что он делает предположения только о метке, используемой для группировки (id) и метке, которую мы хотим распространить на наши результаты (project). Если я правильно понимаю оператор ignoring, соответствующее выражение будет более сложным, потому что мне нужно будет перечислить все метки из правой части, которые не существуют в левой части. Что-то вроде:

rate(device_rx_bytes[5m]) * ignoring(owner, project) group_left(project) device_info

Правильно ли это? И если да, то почему ignoring предпочтительнее, чем on (не только в цитате выше, но и в различных документах и примерах)?

.
1
задан 5 March 2020 в 13:49
1 ответ

Я думаю, что ключевое слово в этом комментарии — общедоступные или, другими словами, повторно используемые правила. Это означает, что вы (часто) сохраняете больше меток при использовании игнорирования по сравнению с на, и результаты будут (обычно) правилом с большим количеством исходных меток, оставленных нетронутыми, поэтому его можно использовать повторно. для большего количества сценариев.

Представьте себе эти временные ряды:

instance_cpu_time_ns{app="lion", proc="web", rev="34d0f99", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="elephant", proc="worker", rev="34d0f99", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="turtle", proc="api", rev="4d3a513", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="fox", proc="widget", rev="4d3a513", env="prod", job="cluster-manager"}
...

Запрос с ignoring(rev) не учитывает все остальные ярлыки в результате по сравнению с тем же запросом с on(app) .

Но результат на и игнорирования будет идентичным, если вы используете их с взаимоисключающим набором меток, как в примере, который вы упоминаете.

1
ответ дан 5 September 2020 в 21:27

Теги

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