В 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
(не только в цитате выше, но и в различных документах и примерах)?
Я думаю, что ключевое слово в этом комментарии — общедоступные
или, другими словами, повторно используемые правила. Это означает, что вы (часто) сохраняете больше меток при использовании игнорирования
по сравнению с на
, и результаты будут (обычно) правилом с большим количеством исходных меток, оставленных нетронутыми, поэтому его можно использовать повторно. для большего количества сценариев.
Представьте себе эти временные ряды:
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)
.
Но результат на
и игнорирования
будет идентичным, если вы используете их с взаимоисключающим набором меток, как в примере, который вы упоминаете.