Короткий ответ
rate() возвращает среднюю скорость роста counter в секунду за указанное окно, increase() — абсолютный прирост за это же окно (фактически rate() * размер_окна_в_секундах); обе функции автоматически учитывают и компенсируют сбросы counter (например, при перезапуске процесса), но требуют именно counter, а не gauge.
Как это работает подробнее
counter может быть сброшен в 0 при перезапуске процесса; rate()/increase() обнаруживают такие "скачки назад" между соседними точками и корректно интерпретируют их как сброс, а не как отрицательный рост. increase() экстраполирует значение на весь интервал окна на основе доступных точек, что при малом количестве точек в окне (например, окно меньше scrape interval) может давать не совсем точный результат.
Пример кода
query.promql
# Средняя скорость ошибок в секунду за 5 минут
rate(http_requests_total{status=~"5.."}[5m])
# Абсолютное количество ошибок за последний час
increase(http_requests_total{status=~"5.."}[1h])Что использовать на практике
- Практика. для построения алертов и дашбордов "скорость в секунду" обычно удобнее
rate(), а для разовых отчётов "сколько всего ошибок произошло за час" —increase(). Окно должно быть минимум в 2–4 раза больше scrape interval, иначе результат становится нестабильным из-за малого числа точек для расчёта. - Практика. Если в течение часа произошло 360 ошибок равномерно,
increase(...[1h])покажет около 360, аrate(...[5m]), усреднённый по тому же часу, покажет около 0.1 ошибки/сек — оба числа взаимно согласованы (360 / 3600 сек ≈ 0.1), что можно использовать для проверки корректности запроса.
Подводные камни
- Частые ошибки. применять
rate()/increase()к gauge-метрике — функция рассчитана именно на counter с монотонным ростом и даёт некорректный результат на метрике, которая может падать; использовать слишком маленькое окно (например,[1m]при scrape interval 1 минута), получая разреженный и шумный результат из-за недостатка точек; забывать, чтоrate()уже сглаживает краткосрочные всплески внутри окна, из-за чего короткий, но серьёзный всплеск ошибок может быть "размазан" и не превысить порог алерта.