Использование метрики в правой части запроса prometheus

Я использую prometheus и grafana для мониторинга некоторых серверов. Одна из представленных мною метрик называется recent_tables, которая содержит количество ресурсов, которые были записаны в таблицы sql за последние 15 минут (машины автоматически отправляют в sql). Его ярлыки table, job и status_code. У меня также есть метрика online_assets, которая показывает количество активов, находящихся в сети. Его ярлыки - cluster_id, db_host и job.

Я пытаюсь сделать предупреждение, когда ‹90% онлайн-ресурсов в последнее время были записаны в таблицы sql. Прежде чем написать предупреждение, я пытаюсь получить панель в графане, чтобы заполнить данные и, в конечном итоге, передать это выражению в alertmanager. Следующие запросы не работают, и я не понимаю, почему:

recent_tables < online_assets * 0.9

sum(recent_tables) by (table) < online_assets * 0.9

Однако следующий запрос работает:

sum(recent_tables{table="<table>"}) - sum(online_assets)

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


person py_guy_5    schedule 15.09.2019    source источник
comment
Чтобы дать осознанный ответ, нам потребуются метки каждой метрики. Лучше всего будет образец.   -  person Michael Doubez    schedule 15.09.2019
comment
Привет, Майкл, live_assets имеют метки cluster_id, db_host и job. Бывший; live_assets{cluster_id="east", db_host="pgserver1", job="live_asset_count"} 2000. Recent_tables имеет ярлыки job, status_code и table. Бывший; recent_tables{table="user_accounts", status_code=200, job="recent_user_accounts"} 1500   -  person py_guy_5    schedule 16.09.2019
comment
AFAIS, нет возможности связать таблицу с соответствующим количеством активов. Что вы хотите сравнить и по какому параметру? Вы должны указать операторам, как сопоставлять элементы (используя ON()). И если на одной стороне больше элементов, вы должны указать это с помощью group_left или group_right.   -  person Michael Doubez    schedule 16.09.2019
comment
Вы были совершенно правы, я хотел бы проголосовать за этот ответ. Мне нужен был запрос: sum(recent_tables) by (table) - ignoring(table) group_left() sum(live_assets) * 0.9 < 0. Я уверен, что это можно упростить, но пока этого достаточно. Мне не хватало того факта, что показатели с неровными ярлыками нельзя было объединить. Спасибо!   -  person py_guy_5    schedule 18.09.2019


Ответы (1)


Как указал Майкл Дубез, при выполнении запросов нельзя допускать несбалансированных размеров меток.

В итоге я получил следующее: sum(recent_tables) by (table) - ignoring(table) group_left() sum(live_assets) * 0.9 < 0

Этим объясняется несоответствие размеров, но может быть более чистый способ.

person py_guy_5    schedule 18.09.2019