Типы метрик: counter, gauge, histogram, summary

Урок разбирает четыре типа метрик Prometheus и когда какой выбирать.

Тип метрики определяет смысл числа и то, какие операции над ним корректны: одни значения только растут, другие колеблются, третьи описывают распределение.

Выбор типа метрики — не формальность. Если перепутать counter и gauge, формулы вроде rate() дадут бессмыслицу. Разберём все четыре типа на примерах.

Counter — счётчик

Counter только растёт (и обнуляется при рестарте процесса). Им считают события: число запросов, ошибок, отправленных байт. Само значение counter малоинформативно — важна его скорость роста, которую даёт функция rate().

http_requests_total            # это counter
rate(http_requests_total[5m])  # запросов в секунду за 5 минут

Gauge — измеритель

Gauge может расти и падать. Это «мгновенное» значение: текущая температура, свободная память, число активных соединений, длина очереди.

node_memory_MemAvailable_bytes   # gauge: то растёт, то падает
queue_length                     # gauge: текущая длина очереди

Применять rate() к gauge нельзя — у него нет смысла «скорости роста счётчика».

Histogram — гистограмма

Histogram раскладывает наблюдения по корзинам (buckets) с границами. Идеален для задержек: по нему считают процентили. Под капотом histogram порождает несколько рядов: _bucket по границам, _sum и _count.

# p95 задержки по гистограмме
histogram_quantile(
  0.95,
  rate(http_request_duration_seconds_bucket[5m])
)

Summary — сводка

Summary тоже описывает распределение, но процентили считаются на стороне клиента и хранятся готовыми. Минус: такие квантили нельзя корректно агрегировать между инстансами. Поэтому для распределённых сервисов чаще выбирают histogram.

Как работает под капотом

Counter и gauge — это один ряд с одним числом. Histogram и summary «разворачиваются» в несколько рядов. Это важно для кардинальности: гистограмма с десятью корзинами и пятью лейблами создаёт куда больше рядов, чем одинокий counter.

ТипПоведениеПример
counterтолько растётчисло запросов
gaugeрастёт и падаетсвободная память
histogramкорзины наблюденийзадержка, p95
summaryготовые квантилизадержка на одном инстансе

Частые ошибки

  • Применять rate() к gauge. Скорость роста имеет смысл только для counter.
  • Брать gauge там, где нужен counter. Если значение можно «обнулить и пересчитать», вы потеряете историю событий.
  • Усреднять квантили summary между инстансами. Математически это неверно — для агрегации берите histogram.

Итог

  • Counter только растёт — смотрите его через rate().
  • Gauge колеблется — это мгновенное значение.
  • Histogram даёт процентили через histogram_quantile(); summary считает их на клиенте.
Проверьте себя
1. Какой тип метрики только растёт?
Agauge
Bcounter
Chistogram
Dsummary
2. Чем gauge отличается от counter?
AGauge только растёт
BGauge может и расти, и падать — это мгновенное значение
CGauge нельзя визуализировать
DGauge хранит строки
3. Почему для процентилей задержки в распределённом сервисе предпочитают histogram, а не summary?
AHistogram быстрее пишется
BКорзины histogram можно агрегировать между инстансами, а готовые квантили summary — нет
CSummary не поддерживает задержку
DHistogram занимает меньше места