Короткий ответ
Counter — монотонно растущий счётчик (например, число запросов), gauge — значение, которое может расти и падать (например, текущая память), histogram — распределение значений по заранее заданным бакетам (например, latency), summary — похож на histogram, но считает квантили на стороне клиента, а не на сервере.
Как это работает подробнее
counter увеличивается только вверх и может сбрасываться в 0 при перезапуске процесса — поэтому для него используют функции rate()/increase(), а не читают "сырое" значение напрямую. Gauge — это просто текущее число без накопления. Histogram хранит несколько counter'ов-бакетов (le="0.1", le="0.5" и т.д.) плюс _sum и _count, из которых на сервере можно посчитать квантиль через histogram_quantile(). Summary считает квантили внутри клиентской библиотеки и отдаёт уже готовые значения, но их нельзя агрегировать между инстансами.
Пример кода
# Неправильно: сырое значение counter ничего не говорит о скорости
http_requests_total{service="checkout"}
# Правильно: скорость запросов в секунду за последние 5 минут
rate(http_requests_total{service="checkout"}[5m])
# Медианная latency из histogram
histogram_quantile(0.5, rate(http_request_duration_seconds_bucket{service="checkout"}[5m]))Что использовать на практике
- Практика. для latency в production почти всегда выбирают histogram, а не summary, потому что histogram-данные с разных инстансов можно просуммировать и посчитать общий квантиль, тогда как квантили из summary с разных инстансов математически не складываются. Counter используют для счётчиков запросов/ошибок, gauge — для температуры, числа соединений, размера очереди.
- Практика. Первый запрос вернёт просто текущее большое число (например, 1 500 000), а второй — величину вида 12.4, то есть реальную скорость запросов в секунду, пригодную для графика и алерта.
Подводные камни
- Частые ошибки. читать значение counter "как есть" и удивляться огромным числам без контекста времени; пытаться усреднить summary-квантили с разных подов, получая некорректный результат; забывать, что counter может обнулиться при перезапуске процесса, из-за чего
rate()на коротком окне вокруг рестарта даст временный провал, а не аномалию трафика.