Вы можете подсчитать количество временных рядов в головном блоке (последние 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, так что это совсем не быстро.
И, наконец, какой бы подход вы ни выбрали, вы, скорее всего, получите много ложных срабатываний (всякий раз, когда большая работа запускается или снимается), вплоть до того, что она не будет настолько полезной. Лично я бы не стал пытаться.