Мониторинг и предупреждение аномалии прометея в количестве метрик
У нас есть несколько серверов Prometheus, каждый из которых контролирует свой собственный регион (фактически 2 на регион), также есть серверы Тано, которые могут запрашивать несколько регионов, и мы также используем alertmanager для оповещения.
В последнее время у нас возникла проблема, из-за которой несколько метрик перестали сообщаться, и мы обнаружили ее только тогда, когда нам были нужны метрики. Мы пытаемся выяснить, как отслеживать изменения количества сообщаемых показателей в масштабируемой системе, которые растут и уменьшаются по мере необходимости.
Я буду рад вашему совету.
1 ответ
Вы можете подсчитать количество временных рядов в головном блоке (последние 0-2 часа) или скорость, с которой вы принимаете образцы:
prometheus_tsdb_head_series
или же
rate(prometheus_tsdb_head_samples_appended_total[5m])
Затем вы сравниваете указанное значение с самим собой несколько минут / часов назад, например
prometheus_tsdb_head_series / prometheus_tsdb_head_series offset 5m
и посмотрите, соответствует ли он ожидаемому диапазону (скажем, 90-110%), и предупредите об обратном.
Или вы можете посмотреть на показатели с наивысшей кардинальностью:
topk(100, count({__name__=~".+"}) by (__name__))
Обратите внимание, что это последнее выражение может быть довольно дорогостоящим для вычисления, поэтому вы можете его избежать. Плюс сравнение с 5 минутами назад не будет таким простым:
label_replace(topk(100, count({__name__=~".+"}) by (__name__)), "metric", "$1", "__name__", "(.*)")
/
label_replace(count({__name__=~".+"} offset 5m) by (__name__), "metric", "$1", "__name__", "(.*)")
Вам нужно label_replace
там, потому что соответствие для деления делается на этикетках, кроме __name__
, Вычисление этого последнего выражения занимает ~10 секунд на моем экземпляре Prometheus с серией 150k, так что это совсем не быстро.
И, наконец, какой бы подход вы ни выбрали, вы, скорее всего, получите много ложных срабатываний (всякий раз, когда большая работа запускается или снимается), вплоть до того, что она не будет такой уж полезной. Я бы лично не стал пытаться.